[C] Conversion Numérique-Littéral

Bertholle -  
 lucy.m -
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

  1. pom
     
    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. bertholle
       
      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. kij_82 Messages postés 4102 Date d'inscription   Statut Contributeur Dernière intervention   857
     
    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. mono
       
      merci à FOUZI !!! enfin moi je dis ça ...
      0
  3. bertholle
     
    merci kij_82 donc il fo utiliser un tableau ?
    0
  4. SKZ81
     
    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. elena
       
      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
      1. lucy.m > elena
         
        la solution a déja été donné à la fin de ce post
        bize
        0
      2. malene02 > lucy.m
         
        je vous remercie bien pour votre aide.
        0
      3. lucy.m > malene02
         
        mais 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bertholle
     
    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. Sabrina
       
      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
  7. denise
     
    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
  8. sam3000 Messages postés 1226 Statut Membre 144
     
    salut, ok puisqu'il y a bcp de demande sur cet algo, je vais le faire puis repondre.
    0
    1. Sabrina
       
      je te remercie d'avance !!!!!!!! bo ncourage !!
      0
  9. sam3000 Messages postés 1226 Statut Membre 144
     
    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. Sabrina
       
      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
  10. sam3000 Messages postés 1226 Statut Membre 144
     
    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
  11. sam3000 Messages postés 1226 Statut Membre 144
     
    tu utilise quel compilateur C?
    (moi j'ai utilisé Turbo C, sous DOS, et ça comile impecable)
    0
    1. Sab
       
      je m'y connais pas vraiment. je travaille sous Unix et pour compiler je tape "gcc -o nom nom.c"
      0
  12. sam3000 Messages postés 1226 Statut Membre 144
     
    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. SAb
       
      oki merci beaucoup !
      0
  13. sam3000 Messages postés 1226 Statut Membre 144
     
    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
  14. sam3000 Messages postés 1226 Statut Membre 144
     
    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. sabrina
       
      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
  15. sam3000 Messages postés 1226 Statut Membre 144
     
    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. sabrina
       
      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
  16. sam3000 Messages postés 1226 Statut Membre 144
     
    ok, je vais voir ce que je peux faire
    0
    1. samia
       
      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
  17. samia
     
    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