[C] Conversion Numérique-Littéral

Bertholle -  
 Utilisateur anonyme -
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.
A voir également:

17 réponses

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
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
kij_82 Messages postés 4089 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
mono
 
merci à FOUZI !!! enfin moi je dis ça ...
0
bertholle
 
merci kij_82 donc il fo utiliser un tableau ?
0
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
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
Utilisateur anonyme > elena
 
la solution a déja été donné à la fin de ce post
bize
0
malene02 > Utilisateur anonyme
 
je vous remercie bien pour votre aide.
0
Utilisateur anonyme > 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
salut, ok puisqu'il y a bcp de demande sur cet algo, je vais le faire puis repondre.
0
Sabrina
 
je te remercie d'avance !!!!!!!! bo ncourage !!
0
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   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
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
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   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
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
tu utilise quel compilateur C?
(moi j'ai utilisé Turbo C, sous DOS, et ça comile impecable)
0
Sab
 
je m'y connais pas vraiment. je travaille sous Unix et pour compiler je tape "gcc -o nom nom.c"
0
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   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
SAb
 
oki merci beaucoup !
0
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
voila, c'est fait
tu peut recharger le fichier, normalement ça marche maintenant sur gcc


http://membres.lycos.fr/sam3000/v2/index.php?act=shares
0
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   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
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   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
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
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   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
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
sam3000 Messages postés 1225 Date d'inscription   Statut Membre Dernière intervention   144
 
ok, je vais voir ce que je peux faire
0
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
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