[C (ou Java,ou autre chose...)] nombres: arabes <-> romain <-> litéral

nombres: arabes <-> romain <-> litéral [C (ou Java,ou autre chose...)] - Programmation

Marsh Posté le 01-06-2001 à 10:57:24    

Bonjour,
 
J'arrive pas à trouver un source C (voire Java, mais beuh...), même pas le plus petit bout d'algo pour traduire un nombre arabe (1 456, l'espace est important :-( ) en litéral (mille quatre cents cinquante six), et inversement...
 
Pourtant je me disais qu ce genre de truc devait être courant... mais non !
 
Quelqu'un aurait-il ça ?
 
Merci d'avance


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 10:57:24   

Reply

Marsh Posté le 01-06-2001 à 10:58:52    

Y'a même un petit cadeau pour celui qui trouve ;-)


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 11:04:52    

moi je vois pas, en plus en french, ca va pas etre evident...

Reply

Marsh Posté le 01-06-2001 à 11:12:58    

Cthulhu a écrit a écrit :

moi je vois pas, en plus en french, ca va pas etre evident...




 
C'est clair !
 
arabe <-> romain j'ai trouvé tout de suite, mais arabe <-> français (sans aucun sous-entendu douteux !) nada !


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 11:18:49    

a mon humble avis... tu devrais te pencher sur de la reconnaissance syntaxique... du genre tu definies ton vocabulaire pi tu definies tes regles de langage et hop... le tour est joué...  
moi je commencerais par faire un 'dictionnaire' des nombres...
du genre ... je me base sur les chiffres arabes et de là, je fais de la correspondance (indexage koi)...
exemple : pour le litterale : 0 -> zero, 1 -> un, 2 -> deux, etc.
pour le romain : 0 -> jsais pas :D , 1 -> I , 2 -> II , etc.
 
Comme ca ta plus ka fournir le dictionnaire (vocabulaire) à ton module de conversion et il fait tout !!!  
 
plus precisement, via des tables de hachage : clé -> "de koi reperer ton chiffre"
valeur -> le chiffre.
Bien sur...le plus dur sera de trouver les regle de syntaxes...
bon courage... :D

 

[edit]--Message édité par wouatouwouatou--[/edit]


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 01-06-2001 à 11:31:30    

wouatouwouatou a écrit a écrit :

pour le romain : 0 -> jsais pas :D , 1 -> I , 2 -> II , etc.
 




 
Normal, les romains n'connaissaient pas encore le Zéro, donc y en a pas en chiffre romain...y sont con ces romains ! :D

Reply

Marsh Posté le 01-06-2001 à 11:32:07    

mais c carrément interressant ton truc, j'vais y réfléchir...

Reply

Marsh Posté le 01-06-2001 à 11:34:11    

quand ta trouve tu fais passer la source...hehe :D

Reply

Marsh Posté le 01-06-2001 à 11:35:10    

sur : http://www.multimania.com/jmy51/contr.htm
tu l'auras en Pascal (de entier vers texte)
Actuellement le serveur semble un peu chargé...

Reply

Marsh Posté le 01-06-2001 à 11:36:13    

il y a fort-fort longtemps, j'avais fait un truc du genre... il me semble qu'il y avait des erreurs de français (ex. cents ou cent quand il y a plusieurs centaines suivies ? "trois cents douze" ou "trois cent douze" ?)
 
void int2asc(int a)
{
  int b, r;
 
  char *chiffres[] = {"zéro", "un", "deux", "trois", "quatre", "cinq",  
        "six", "sept", "huit", "neuf", "dix", "onze",  
        "douze", "treize", "quatorze", "quinze", "seize"};
 
  if ( a>=1E9 )
    {
      b = a/1E9;
      r = a % 1000000000;
      int2asc(b);
      if ( b>1 )
 printf(" milliards" );
      else
 printf(" milliard" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r);
 }
      return;
    }
 
  if ( a>=1E6 )
    {
      b = a/1E6;
      r = a%1000000;
      int2asc(b);
      if ( b>1 )
 printf(" millions" );
      else
 printf(" million" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r);
 }
      return;
    }
 
  if ( a>=1E3 )
    {
      b = a/1E3;
      r = a%1000;
      if ( b>1 )
 {
   int2asc(b);
   if ( r==0 )
     printf(" milles" );
   else
     printf(" mille" );
 }
      else
 printf("mille" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r);
 }
      return;
    }
   
  if ( a>=100 )
    {
      b = a/100;
      r = a%100;
      if ( b > 1 )
 {
   int2asc(b);
   printf(" cents" );
 }
      else
 printf("cent" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r);
 }
      return;
    }
   
  if ( a>=80 )
    {
      r=a-80;
      printf("quatre-vingt" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r);
 }
      return;
    }
 
  if ( a>=60 )
    {
      r=a-60;
      printf("soixante" );
      if ( r>0 )
 {
   if ( r==1 )
     printf(" et" );
   printf(" " );
   int2asc(r);
 }
      return;
    }
 
  if ( a<=16 )
    {
      printf("%s", chiffres[a]);
      return;
    }
 
  b = a/10;
  r = a%10;
 
  switch ( b )
    {
    case 5:
      printf("cinquante" );
      break;
    case 4:
      printf("quarante" );
      break;
    case 3:
      printf("trente" );
      break;
    case 2:
      printf("vingt" );
      break;
    case 1:
      printf("dix" );
      break;
    }
  if ( r>0 )
    {
      if ( r==1 )
 printf(" et" );
      printf(" " );
      int2asc(r);
    }
}

