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
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

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
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
0