Fase Territoriale 2001
Scrivete un programma che, dato un numero intero compreso tra 1 e 99 inclusi, scriva la parola italiana corrispondente.
Dati in input
Il file input.txt contiene un numero compreso tra 1 e 99 inclusi.
Il file è costituito da un’unica riga di testo, contenente una o due cifre da 0 a 9.Dati in output
Il programma, dopo aver letto il file di input, deve fornire la parola corrispondente in italiano, e scriverla su un file di nome output.txt.
Più precisamente, il file output.txt deve contenere un’unica riga.
Su questa riga dovrà comparire la parola italiana corrispondente al numero.Assunzioni
- Il file di input non contiene altri caratteri oltre a quelli precisati.
- Qualora lo stesso numero possa essere espresso in più forme, scegliere sempre la più breve (per esempio, “ventuno” e non “ventiuno” o “ventieuno”, “ottantuno” e non “ottantauno” o “ottantaeuno”).
Nel caso precedente, scrivere “ventieuno” al posto di “ventuno” è considerato un errore.
Allo stesso modo, uno spazio nella parola è considerato un errore.- I caratteri accentati devono essere inseriti privi di accento (per esempio, “trentatre” e non “trentatrè” o “trentatre'”).
- Importante! Il programma non deve scrivere nulla sul video, e non deve interagire con l’utente.
Deve solo leggere il file di input e scrivere il file di output.- L’esecuzione del programma deve terminare entro 5 secondi.
Esempi
input.txt output.txt 12 dodici 23 ventitre 88 ottantotto
Utilizzo le funzioni C per le stringhe: strlen() strcat() strcpy().
/* www.valcon.it/ OII 2001 - Fase territoriale - NUMERI */ #include#include int main() { char *cifre[] = { "zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove" }; char *decine[] = { "venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta" }; int N; FILE *fileIN =fopen("input.txt", "r"); fscanf(fileIN, "%d", &N); fclose(fileIN); char numero[25]; if(N < 20) strcpy(numero, cifre[N]); else { int decina=N/10; int unita=N%10; strcpy(numero, decine[decina-2]); if(unita != 0) { if(unita==1 || unita==8) numero[strlen(numero)-1]=''; strcat(numero, cifre[unita]); } } FILE *fileOUT=fopen("output.txt", "w"); fprintf(fileOUT, "%sn", numero); fclose(fileOUT); return 0; }
Osserva
- Ho aggiunto il trattamento del tre e del trè
- La struttura switch() è più sintetica rispetto a if()…else…
/* www.valcon.it/ OII 2001 - Fase territoriale - NUMERI */ #include#include int main() { char *cifre[] = {"zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove" }; char *decine[] = {"venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta"}; int N; FILE *fileIN =fopen("input.txt", "r"); fscanf(fileIN, "%d", &N); fclose(fileIN); char numero[30]; if(N < 20) strcpy(numero, cifre[N]); else { strcpy(numero, decine[N/10-2]); N=N%10; switch(N) { case 0: break; // case 3: strcat(numero, "trè"); break; case 1: case 8: numero[strlen(numero)-1]='\0'; default: strcat(numero, cifre[N]); } } FILE *fileOUT=fopen("output.txt", "w"); fprintf(fileOUT, "%s\n", numero); fclose(fileOUT); return 0; }