Reply

Marsh Posté le 01-06-2001 à 11:36:13   

Reply

Marsh Posté le 01-06-2001 à 11:38:24    

tu veux que ça puisse traduire les chiffres jusqu'a conbient !?
le millier, le million, le milliard !

Reply

Marsh Posté le 01-06-2001 à 11:49:37    

ça va être un peu chaud, je suis au boulot, g pas l'temps, mais j'y repenserai plus tard, juste qqs conseils :
selon moi tu devrai stocker ça -> les chiffres littéraux de 1 à 19 (pour soixante douze, soixante traize,...) et puis 20, 30, 40, 50, 60, 80, 100, 1000, 1000000,... selon jusqu'a combient tu veux aller !
et après tu crée des règle pour conbiner tt ça !
vu que le pb est pas franchement simple, resous le en algorithmique avant de passer au C...
 
bonne chance... :D  :D

Reply

Marsh Posté le 01-06-2001 à 12:06:57    

j'ai un script Bash de Noah Friedman qui traite les nombre entiers jusqu'à 67 digits. mais bon, c'est pas du C (si tu te sent de le traduire...)

Reply

Marsh Posté le 01-06-2001 à 12:24:37    

El_gringo a écrit a écrit :

 
selon moi tu devrai stocker ça -> les chiffres littéraux de 1 à 19 (pour soixante douze, soixante traize,...) et puis 20, 30, 40, 50, 60, 80, 100, 1000, 1000000,... selon jusqu'a combient tu veux aller !




Moi jaurais aussi mis le zero... mais si les romains ne lavait pas.. ben... fo faire ce cas exceptionnel.
remarque: je me demande koment ils faisaient sans le zero !!! c a la base de tout !!!!


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 01-06-2001 à 13:02:31    

Milles mercis !!
 
je vais étudier tout ça cet aprèm.
 
