[C] Conversion Numérique-Littéral
Bertholle
-
Utilisateur anonyme -
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.
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:
- [C] Conversion Numérique-Littéral
- Télévision numérique - Guide
- Télévision numérique terrestre - Accueil - TV & Vidéo
- Pavé numérique bloqué - Guide
- Clavier numérique bloqué - Guide
- Caractère numérique - Guide
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
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.
++
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.
++
Ouaip.
Ensuite, si tu a un entier i, par exemple,
printf("J'ai %d %s kong racing\n", i, chiffre[i]);
Si i == 10, affichera :
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.
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.
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.
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.
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
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
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
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
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)
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).
@+
@+
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
tu peut recharger le fichier, normalement ça marche maintenant sur gcc
http://membres.lycos.fr/sam3000/v2/index.php?act=shares
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; }
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)
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);
}
#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);
}
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 !
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 !
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
- 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
merci de ton aide