|
Dernière réponse | |
---|---|
Sujet : [C (ou Java,ou autre chose...)] nombres: arabes <-> romain <-> litéral | |
cycojesus | 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] |
Aperçu |
---|
Vue Rapide de la discussion |
---|
cycojesus | 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] |
cycojesus | Big niouze :
Ce soir je fini la fonction nombre litéral -> nombre arabe (enfin j'espère...) Je la posterais demain. |
El_gringo | 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 ! |
cycojesus |
|
El_gringo |
|
grosmethos | 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.... |
morcandel | 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)... |
morcandel | 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; } |
cycojesus | 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] |
HelloWorld | 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:) |
wouatouwouatou | 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 |
cycojesus | 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 |
cycojesus | 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: |
wouatouwouatou |
|
minusplus | 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...) |
El_gringo | ç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 |
El_gringo | tu veux que ça puisse traduire les chiffres jusqu'a conbient !?
le millier, le million, le milliard ! |
morcandel | 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); } } |
JPA | sur : http://www.multimania.com/jmy51/contr.htm
tu l'auras en Pascal (de entier vers texte) Actuellement le serveur semble un peu chargé... |
cthulhu | quand ta trouve tu fais passer la source...hehe :D |
El_gringo | mais c carrément interressant ton truc, j'vais y réfléchir... |
El_gringo |
|
wouatouwouatou | 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] |
cycojesus |
|
cthulhu | moi je vois pas, en plus en french, ca va pas etre evident... |
cycojesus | Y'a même un petit cadeau pour celui qui trouve ;-) |
cycojesus | 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 |