Quelques précisions :
- on intègre le zéro avec les chiffres romains (tant pis pour l'histoire des maths...)
- on gère jusqu'au million
 
 
 
P.S.: le cadeau sera en téléchargement sur mon site soit ce soir soit au plus tard mardi (et la semaine prochaine sur SourceForge, j'espère...). Il n'a rien à voir avec ce projet, mais c'est sympa quand même (enfin je trouve...)
 
:jap:


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 13:05:23    

Un copain me file à l'instant deux sites (je dois être faché avec Google et Altavista moi !...) :
 
http://www.multimania.com/clo7/grammaire/nombre.htm
http://moire4.u-strasbg.fr/oct98/w_cont.htm


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 13:16:20    

wow... bon courage... je savais pa ke la grammaire etait aussi compliqué avec les nombres ... entre mille et mil et les accors et tou et tou... :crazy: :D


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 01-06-2001 à 13:43:33    

qq'un peut rappeller aussi les regles orthographiques ... une petite révision (pour moi en tous cas :D)
dix mils ...
dix mil quarante ...  
c'est bien comme ca le 's' ? :D  
au fait : tu veux dix mil quarante ou dix mil zéro quarante ?
(=> ne crois pas qu'en fonction de ta réponse je vais te sortir un source tout pret :lol:)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 01-06-2001 à 14:30:59    

Voila les cadeaux :
http://cycojesus.ctw.net/files/MonPCEnOpenGL.zip
et
http://cycojesus.ctw.net/files/Ope [...] v0.2.7.zip
 
Pour éxecuter, il faut les dll de GLUT ( http://reality.sgi.com/mjk_asd/glu [...] ml#windows )
 
Pour compiler (Visual C++ 6.0), il faut GLUT (idem) et GLUI ( http://www.cs.unc.edu/%7Erademach/glui/ ) (pour OpenGLavity seulement)
 
wouatouwouatou > merci, j'en aurais besoin :-)
 
HelloWorld > http://www.multimania.com/clo7/grammaire/nombre.htm , ça à l'air assez complexe ;-)

 

[edit]--Message édité par cycojesus--[/edit]


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 14:31:31    

attention, "mil", c'est uniquement pour les années... j'ai jeté un coup d'oeil aux règles, il ne faut pas grand chose pour que la fonction donnée ci-dessus les respectent...
 
4383 quatre mille trois cent quatre-vingt-trois
886 huit cent quatre-vingt-six
2777 deux mille sept cent soixante-dix-sept
1915 mille neuf cent quinze
2793 deux mille sept cent quatre-vingt-treize
3335 trois mille trois cent trente-cinq
386 trois cent quatre-vingt-six
492 quatre cent quatre-vingt-douze
1649 mille six cent quarante-neuf
1421 mille quatre cent vingt-et-un
 
fonction à appeler avec un 1 en deuxième paramètre (pour les tirets pour les nombres < 100 et les appels récursifs)...  :sweat:  
 
void int2asc(int a, int t)
{
  int b, r;
 
  char *chiffres[] = {"zéro", "un", "deux", "trois", "quatre", "cinq",  
        "six", "sept", "huit", "neuf", "dix", "onze",  
        "douze", "treize", "quatorze", "quinze", "seize"};
 
  if ( a>=1E9 )
    {
      b = a/1E9;
      r = a % 1000000000;
      int2asc(b,0);
      if ( b>1 && r==0 )
 printf(" milliards" );
      else
 printf(" milliard" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r,1);
 }
      return;
    }
 
  if ( a>=1E6 )
    {
      b = a/1E6;
      r = a%1000000;
      int2asc(b,0);
      if ( b>1 && r==0 )
 printf(" millions" );
      else
 printf(" million" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r,1);
 }
      return;
    }
 
  if ( a>=1E3 )
    {
      b = a/1E3;
      r = a%1000;
      if ( b>1 )
 {
   int2asc(b,0);
   if ( r==0 )
     printf(" milles" );
   else
     printf(" mille" );
 }
      else
 printf("mille" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r,1);
 }
      return;
    }
   
  if ( a>=100 )
    {
      b = a/100;
      r = a%100;
      if ( b>1 )
 {
   int2asc(b,0);
   if ( r==0 )
     printf(" cents" );
   else
     printf(" cent" );
 }
      else
 printf("cent" );
      if ( r>0 )
 {
   printf(" " );
   int2asc(r,1);
 }
      return;
    }
   
  if ( a>=80 )
    {
      r=a-80;
      printf("quatre-vingt" );
      if ( r>0 )
 {
   if ( t )
     printf("-" );
   else
     printf(" " );
   int2asc(r,1);
 }
      return;
    }
 
  if ( a>=60 )
    {
      r=a-60;
      printf("soixante" );
      if ( r>0 )
 {
   if ( r==1 )
     if ( t )
       printf("-et" );
     else
       printf(" et" );
   if ( t )
     printf("-" );
   else
     printf(" " );
   int2asc(r,1);
 }
      return;
    }
 
  if ( a<=16 )
    {
      printf("%s", chiffres[a]);
      return;
    }
 
  b = a/10;
  r = a%10;
 
  switch ( b )
    {
    case 5:
      printf("cinquante" );
      break;
    case 4:
      printf("quarante" );
      break;
    case 3:
      printf("trente" );
      break;
    case 2:
      printf("vingt" );
      break;
    case 1:
      printf("dix" );
      break;
    }
  if ( r>0 )
    {
      if ( r==1 )
 if ( t )
 printf("-et" );
      if ( t )
 printf("-" );
      else
 printf(" " );
      int2asc(r,1);
    }
}
 
int main()
{
  int a ,i;
 
  for ( i = 0 ; i<10 ; i++ )
    {
      a = rand() % 5000;
      printf("%d ", a);
      int2asc(a,1);
      printf("\n" );
    }
 
  return 0;
}

Reply

Marsh Posté le 01-06-2001 à 14:40:50    

ok, je ne suis qu'une loutre... il y a un léger petit bug dans la fonction précédente pour les nombres supérieurs à 1E12 :D il faut remplacer (dans la fonction) les int2asc(r,1) par int2asc(r,t)...

Reply

Marsh Posté le 01-06-2001 à 14:44:48    

les romains ils avaient rien compris aux chiffres :
si tu soustrais I à IV tu obtient V donc n'importe quoi!!!
 
Sont trop forts ces arabes....

Reply

Marsh Posté le 01-06-2001 à 15:06:04    

wouatouwouatou a écrit a écrit :

 
Moi jaurais aussi mis le zero... mais si les romains ne lavait pas.. ben... fo faire ce cas exceptionnel.
remarque: je me demande koment ils faisaient sans le zero !!! c a la base de tout !!!!




 
J'imagine qu'il faisaient pas trop de Maths, tout simplement. Par ce que c'était qd même pas pratique, imagines la galère pour les équation par exemple: Xx + ln(IV)y = IX
...on est d'accord, c l'bordel !

Reply

Marsh Posté le 01-06-2001 à 15:10:53    

El_gringo a écrit a écrit :

 
 
J'imagine qu'il faisaient pas trop de Maths, tout simplement. Par ce que c'était qd même pas pratique, imagines la galère pour les équation par exemple: Xx + ln(IV)y = IX
...on est d'accord, c l'bordel !




 
Ce qui m'amène une question : Et les Grecs ?


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 01-06-2001 à 15:58:55    

ouais, c une question excente, j'me posait la même !
en fait, les grecs, Aristote et tout l'toutim ils étaient carrément meilleurs que les romain, les romains, leur truc, c'était plutot foutre sur la gueule des pays qui les entourent, conquérir tout ce qu'ils peuvent (un peu comme les Américains aujourd'hui à la méthode moderne...par le pognon au lieu du pilum !).
Pour en revenir à la question de base...ils utilisaient quoi comme chiffres les grecs, moi j'dirait les chiffre arabes, mais c bizare: si ces chiffre existaient déja au temps des romains, pourquoi ils seraient allé en inventer des moins pratiques...ils étaint fou ces romain, ça on l'sais bien, mais qd même !

Reply

Marsh Posté le 05-06-2001 à 09:37:14    

Big niouze :
Ce soir je fini la fonction nombre litéral -> nombre arabe (enfin j'espère...)
 
Je la posterais demain.


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 15-06-2001 à 17:31:14    

Enfin ce projet est fini, vous pouvez le dl ici : http://www.citeweb.net/cycojesus/files/nombres.zip
 
Merci à tous et à bientôt :jap:

 

[edit]--Message édité par cycojesus--[/edit]


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed