Newsgroup: it.comp.lang.c
Titolo: conversione da numero a parola

Avrei bisogno di un programma che converta un numero intero dato in input
nella corrispondente parola in Italiano. Ad esempio, dato in input il numero
1657, si dovrebbe ottenere la parola milleseicentocinquantasette.
Qualcuno ha per le mani un sorgente del genere ?
Grazie anticipate.
- Beppe -
-----== Posted via Deja News, The Leader in Internet Discussion ==-----
http://www.dejanews.com/rg_mkgrp.xp
   Create Your Own Free Member Forum

 nella corrispondente parola in Italiano.
Ok, mi rispondo da solo.
Ecco qui il sorgente, caso mai a qualcun altro servisse.
/********************** cut here *****************************/
#include <windows.h>
#include <stdio.h>
char *unita[]= {
	"ZERO","UNO","DUE","TRE","QUATTRO","CINQUE",
		"SEI","SETTE","OTTO","NOVE"
};
char *decine[] = {
	"ZERO","DIECI","VENTI","TRENTA","QUARANTA","CINQUANTA",
	"SESSANTA","SETTANTA","OTTANTA","NOVANTA"
};
char *eccezioni[] = {
	"DIECI","UNDICI","DODICI","TREDICI","QUATTORDICI",
	"QUINDICI","SEDICI","DICIASSETTE","DICIOTTO","DICIANNOVE"
};
static int vocale( char c )
{
	switch(toupper(c)) {
	case 'A':
	case 'E':
	case 'I':
	case 'O':
	case 'U': return 1;
	default:  return 0;
	}
}
static void PartToWord(unsigned int num, char *outstr)
{
 int i;
 struct {
	 unsigned int num;
 } parts[3];
 unsigned int divs[3] = { 100, 10, 1 };
 for(i=0; i<=2; i++) {
	 parts[i].num = num / divs[i];
	 num = num % divs[i];
 }
 strcpy(outstr,"");
 if( parts[0].num ) {
	 if( parts[0].num != 1 ) {
		 strcat(outstr,unita[parts[0].num]);
	 }
	 strcat(outstr, "CENTO");
 }
 if( parts[1].num ) {
	 if( parts[1].num != 1 ) {
		 strcat(outstr,decine[parts[1].num]);
	 } else {
		 strcat(outstr, eccezioni[parts[2].num]);
	 }
 }
 if( parts[1].num != 1 && (parts[2].num || ! strlen(outstr)) ) {
	 if( vocale(outstr[strlen(outstr)-1]) &&
		 vocale(unita[parts[2].num][0]) ) {
		 outstr[strlen(outstr)-1] = '\0';
	 }
	 strcat(outstr,unita[parts[2].num]);
 }
}
static void NumToWord(char *inpstr, char *outstr)
{
 int i, j, len;
 struct {
	 unsigned int num;
	 char	   str[80];
 } parts[4];
 char tmpchar, tmpstr[13];
 memset(tmpstr,'0',sizeof(tmpstr)-1);
 len = strlen(inpstr);
 strcpy(&tmpstr[sizeof(tmpstr)-1-len],inpstr);
 for(i=j=0; i<=3; i++, j+=3) {
	 tmpchar = tmpstr[j+3];
     tmpstr[j+3] = '\0';
     sscanf(&tmpstr[j],"%d",&parts[i].num);
     tmpstr[j+3] = tmpchar;
 }
 if( parts[0].num + parts[1].num + parts[2].num + parts[3].num
	 == 0 ) {
	 strcpy(outstr, "ZERO");
	 return;
 }
 for(i=0; i<=3; i++) {
	 PartToWord(parts[i].num, parts[i].str);
 }
 strcpy(outstr,"");
 if(parts[0].num) {
	 strcat(outstr, parts[0].str);
	 if(parts[0].num == 1)
		 outstr[strlen(outstr)-1] = '\0';
	 strcat(outstr,"MILIARD");
	 strcat(outstr, (parts[0].num == 1) ? "O" : "I");
 }
 if(parts[1].num) {
	 strcat(outstr, parts[1].str);
	 if(parts[1].num == 1)
		 outstr[strlen(outstr)-1] = '\0';
	 strcat(outstr,"MILION");
	 strcat(outstr, (parts[1].num == 1) ? "E" : "I");
 }
 if(parts[2].num) {
	 if(parts[2].num == 1) {
		 strcat(outstr,"MILLE");
	 } else {
		 strcat(outstr, parts[2].str);
		 strcat(outstr,"MILA");
	 }
 }
 if( parts[3].num ) {
	 strcat(outstr, parts[3].str);
 }
}
void main()
{
 char inpstr[13], outstr[100];
 printf("Digita un numero intero (max 12 cifre) : \n");
 gets(inpstr);
 NumToWord(inpstr, outstr);
 printf("\nHai digitato %s\n", outstr);
}
/********************** cut here *****************************/
