Aide c++
Bonjour,
je suis dans une panique totaloe,
je dois faire un programme en c++ qui converti des nombres en chiffres romains, exemple 38 s'ecrira XXXVIII
merci beaucoup pour votre aide !!!
c'est tres urgent
je suis dans une panique totaloe,
je dois faire un programme en c++ qui converti des nombres en chiffres romains, exemple 38 s'ecrira XXXVIII
merci beaucoup pour votre aide !!!
c'est tres urgent
Configuration: Windows XP Internet Explorer 7.0
1 réponse
-
Ben oui mais tu comprendras qu'on ne peut pas faire ton exercice à ta place. Je vais donc te donner la piste pour démarrer, et ensuite tu me montres ce que tu as fait.
Comme tu le sais un programme en C/C++ débute dans une fonction main (qui retourne 0 si tout va bien et un code d'erreur sinon). Ici on utilisera aussi une fonction supplémentaire que je vais noter f, et qui sera appelée par notre fonction main :#include <iostream> #include <sstream> void f(unsigned x,char a,char b,char c)){ // on va compléter ici } int main(){ // on va compléter ici return 0; }
1) Commence par lire sur std::cin (opérateur >>) le chiffre à convertir et stocke le dans un unsigned int noté "nombre".
2) Mets-le dans un std::ostringstream (opérateur >>) pour en faire un std::string qu'on va par exemple noter "s". Si tu ne sais pas utiliser un std::ostringstream et des std::string lis-ceci au préalable :
http://www.cplusplus.com/reference/sstream/ostringstream/ostringstream/
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
Grâce à cette std::string (que tu peux voir comme un char * amélioré) on peut facilement extraire :
- le chiffre au rang "i" (i allant de 0 pour le premier chiffre à s.length() - 1) avec l'opérateur [ ] (par exemple si s=="421", alors s[0] == 4 ; s[1] = 2 ; s.lenght() == 3)
- la longueur de la chaîne, à partir de laquelle on saura si il faut utiliser des X, des V des I etc...
3) Parcours ta chaîne s avec une boucle for :for(unsigned i=0;i<s.length();++i){ ... }
4) Maintenant on va compléter l'intérieur de cette boucle. Tu peux commencer par extraire le ième chiffre de s dans x avec la fonction atoi :unsigned x = atoi(s[i]);
Pour compter en romain on sait que :
- les unités utilisent les caractères I,V,X (rang i = s.length() - 1)
- les dizaines utilisent les caractères X,L,C (rang i = s.length() - 2)
etc...
Selon le rang, je peux donc appeler une fonction f() en lui passant en paramètre les bons caractères romains.
Par exemple, supposons que je note a=I, b=V, c=X pour le rang des unités, a=X, b=K, c=C pour le rang des dizaines etc... Selon la valeur du chiffre des unités (des dizaines etc...) je sais que le chiffre romain correspondant s'écrit sous la forme :1 => a 2 => aa 3 => aaa 4 => ab 5 => b 6 => ba 7 => baa 8 => baaa 9 => ac
Il suffit donc d'écrire une fonction f qui va prendre en paramètre ces trois caractères a, b, c, et la valeur du chiffre 'x' à convertir :void f(unsigned x,char a,char b,char c)){ switch(x){ case 1: std::cout << a; break; // a case 2: std::cout << a << a; break; // aa //... case 9: std::cout << a << c; break; // ac default: throw; } }
5) Tu l'auras compris il suffit d'appeler f avec les bons caractères dans la boucle for : en fonction de la valeur de i je sais si le triplet (a,b,c) est (I,V,X), (X,L,C) ... Il faut donc ajouter entre le début de ta boucle for et l'appel à f un test pour initialiser correctement a,b, et c.
Bonne chance