Convertisseur romain [Résolu]

Tavarez59282 13 Messages postés jeudi 28 avril 2005Date d'inscription 20 janvier 2007 Dernière intervention - 9 mai 2005 à 12:24 - Dernière réponse : cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention
- 10 mai 2005 à 19:53
Bonjour je suis étudiant en licence informatique première année et on nous a donné un sujet que je ne comprend pas très bien. Voilà on doit taper un sous programme qui convertit des chiffres romains en décimales. Le problèmes c'est qu'on ne peut ni utiliser de chaines, ni de tableaux mais uniquement des variables et une boucle "tant que". De plus le chiffre romain entré doit tenir sur une seule ligne, en gros une seule entrée et le programme doit le ressortir en decimale, pas d'étapes intermédiaires. Donc voila si quelqu'un peut m'aider s'il vous plait ce serait sympa .
Merci d'avance!
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Tavarez59282 13 Messages postés jeudi 28 avril 2005Date d'inscription 20 janvier 2007 Dernière intervention - 9 mai 2005 à 14:51
3
Merci
Ca m'aide un peu ce que tu m'écris mais je comprend pas tout si tu veux je vais t'envoyer l'énoncé tel qu'il est et si ça t'inspire quelque chose dis le moi:

Ecrire et mettre au point un programme qui accepte un nombre donné en chiffres romains et affiche la valeur décimale correspondante. On supposera que l'entrée tiendra sur une seule ligne ne contenant qu'un seul nombre en chiffres romains, bien formé et plus petit que 8999. Pour faciliter la mise au point, le programme invitera à entrer une valeur et affichera le résultat.

Après y'a des histoires de préfixe mais ça je sais comment faire c'est pas trop dur...je demande pas non plus qu'on le fasse a ma place mais juste le fil conducteur car là je suis bien perdu lol. Ce qui me pose le plus de problèmes c'est qu'avec des variables on doit faire tenir le chiffre romain sur une seule ligne!

Merci d'avance!

Merci Tavarez59282 3

codes-sources a aidé 87955 internautes ce mois-ci

Commenter la réponse de Tavarez59282
BunoCS 13844 Messages postés lundi 11 juillet 2005Date d'inscription 24 mai 2018 Dernière intervention - 9 mai 2005 à 14:00
0
Merci
Salut!

En fait, c'est pas super difficile, en supposant que l'utilisateur ne fait pas de faute de frappes.
Il te faut 2 int (NombreGlobal qui contient la valeur décimale et DecimalCourant qui contient ce que l'utilisateur à taper), un char (Caractere qui contient le caractère donné par l'utilisateur), la fonction getchar() et une boucle while().

Voici en gros l'agorithme à mettre en oeuvre:

NombreGlobal=0;
DecimalCourant=0;

// boucle sur les caractères lus juqu'à un caractère de sortie
while(Caractere=getchar() != SORTIE)
{
// test de la validité du caractère
if ( (Caractere != 'V') ...)
return code_erreur;

// ici, nous avons un chiffre romain dans Caractere
// il faut le traduire en décimales (avec un switch par exemple)
DecimalCourant=ConvertChiffreRomain(Caractere);

// Mise à jour du nombre entré
NombreGlobal = ...
}

// affichage du nombre

En gros, ça ressemble à ça....

@+

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
BunoCS 13844 Messages postés lundi 11 juillet 2005Date d'inscription 24 mai 2018 Dernière intervention - 9 mai 2005 à 15:24
0
Merci
Ok. En gros, ce que j'ai compris:
- l'utilisateur entre un chiffre romain: "XIV" et valide par ENTREE
- ensuite, tu affiche le résultat sous forme décimale

L'algo précédent boucle sur getchar(), te permettant ainsi t'attendre que l'utilisateur appuie sur une touche. A chaque passage, tu reçois un caractère ('X', 'I' et 'V' ici) que tu dois convertir en décimal (=faire une correspondance entre 'I' et 1, 'V' et 5...). Une fois que tu as le décimal, il faut calculer le nombre résultat pour avoir ceci:
- 1er passage: 'X' --> NombreGlobal = 10- 2e passage: 'I' --> NombreGlobal 10+1 11- 3e passage 'V' --> NombreGlobal 11+3 14
- 4e passage: ENTREE --> sortie du programme et affichage de la valeur décimale.

Tu vois ce que je veux dire?

Attention, il te faudra surement une variable contenant le(s) caractère(s) précédent(s) pour gérer les caractères du style IV par exemple.

Quant à l'affichage du chiffre romain, tu n'as pas à le faire (étant donné que c'est la fenêtre de commandes qui le fait). Concernant l'affichage du résultat, un simple printf ou un cout devrait suffire.

Si t'as d'autres soucis, n'hésites pas.

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Tavarez59282 13 Messages postés jeudi 28 avril 2005Date d'inscription 20 janvier 2007 Dernière intervention - 9 mai 2005 à 15:57
0
Merci
J'ai tapé ça, j'ai oublié de te préciser qu'on ne se sert jamais de getchar() en cour donc si je l'utilise vais me faire tirer les oreilles . Par contre la il veut pas compiler si tu vois l'erreur dis le moi stp car je trouve pas. C'est la dernière fois que je t'embete. Merci encore

#include<stdio.h>
#define F
#define M
#define D
#define C
#define L
#define X
#define V
#define I



conv_var()
{int d; char r,E,pr;
while((d<=8999)&&(r!=E))
{pr=E;
scanf("%d",&r);
switch(r) {
case F :
{if(pr==M){d=d+4000;else d=d+5000;pr=F;}
case M :
{if(pr==C){d=d+900;else d=d+1000;pr=M;}
case 'D' :
{if(pr==C){d=d+400;else d=d+500;pr=D;}
case 'C' :
{if(pr==X){d=d+90;else d=d+100;pr=C;}
case 'L' :
{if(pr==X){d=d+40;else d=d+50;pr=L;}
case 'X' :
{if(pr==I){d=d+9;else d=d+10;pr=X;}
case 'V' :
{if(pr==I){d=d+4;else d=d+5;pr=V;}
case 'I' :
{d=d+1;pr=I;}

}
return d;
}


main()


{
printf("Entrez votre chiffre romain, entrez E pour terminer:\n");
conv_var();
}
Commenter la réponse de Tavarez59282
BunoCS 13844 Messages postés lundi 11 juillet 2005Date d'inscription 24 mai 2018 Dernière intervention - 9 mai 2005 à 16:32
0
Merci
Mes impressions (je n'ai pas testé ton code):
- tes define ne sont pas nécessaires, surtout si tu ne leur attribue pas de valeur .

- pour chaque comparaison/manipulation/affectation de caractères, n'oublie pas les simples quotes: 'a', 'b', etc... ainsi que dans les case (case F à remplacer par case 'F').

- quand tu fais scanf, tu récupère le caractère entré par l'utilisateur et non un entier. Donc, il faut faire scanf("%c", &r) (et non %d).

- à la fin de chaque case (sauf le dernier), ne pas oublier de mettre un break!!! Sinon, le prog va passer dans tous tes cas...

- j'ai pas bien compris: ton E signifie la variable de sortie ou le caractère 'E' ??? Attention...

- initialise ta variable d=0 sinon, tu ne peux pas prévoir ce que fais d=d+1 au 1er passage

- à la fin de ton programme, tu pourrais afficher le nombre décimal... tu t'es donné assez de mal pour le faire lol

Regarde déjà ça. Si ça ne marche toujours pas... bah... envoi un post

Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Tavarez59282 13 Messages postés jeudi 28 avril 2005Date d'inscription 20 janvier 2007 Dernière intervention - 9 mai 2005 à 18:39
0
Merci
Mon prog marche mais je peux rentrer n'importe quoi il me renvoie toujours 2 c'est bizarre je l'ai revu et corrigé selon tes conseils pourtant .
Voilà ce que ça donne:

#include<stdio.h>


conv_var(int d)
{
char r,pr;d=0;
while(d<=8999)
{pr=0;
scanf("%c",&r);
if((r='F')||(r='M')||(r='D')||(r='C')||(r='L')||(r='X')||(r='V')||(r='I'))
{switch(r){
case 'F' :
{if(pr=='M'){d=d+4000;}else {d=d+5000;};pr='F';}
break;
case 'M' :
{if(pr=='C'){d=d+900;}else {d=d+1000;};pr='M';}
break;
case 'D' :
{if(pr=='C'){d=d+400;}else {d=d+500;};pr='D';}
break;
case 'C' :
{if(pr=='X'){d=d+90;}else {d=d+100;};pr='C';}
break;
case 'L' :
{if(pr=='X'){d=d+40;}else {d=d+50;};pr='L';}
break;
case 'X' :
{if(pr=='I'){d=d+9;}else {d=d+10;};pr='X';}
break;
case 'V' :
{if(pr=='I'){d=d+4;}else {d=d+5;};pr='V';}
break;
case 'I' :
{d=d+1;pr='I';}


}
return d;}else{printf("Erreur ce chiffre romain n'existe pas\n");}
}
}
main()


{ char F,M,D,C,L,X,V,I;
int d;
printf("Entrez votre chiffre romain:\n");
conv_var(d);
printf("Le chiffre est %d", d);
}

Voilà si tu trouves d'où ça peut venir, sinon le prog compile donc merci des conseils et merci pour tout
Commenter la réponse de Tavarez59282
cs_Matt67 554 Messages postés samedi 6 septembre 2003Date d'inscription 6 mars 2010 Dernière intervention - 9 mai 2005 à 22:27
0
Merci
Bonsoir,



J'ai mis tout les cas même ceux qui ne sont pas utilisé.

Par exemple 49 ne s'ecrit pas IC mais XLIX, mais le convertisseur
marche pour les deux cas, à toi de le modifier pour verifier les
entrées, les combinaisons possibles ...
(Je pense que l'on peut optimiser tout cela, si quelqu'un a le courage)



#include <stdio.h>



int main()

{

char szChaineRomaine[50];

char *c;

int iDec = 0;

char cPrecedent = 'A';



printf("Entrez un nombre romain : ");

fgets(szChaineRomaine, 49, stdin);



c = szChaineRomaine;

while(*c != '\n')

{

switch(*c)

{

case 'M':

if(cPrecedent == 'D')

iDec = iDec;

else if(cPrecedent == 'C')

iDec = iDec + 800;

else if(cPrecedent == 'L')

iDec = iDec + 900;

else if(cPrecedent == 'X')

iDec = iDec + 980;

else if(cPrecedent == 'V')

iDec = iDec + 990;

else if(cPrecedent == 'I')

iDec = iDec + 998;

else

iDec = iDec + 1000;

cPrecedent = 'M';

break;



case 'D':

if(cPrecedent == 'C')

iDec = iDec + 300;

else if(cPrecedent == 'L')

iDec = iDec + 400;

else if(cPrecedent == 'X')

iDec = iDec + 480;

else if(cPrecedent == 'V')

iDec = iDec + 490;

else if(cPrecedent == 'I')

iDec = iDec + 498;

else

iDec = iDec + 500;

cPrecedent = 'D';

break;



case 'C':

if(cPrecedent == 'L')

iDec = iDec;

else if(cPrecedent == 'X')

iDec = iDec + 80;

else if(cPrecedent == 'V')

iDec = iDec + 90;

else if(cPrecedent == 'I')

iDec = iDec + 98;

else

iDec = iDec + 100;

cPrecedent = 'C';

break;



case 'L':

if(cPrecedent == 'X')

iDec = iDec + 30;

else if(cPrecedent == 'V')

iDec = iDec + 40;

else if(cPrecedent == 'I')

iDec = iDec + 48;

else

iDec = iDec + 50;

cPrecedent = 'L';

break;



case 'X':

if(cPrecedent == 'V')

iDec = iDec;

else if(cPrecedent == 'I')

iDec = iDec + 8;

else

iDec = iDec + 10;

cPrecedent = 'X';

break;



case 'V':

if(cPrecedent == 'I')

iDec = iDec + 3;

else

iDec = iDec + 5;

cPrecedent = 'V';

break;



case 'I':

iDec = iDec + 1;

cPrecedent = 'I';

break;



}

c++;

}

*c='\0';

printf("\n");

printf("Le nombre romain %s.\nLe nombre decimal %d.\n\n", szChaineRomaine, iDec);

return 0;

}





Bonne soirée,
Matt...
Commenter la réponse de cs_Matt67
Tavarez59282 13 Messages postés jeudi 28 avril 2005Date d'inscription 20 janvier 2007 Dernière intervention - 10 mai 2005 à 19:47
0
Merci
Merci Matt mais le problème c'est que j'avais pas le droit d'utiliser de chaine mais bon le programme est un peu semblable à ce que j'ai fait dc c'est bon signe merci
Commenter la réponse de Tavarez59282
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 10 mai 2005 à 19:53
0
Merci
Bé tu sais t'as pas trop le choix pour les chaînes de caractères...
Rien que l'entrée de l'utilisateur c'est une chaine.
Donc à partir de la lol...


void Aurevoir( void ); //Bonne journée
Commenter la réponse de cs_Joky

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.