[C] Conversion Numérique-Littéral

bonjour,
je suis en 1er année de mathématiques et informatique j'ai un tp ou je dois convertir des chiffres en lettre grace au langage C sous linux/unix par exemple 10 = dix en prenant en compte les règles de grammaires.
j'ai des petites idée comme une fonction pour vérifier kil s'agit bien de chiffre et non de charactère mais pour le reste je seche complètement .
merci de bien vouloir éclairer ma lanterne.

17 réponses

Résumé de la discussion

Conversion des chiffres en mots en C sous Linux résume le débat, axé sur la conversion de nombres en mots en C sous Linux avec respect de la grammaire française et des nombres négatifs et décimaux. Plusieurs réponses évoquent une approche par décomposition en groupes de trois chiffres et l'utilisation d'un tableau lexical pour les unités, dizaines et centaines. Des difficultés de grammaire apparaissent, notamment les formes avec cent(s), les nombres composés comme soixante-dix, et la gestion des variantes belges comme septante ou neptante. En pratique, certaines réponses proposent d'expliciter les règles et d'expliquer le découpage en millions et milliards, afin d'allonger le code et d'optimiser la grammaire via des fonctions spécialisées.

Bobot (l’IA à votre service)
  1. Salut, essaye de récupérer le code ASCII de chacun des caractères. Là tu pourras déterminer s'il s'agit d'un chiffre, d'une lettre, d'un caractère spécial etc
    0
    1. j'ai déjà fait cette fonction mais je ne sais pas comment faire pour faire afficher dix en toute lettre c ça mon problème
      merci de ton aide
      0
  2. Contributeur
    pAS BESOIN DE LIRE LA TABLE ascii :
    Fait un dictionnaire de correspondance :

    Tu commence par prendre la longueur de la chine de caractère rentrée pour initialiser une itération pour lire caractère par caractère et :
    Selon la position du caratère que tu lit, tu écrit ce à quoi ca correspond : "cent", "mille", etc,
    quand tu recontre 1,2,3,4,5,6,7,8,9 tu marque le chiffre en lettre

    Commence come ça, puis au fur et à mesure que tu découvre certaines sécificité tu afine ton algo.

    ++
    0
    1. merci à FOUZI !!! enfin moi je dis ça ...
      0
  3. merci kij_82 donc il fo utiliser un tableau ?
    0
    1. Ouaip.
      char chiffre[] [] = {"zero",
                           "un",
                           "deux", 
      // etc...
      


      Ensuite, si tu a un entier i, par exemple,

      printf("J'ai %d %s kong racing\n", i, chiffre[i]);

      Si i == 10, affichera :
      J'ai 10 dix kong racing


      Par contre pour tes histoires de règle de grammaire...
      NON !!! Je viens de comprendre, c'est méga plus complexe !!!

      En fait il faut que tu décompose le chiffre.
      Prenons pour base qu'il ne dépasse pas 10^12 (1000 milliards, puisqu'un entier va au max à 4 milliards et quelques)

      Tu fait donc
      M = x / 1000000; x -= MM*1000000000;
      explication : "/", ici, est une division "entière" (euclidienne, il y a un reste, ignoré). Donc, "x - MM*1000000000" est le reste de cette division.
      Ex :
      x == 2'789'654'123'
      MM = x / 1000000000 = 2
      x - MM*1000000000 = 789'654'123

      Donc tu découpe tes truc en tranche de mille.
      (ex MM = 72, M = 485 ; m=589; u=158 code pour
      72 * 1000000000 + 485 * 1000000 + 589*1000 + 158 = 72'485'589'158).

      Il reste à découper, de la même manière, chaque groupe en 3 chiffre.
      Genre, pour 158.
      C = x /100; // 158 /100 == 1
      x = x - C*100 // x -> 58
      D = x /10
      x = x - D*10
      U = x
      Ainsi.....
      C = 1
      D = 5
      u = 8

      Tu peux alors, via un tableau trafiqué, affiché "cent - cinquante - huit"
      (Les problème apparaissent pour les soitantes dix et quatre vingt dix.
      Je te conseille d'opter pour les "septante" et "neptante" belges ;°)

      Je t'ai balancé l'algo de base, tu as de quoi fouiller.
      Si je suis pas clair, dis moi, mais dis moi OU...
      C'est dans ma nature de pas être clair, en plus je suis maso, j'aime être violenté (quand c'est justifié !!)
      Bref, n'hésite pas à poser des questions.... J'ai laissé des zones d'ombres, parceque ton exo est "trois étoiles" et que j'ai pas "que" le temps d'écrire un roman.
      0
      1. svp vous pouvez m'aider pour faire ce programme j'ai besoin de ce programme avant le mardi c un mini projet demandé par l'école.
        Je veux savoir comment faire pour afficher les trait '-' entre les chiffres l'exemple de 80 et 70....aussi je veux savoir comment je peux ecrire c nombre 70,71,72,85,80...........
        je vous remercie avant pour votre aide.
        0
      2. @elenala solution a déja été donné à la fin de ce post
        bize
        0
      3. @lucy.mje vous remercie bien pour votre aide.
        0
      4. @malene02mais de rien, pour précision, les messages qui semblent fonctionner sont ceux des post 19 et 20.
        j'espere que ça t'aide
        bize
        0
    2. euh pourquoi pas mais il me fodré juste un exemple du code en C à utilisé pour afficher en lettre et je pense que j'y arriveré mieu
      0
      1. salut ! je voudrais savoir si tu as réussi à faire ton projet car j'ai le meme que le tien ! si tu as trouvé d'autres astuces, tu pourrai me les transmettre ? merci d'avance et bon courage
        0
    3. salut ! je voudrais savoir si tu as réussi à faire ton projet car j'ai le meme que le tien ! si tu as trouvé d'autres astuces, tu pourrai me les transmettre( denise16_xu@hotmail.com)? merci d'avance et bon courage
      0
      1. salut, ok puisqu'il y a bcp de demande sur cet algo, je vais le faire puis repondre.
        0
        1. je te remercie d'avance !!!!!!!! bo ncourage !!
          0
      2. salut,
        voici un exemple complet e conversion d'un nombre en texte toutes lettres (programme en C):

        http://membres.lycos.fr/sam3000/v2/index.php?act=shares
        0
        1. Salut ! je te remercie pour ton programme même si j'ai eu du mal à le compiler... mais je ne comprend pas pourquoi, quand je rentre par exemple 2, il me met quatre vingt milliards etc !
          Alors j'essaye de le faire par moi meme...
          Merci encore !
          A bientot
          0
      3. si aucun lien n'est accessible! il faut attendre un petit moment jusqu'à ce que les publicités de mon hebergeur soient réduites (ah! lycos)
        0
        1. tu utilise quel compilateur C?
          (moi j'ai utilisé Turbo C, sous DOS, et ça comile impecable)
          0
          1. je m'y connais pas vraiment. je travaille sous Unix et pour compiler je tape "gcc -o nom nom.c"
            0
        2. ok, je vais voir la compatibilité de programme avec gcc et si necessaire je ferais les correction (j'utiliserais dev-c++ que je crois est compatible avec gcc unix).
          @+
          0
          1. oki merci beaucoup !
            0
        3. bon, voila le code

          #include <stdio.h>
          #include <string.h>
          
          void convert3(int x)
          {
            char inf20[20][8]={"","un","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-huit","dix-neuf"};
            char dixaines[8][12]={"","dix","vingt","trente","quarente","cinquente","soixante","quatre-vingt",};
            if (x>=100)
            {
              if ((x/100)!=1)
              {
                printf("%s",inf20[x/100]);
                printf(" ");
              }
              printf("cent");
              if (((x%100)==0)&&((x/100)!=1)) printf("s");
              printf(" ");
            }
            if ((x%100)<20) printf("%s",inf20[x%100]);
            else
            {
              if (((x%100)>=20)&&((x%100)<=60))
              {
                printf("%s",dixaines[(x%100)/10]);
                printf(" ");
                if(((x%100)%10)!=1) printf("%s",inf20[(x%100)%10]);
                else printf("et un");
              }
              if (((x%100)>=60)&&((x%100)<=79))
              {
                printf("%s",dixaines[6]);
                printf(" ");
                if (((x%100)%10)!=1) printf("%s",inf20[(x%100)-60]);
                else printf("et un");
              }
              if (((x%100)>=80)&&((x%100)<=99))
              {
                printf("%s",dixaines[7]);
                printf(" ");
                if (((x%100)%10)!=1) printf("%s",inf20[(x%100)-80]);
                else printf("et un");
              }
            }
          }
          
          void convertir_nombre(unsigned long int nb)
          {
            int i,j,nb3[4];
            if(nb==0) printf("zéro");
            else
            {
              i=0;
              do
              {
                nb3[i]=nb%1000;
                nb=nb/1000;
                i++;
              } while(nb!=0);
           
              for(j=i-1;j>=0;j--)
              {
                convert3(nb3[j]);
                printf(" ");
                if((j+1)==4) printf("milliard");
                if((j+1)==3) printf("million");
                if((j+1)==2) printf("mille");
                printf(" ");
              }
            }
          }
           
          int main()
          {
            unsigned long int nb;
            printf("Donner le nombre à convertir:");
            scanf("%lu",&nb);
            convertir_nombre(nb);
            getch();
            return 0;
          }
          
          
          0
          1. c'est long, c'est pour cette raison que j'hésite à mettre ce genre de programmes sur le forum (et je donne plustot un lien)
            0
            1. Bonjour SAm. Voilà ce qu'on a pu faire mais il y a des erreurs ! tu peux voir le problème ? Merci d'avance

              #include <stdio.h>
              #define N 13

              int Longueur (char entier [])
              {
              int n=0;

              while (entier [n] != '\0')
              n++;

              return n;
              }

              void RentreNb (char entier [], char chaine [])
              {
              char zero [N];
              int x=0;
              int k;
              int n;

              n = Longueur (entier);

              k = N-n-1;

              for (x=0; x<=k; x++)
              zero [x]='0';

              for (x=0; x<=k; x++)
              chaine [x]= zero [x];

              for (x=0; x<=n; x++)
              chaine [k+x]= entier [x];

              chaine [k+x]='\0';
              }

              /*
              void NommeChaine (char chaine [])
              {
              int *a, *b, *c, *d, *e, *f, *g, *h, *i, *j, *k, *l, *m;

              *a = chaine [0];
              *b = chaine [1];
              *c = chaine [2];
              *d = chaine [3];
              *e = chaine [4];
              *f = chaine [5];
              *g = chaine [6];
              *h = chaine [7];
              *i = chaine [8];
              *j = chaine [9];
              *k = chaine [10];
              *l = chaine [11];
              }
              */

              void *Unite (x)
              {
              if (x == 1)
              {
              if (x-1 == 0)
              printf ("un ");

              else if (x-1 != 1 && x-1 != 7 && x-1 != 8 && x-1 != 9)
              printf ("et un ");
              }

              else if (x-1 != 0 && x-1 != 1 && x-1 != 7 && x-1 != 8 && x-1 != 9)
              {
              if (x == 2)
              printf ("- deux ");

              else if (x == 3)
              printf ("- trois ");

              else if (x == 4)
              printf ("- quatre ");

              else if (x == 5)
              printf ("- cinq ");

              else if (x == 6)
              printf ("- six ");

              else if (x == 7)
              printf ("- sept ");

              else if (x == 8)
              printf ("- huit ");

              else if (x == 9)
              printf ("- neuf ");
              }

              else if (x-1 == 0)
              {
              if (x == 2)
              printf ("deux ");

              else if (x == 3)
              printf ("trois ");

              else if (x == 4)
              printf ("quatre ");

              else if (x == 5)
              printf ("cinq ");

              else if (x == 6)
              printf ("six ");

              else if (x == 7)
              printf ("sept ");

              else if (x == 8)
              printf ("huit ");

              else if (x == 9)
              printf ("neuf ");
              }
              }

              void *Dix (x)
              {
              if (x+1 == 0)
              printf ("dix ");

              else if (x+1 == 1)
              {
              if (x == 1)
              printf ("onze ");

              else if (x == 7)
              printf ("et onze ");

              else if (x == 9)
              printf ("- onze ");
              }

              else if (x+1 == 2)
              printf ("douze ");

              else if (x+1 == 3)
              printf ("treize ");

              else if (x+1 == 4)
              printf ("quatorze ");

              else if (x+1 == 5)
              printf ("quinze ");

              else if (x+1 == 6)
              printf ("seize ");

              else if (x+1 == 7)
              printf ("dix - sept ");

              else if (x+1 == 8)
              printf ("dix - huit ");

              else if (x+1 == 9)
              printf ("dix - neuf ");
              }

              void *Dizaine (x)
              {
              if (x == 1)
              Dix (x);

              else if (x == 2)
              printf ("vingt ");

              else if (x == 3)
              printf ("trente ");

              else if (x == 4)
              printf ("quarante ");

              else if (x == 5)
              printf ("cinquante ");

              else if (x == 6)
              printf ("soixante ");

              else if (x == 7)
              {
              printf ("soixante ");
              Dix (x);
              }

              else if (x == 8)
              {
              if (x == 0)
              printf ("quatre - vingts ");

              else
              printf ("quatre - vingt ");
              }

              else if (x == 9)
              {
              printf ("quatre - vingt ");
              Dix (x);
              }
              }

              void *Centaine (x)
              {
              if (x == 1)
              printf ("cent ");

              else
              {
              Unite (x);

              if (x+1 == 0 && x+2 == 0)
              printf ("cent ");

              else
              printf ("cents ");
              }
              }

              void Convert (char chaine [])
              {
              int x;

              int *a, *b, *c, *d, *e, *f, *g, *h, *i, *j, *k, *l, *m;

              *a = chaine [0];
              *b = chaine [1];
              *c = chaine [2];
              *d = chaine [3];
              *e = chaine [4];
              *f = chaine [5];
              *g = chaine [6];
              *h = chaine [7];
              *i = chaine [8];
              *j = chaine [9];
              *k = chaine [10];
              *l = chaine [11];

              if (*a != 0 || *b != 0 || *c != 0)
              {
              Centaine (*a);
              Dizaine (*b);
              Unite (*c);

              if (*a == 0 && *b == 0 && *c == 1)
              printf ("un milliard ");

              else
              printf ("milliards ");
              }

              if (*d != 0 || *e != 0 || *f != 0)
              {
              Centaine (*d);
              Dizaine (*e);
              Unite (*f);

              if (*d == 0 && *e == 0 && *f == 1)
              printf ("un million ");

              else
              printf ("millions ");
              }

              if (*g != 0 || *h != 0 || *i != 0)
              {
              Centaine (*g);
              Dizaine (*h);
              Unite (*i);
              printf ("mille ");
              }

              if (*j != 0 || *k != 0 || *l != 0)
              {
              Centaine (*j);
              Dizaine (*k);
              Unite (*l);
              }

              if (chaine [x] == 0)
              printf ("zero ");
              }

              int main (void)
              {
              char recommence;
              printf (" ***conversion numerique litterale*** \n");

              do
              {
              char entier [N+1];
              char decimal [N];
              char chaine [N];

              printf ("\t entrer la partie entiere d'un nombre (avec son signe)\n");
              scanf ("%s", &entier);
              printf (" \t entrer la partie decimale d'un nombre \n");
              scanf ("%s", &decimal);

              while (Longueur(entier) > 13)
              {
              printf ("le nombre des entiers est trop grand!\nil faut un nombre strictement inferieur a 1013 \n");
              printf ("rentrer un autre nombre pour les entiers \n");
              scanf ("%s", &entier);
              }

              while (Longueur(decimal) > 13)
              {
              printf ("le nombre des decimaux est trop grand!\nil faut un nombre strictement inferieur a 10^13 \n");
              printf ("rentrer un autre nombre pour les decimaux \n");
              scanf ("%s", &decimal);
              }

              if (entier[0] == '-')
              {
              int i;
              char temp[N+1];

              printf ("moins ");
              temp [i] = entier [i];
              entier [i] = temp [i+1];
              }

              RentreNb (entier, chaine);

              Convert (chaine);

              printf ("voulez-vous recommencer? o/n \n");
              scanf ("%s", &recommence);

              }
              while(recommence == 'o');

              scanf ("%s", &recommence);

              return (0);
              }
              0
          2. en parlant de longs programmes!
            pq tu refais le programme le listing que j'ai donné fonctionne sous linux/gcc?
            l'as tu testé?
            tu n'as pas précisé quels sont les erreurs! bon j'essai de voir malgré que je ne suis pas convaincus !
            0
            1. Merci beaucoup pour ton programme ! il marche mais voilà les conditions :
              - il faut rentrer un nombre qui peut etre decimal et négatif dans une structure
              - on doit mettre la partie entière dans un tableau et la partie decimale dans un autre, tous 2 de taille N=12
              - il faut faire attention à la grammaire : deux cents, deux cent un, quatre-vingts, quatre-vingt-un, vingt et un,vingt-deux etc
              ex = 1521,125 = mille cinq cent vingt et un, un deux cinq
              - il faut ecrire le programme en utilisant le plus de fonctions

              je t'ai envoyé ce qu'une amie a commencé à faire.
              voilà tu sais tout ! bonne chance et merci
              0
          3. ok, je vais voir ce que je peux faire
            0
            1. bonjour sam c samia , j te remerci infinimnt sur ton alogo de convertion de chiffres en lettres ca ma bcp aidé merci encore une fois,car j'avais meme projet pour mes etudes merci encore @+
              0
          4. a propos sam g du mal a comprendre qlq notions

            ke ta pris on analisant ce problem,j té envoyer un msg sut ta boite il détail mon problem,merci d'avance@+
            0