conversion chiffre en lettre

conversion chiffre en lettre - C - Programmation

Marsh Posté le 31-05-2008 à 13:36:28    

Slt ,voici un programme que j'ai eu sur le net qui était ecris en c++ et que moi j'ai traduit en C.Lors de l'éxécution de ce programme il m'affiche toujours :En lettre çe fait:ZERO ;
voici le code:

Code :
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<string.h>
  4. #include<iostream.h>
  5. void chiffreenlettre(int *,char *c);
  6. int main()
  7. { clrscr();
  8.    int x=0;
  9.    char choix='o',c[256];
  10.    while(choix=='o'||choix=='O')
  11.     { printf("\nINTRODUIRE UN ENTIER:" );
  12.       scanf("%d",&x);
  13.       chiffreenlettre(&x,c);
  14.       printf("\nEN LETTRE CA FAIT:%s",c);
  15.       printf("\nENCORE D'AUTRE?(O/N)" );
  16.       choix=getche();
  17.       printf("\n====================================" );
  18.     }
  19.   getch();
  20. return 0;
  21. }
  22. void chiffreenlettre(int *chiffre,char *lettre)
  23. { int centaine,dizaine,unite,reste,y;
  24.    int trouve=0,i;
  25.    strcpy(lettre,"" );
  26.    reste=*chiffre;
  27.    for(i=1000000000;i>=1;i/=1000)
  28.     { y=reste/i;
  29.       if(y!=0)
  30.        { centaine=y/100;
  31.  dizaine=(y-centaine*100)/10;
  32.  unite=y-(centaine*100)-(dizaine*10);
  33.      switch(centaine)
  34.       { case 0:break;
  35.  case 1:strcat(lettre,"cent" );break;
  36.  case 2:if(dizaine==0&&unite==0) strcat(lettre,"deux cents" );
  37.   else strcat(lettre,"deux cent" );break;
  38.  case 3:if(dizaine==0&&unite==0) strcat(lettre,"trois cents" );
  39.   else strcat(lettre,"trois cent" );break;
  40.  case 4:if(dizaine==0&&unite==0) strcat(lettre,"quatre cents" );
  41.   else strcat(lettre,"quatre cent" );break;
  42.  case 5:if(dizaine==0&&unite==0) strcat(lettre,"cinq cents" );
  43.   else strcat(lettre,"cinq cent" );break;
  44.  case 6:if(dizaine==0&&unite==0) strcat(lettre,"six cents" );
  45.   else strcat(lettre,"six cent" );break;
  46.  case 7:if(dizaine==0&&unite==0) strcat(lettre,"sept cents" );
  47.   else strcat(lettre,"sept cent" );break;
  48.  case 8:if(dizaine==0&&unite==0) strcat(lettre,"huit cents" );
  49.   else strcat(lettre,"huit cent" );break;
  50.  case 9:if(dizaine==0&&unite==0) strcat(lettre,"neuf cents" );
  51.   else strcat(lettre,"neuf cent" );break;
  52.       }
  53.   switch(dizaine)
  54.    { case 0:break;
  55.      case 1:trouve=1; break;
  56.      case 2:strcat(lettre,"vingt" );break;
  57.      case 3:strcat(lettre,"trente" );break;
  58.      case 4:strcat(lettre,"quarante" );break;
  59.      case 5:strcat(lettre,"cinquante" );break;
  60.      case 6:strcat(lettre,"soixante" );break;
  61.      case 7:trouve=1;strcat(lettre,"soixante" );break;
  62.      case 8:strcat(lettre,"quatre-vingt" );break;
  63.      case 9:trouve=1;strcat(lettre,"quatre-vingt" );
  64.    }
  65.   switch(unite)
  66.    { case 0:if(trouve) strcat(lettre,"dix" );break;
  67.      case 1:if(trouve) strcat(lettre,"onze" );
  68.      else strcat(lettre,"un" );break;
  69.      case 2:if(trouve) strcat(lettre,"douze" );
  70.      else strcat(lettre,"deux" );break;
  71.      case 3:if(trouve) strcat(lettre,"treize" );
  72.      else strcat(lettre,"trois" );break;
  73.      case 4:if(trouve) strcat(lettre,"quatorze" );
  74.      else strcat(lettre,"quatre" );break;
  75.      case 5:if(trouve) strcat(lettre,"quinze" );
  76.      else strcat(lettre,"cinq" );break;
  77.      case 6:if(trouve) strcat(lettre,"seize" );
  78.      else strcat(lettre,"six" );break;
  79.      case 7:if(trouve) strcat(lettre,"dix-sept" );
  80.      else strcat(lettre,"sept" );break;
  81.      case 8:if(trouve) strcat(lettre,"dix-huit" );
  82.      else strcat(lettre,"huit" );break;
  83.      case 9:if(trouve) strcat(lettre,"dix-neuf" );
  84.      else strcat(lettre,"neuf" );break;
  85.    }
  86.   switch(i)
  87.    { case 1000000000:if(y>1) strcat(lettre,"milliards" );
  88.        else strcat(lettre,"milliard" );break;
  89.      case 1000000:if(y>1) strcat(lettre,"millions" );
  90.     else strcat(lettre,"million" );
  91.      case 1000: strcat(lettre,"mille" );
  92.    }
  93.        }
  94. reste-=y*i;
  95. trouve=0;
  96.    }
  97.    if(strlen(lettre)==0) strcpy(lettre,"ZERO" );
  98. }


 
 
 
SVP aidez moi je dois utiliser ce code dans un TP de mon prof.
 D'avance merci!


Message édité par gilou le 31-05-2008 à 17:58:18
Reply

Marsh Posté le 31-05-2008 à 13:36:28   

Reply

Marsh Posté le 31-05-2008 à 17:33:47    

Il manque quelques instructions break, mais cela n'explique pas le zéro.
Si c'est un programme 16-bit, alors un entier signé doit être inférieur à deux puissance quinze.
A part ça, j'ai fait un test chez moi avec x=12345; et ça marche.
 
N.B. Sur ce forum, il faudrait mettre le programme entre deux balises [code ] et [/code] pour que cela soit plus lisible.
En C, on a l'habitude de placer le main() à la fin.
Le nom des variables est mal choisi, ce qui rend la lecture difficile. Par exemple le nom c est habituellement utilisé pour un simple caractère, pas pour une chaine de cararctères. Pour celle-ci on usilisera plus volontiers s. Mais de toutes manières, les noms de variables trop courts ne sont pas à conseiller. Le nom "lettre" peut faire penser à une seul lettre au lieu d'un ensemble de lettres. Pour chiffre on s'attend aussi à un seul chiffre au lieu d'un nombre. A la place, on aurait put choisir num_int et num_str.
Il est recommandé de mettre des espaces autour du signe moins pour éviter que l'on pense qu'il y aurait une variable contenant un tiret au lieu de voir un signe moins entre deux variables. Il est recommandé de mettre un espace après chaque virgule et après chaque point virgule, comme on le fait en français. En graphologie, ceux qui écrivent très serré sont considérés comme étant des radins. Il vaut mieux être un peu généreux.
Au lieu de passer x par adresse, il aurait été préfèrable de la passer par valeur, car sinon on s'attend à ce qu'il soit modifié, ce qui n'est pas le cas.
Il faudrait mieux indenter le programme.


Message édité par olivthill le 31-05-2008 à 17:34:09
Reply

Marsh Posté le 31-05-2008 à 17:59:45    

Citation :

SVP aidez moi je dois utiliser ce code dans un TP de mon prof.

Et il est demandé quoi exactement dans ton TP?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-05-2008 à 18:27:39    

gilou a écrit :

Citation :

SVP aidez moi je dois utiliser ce code dans un TP de mon prof.

Et il est demandé quoi exactement dans ton TP?
A+,


A copier-coller un code tout fait sur internet  [:petrus75]

Reply

Marsh Posté le 31-05-2008 à 18:55:58    

