Aide c++
Fermé
jackos26
Messages postés
1
Date d'inscription
dimanche 30 novembre 2008
Statut
Membre
Dernière intervention
30 novembre 2008
-
30 nov. 2008 à 18:27
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 1 déc. 2008 à 00:43
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 1 déc. 2008 à 00:43
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
1 déc. 2008 à 00:43
1 déc. 2008 à 00:43
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 :
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 :
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 :
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 :
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 :
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
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