Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1928 connectés 

  FORUM HardWare.fr
  Programmation
  C

  conversion chiffre en lettre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

conversion chiffre en lettre

n°1739660
Diego02
king_k
Posté le 31-05-2008 à 13:36:28  profilanswer
 

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
mood
Publicité
Posté le 31-05-2008 à 13:36:28  profilanswer
 

n°1739714
olivthill
Posté le 31-05-2008 à 17:33:47  profilanswer
 

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
n°1739724
gilou
Modérateur
Modzilla
Posté le 31-05-2008 à 17:59:45  profilanswer
 

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é!  --
n°1739730
gatsu35
Blablaté par Harko
Posté le 31-05-2008 à 18:27:39  profilanswer
 

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]

n°1739735
gilou
Modérateur
Modzilla
Posté le 31-05-2008 à 18:55:58  profilanswer
 

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é!  --
n°1745440
Diego02
king_k
Posté le 12-06-2008 à 13:56:50  profilanswer
 

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

n°1745487
gilou
Modérateur
Modzilla
Posté le 12-06-2008 à 14:53:34  profilanswer
 

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é!  --
n°1745501
Elmoricq
Modérateur
Posté le 12-06-2008 à 15:11:43  profilanswer
 

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

n°1745520
mIRROR
Chevreuillobolchévik
Posté le 12-06-2008 à 15:38:26  profilanswer
 

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
n°1745522
Elmoricq
Modérateur
Posté le 12-06-2008 à 15:41:00  profilanswer
 

[:natas]

mood
Publicité
Posté le 12-06-2008 à 15:41:00  profilanswer
 

n°1745525
mIRROR
Chevreuillobolchévik
Posté le 12-06-2008 à 15:44:16  profilanswer
 

:D


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1745790
Tarabiscot​e
Posté le 13-06-2008 à 08:28:34  profilanswer
 

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

n°1745839
Elmoricq
Modérateur
Posté le 13-06-2008 à 10:21:41  profilanswer
 

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]

n°1746337
mIRROR
Chevreuillobolchévik
Posté le 14-06-2008 à 00:56:39  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  conversion chiffre en lettre

 

Sujets relatifs
conversion integer ->string Erreur conversion valeur datetime
[asp] Conversion code php en asp?Conversion VB6 vers VB 2008 : pb avec mscomctl.ocx
conversion chaine ascii et accentsConversion VBA word vers VBS
Conversion de données BCD en floatconversion de __u8 en int
Conversion de date : chiffre => lettre 
Plus de sujets relatifs à : conversion chiffre en lettre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR