[C] Conversion Numérique-Littéral

Fermé
Bertholle - 12 avril 2005 à 13:51
 Utilisateur anonyme - 24 juin 2005 à 20:21
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

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
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 jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
12 avril 2005 à 14:32
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
merci à FOUZI !!! enfin moi je dis ça ...
0
merci kij_82 donc il fo utiliser un tableau ?
0
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
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
24 juin 2005 à 19:39
la solution a déja été donné à la fin de ce post
bize
0
malene02 > Utilisateur anonyme
24 juin 2005 à 20:06
je vous remercie bien pour votre aide.
0
Utilisateur anonyme > malene02
24 juin 2005 à 20:21
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
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
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
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
15 mai 2005 à 19:05
salut, ok puisqu'il y a bcp de demande sur cet algo, je vais le faire puis repondre.
0
je te remercie d'avance !!!!!!!! bo ncourage !!
0
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
16 mai 2005 à 17:30
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
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
17 mai 2005 à 11:58
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
18 mai 2005 à 12:28
tu utilise quel compilateur C?
(moi j'ai utilisé Turbo C, sous DOS, et ça comile impecable)
0
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
18 mai 2005 à 12:36
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
oki merci beaucoup !
0
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
18 mai 2005 à 12:56
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
18 mai 2005 à 13:33
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
18 mai 2005 à 15:03
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
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
20 mai 2005 à 16:57
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
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 mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
20 mai 2005 à 17:23
ok, je vais voir ce que je peux faire
0
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
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