Voila, parce que la solution donnée la est loin d'être optimale, sauf si on a en entrée une donnée numérique. Mais si on demande a rentrer la valeur a un utilisateur, il est bien plus simple de garder le tout comme une chaine composée de chiffres, et de traiter le tout par bloc de 3 chiffres.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 12-06-2008 à 13:56:50    

Slt, est-ce que quelqu'un a un algo plus simple que cela et qui marche?
merci!

Reply

Marsh Posté le 12-06-2008 à 14:53:34    

Tu n'as pas du bien lire le reglement du forum:
On peut t'aider a trouver les causes d'erreurs de tes programmes, mais on ne t'aidera pas pour faire un programme a ta place.
Pour l'algo, je t'avais d'ailleurs détaillé en MP les principes d'une solution:

Citation :

L'algo le plus simple que je voie:
Tu imprimes ton nombre dans une chaine.
Tu calcules la longueur de la chaine, tu la divise par 3 (division entiere)
Ca te dit que par quel type d'unité secondaire tu vas démarrer.
Tu peux stocker les unités secondaire dans un tableau indexé par la valeur:
char *sec_unit[5] = {"","mille", "million", "milliard", "billion"};
j'ai mis 5, mais pour toi, ca dependra du plus grand nombre possible.
Ensuite tu procedes par groupe de trois chiffres dans ta chaine (sauf le premier, qui a pour taille la longueur de la chaine modulo 3 si ce n'est pas 0, et que tu peux completer par des 0 pour avoir 3 chiffres et appliquer l'algo général)
Pour le premier chiffre d'un groupe de 3
si c'est zéro, tu passes tu ecris le chiffre en toutes lettres si il est différent de zéro (avec un switch) tu fais suivre par "cent".
si c'est zéro, tu passes tu ecris le chiffre suivant en toutes lettres si il est différent de zéro (avec un switch) tu fais suivre par "dix".
si c'est zéro, tu passes tu ecris le chiffre suivant en toutes lettres si il est différent de zéro.
tu écris l'unité secondaire (que tu décrémentes ensuite)
et tu recommence avec le groupe de 3 chiffres suivant.
Une fois que ca colle, il faut ajuster pour tenir compte des particularités de la langue française:
de 11 a 16 et de 71 a 76 on a des noms spéciaux
A partir de 20, si on a une dizaine suivi d'une unite, on insère un "et" (et même pour 71)
"un cent" et "un mille" sont remplacés par "cent" et "mille".
Tu vois l'idée.


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 12-06-2008 à 15:11:43    

gilou a écrit :


Pour l'algo, je t'avais d'ailleurs détaillé en MP les principes d'une solution:

Citation :

L'algo le plus simple que je voie:
Tu imprimes ton nombre dans une chaine.
Tu calcules la longueur de la chaine, tu la divise par 3 (division entiere)
Ca te dit que par quel type d'unité secondaire tu vas démarrer.


A+,


 
Plus simple pour calculer le nombre de digits d'un nombre sans passer par une chaîne de caractères :

Code :
  1. int taille = floor(log10(nombre)) + 1;


(nécessite math.h)
 
Ensuite, tout comme gilou a dit (division par trois, unités, etc.)

Reply

Marsh Posté le 12-06-2008 à 15:38:26    

floor +1 c est pas un peu comme ceil ? [:ocolor]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 12-06-2008 à 15:41:00    

[:natas]

Reply

Marsh Posté le 12-06-2008 à 15:41:00   

Reply

Marsh Posté le 12-06-2008 à 15:44:16    

:D


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 13-06-2008 à 08:28:34    

mIRROR a écrit :

floor +1 c est pas un peu comme ceil ? [:ocolor]


Si je me souviens bien :
floor(1) + 1 = 2
ceil(1) = 1

Reply

Marsh Posté le 13-06-2008 à 10:21:41    

Ah oui tiens, je n'ai considéré que les nombres flottants quand j'ai cherché une faille dans le raisonnement de mIRROR, j'ai bêtement oublié de penser ce que ça pouvait donner avec un entier. [:joce]

Reply

Marsh Posté le 14-06-2008 à 00:56:39    

j ai pas trop reflechi non plus mais stait essentiellement pour la boutade hein :o


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed