Qué mejor demostración de que un número son palabras que un traductor de números a palabras, así, tan absurdo como este que intenta transformar los números (dígitos) en palabras, especialmente orientado a crear un libro con las palabras de unos cuantos (indeterminados) decimales de números irracionales, pues hay pocas cosas más irracionales que este proyecto absurdo.
/******************************************************** Proyecto tres14 (escrito en C) realizado por Giusseppe Domínguez a partir del día 8 de diciembre de 2019 ********************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <ctype.h> #define OK 1 #define KO 0 #define MAX_LONG 10 // Longitud máxima de nombre de dígito int firma(); int digitea(char caracter); int nombranumero(int idioma, char caracter, char *nombre); int instrucciones(char *comando); int main(int argc, char *argv[]) { int i, idioma=0; char nombrenumero[MAX_LONG], caracter; FILE *fp; if ((argc < 2) || (argc > 3)) { instrucciones(argv[0]); } // Faltan argumentos else if (argc == 2) { // Número desde línea de comando for (i=0; i<strlen(argv[1]); i++) { caracter=argv[1][i]; if(! nombranumero(idioma, caracter, nombrenumero)) { instrucciones(argv[0]); return KO; } puts(nombrenumero); } } else if (argc == 3) { // Número en fichero argv[2] if ( (! isdigit(argv[1][0])) || ((idioma = digitea(argv[1][0])) > 1) ) { printf("[ERROR] No conocemos el idioma: %s\n", argv[1]); instrucciones(argv[0]); } else if ((fp = fopen(argv[2],"r")) == NULL) { printf("[ERROR] intentando abrir el archivo %s\n", argv[2]); instrucciones(argv[0]); } else { while ((caracter = fgetc(fp)) != EOF) { if (caracter != '\n') { // Ignoramos los saltos de línea if (! nombranumero(idioma, caracter, nombrenumero)) { instrucciones(argv[0]); return KO; } printf("%s ", nombrenumero); } } } } printf("\n"); firma(); return OK; } /****************************************** La función instrucciones hace lo que su nombre indica: Imprime las instrucciones del programa. ******************************************/ int instrucciones(char *comando) { printf("\nUtilización: %s [número_positivo] [idioma fichero]\n\n", comando); puts("Si introducimos un nombre de fichero, el primer parámetro indica el idioma"); puts("Idioma puede ser:"); puts("\t0 - Español"); puts("\t1 - Inglés"); } /****************************************** La función nombranumero nombra el número contenido en el caracter (si procede, claro) y devuelve error si no lo consigue. idioma = 0 (español) 1 (inglés) ******************************************/ int nombranumero(int idioma, char caracter, char *nombre) { int digito; static int nomascomas=0; // Para no encontrar más de una coma en un argumento // char *numeros[] = { "cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve" }; char *numeros[2][MAX_LONG] = { { "cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve" }, { "zero", "one", "two", "three", "for", "five", "six", "seven", "eigth", "nine" } }; char *coma[] = { "coma", "point" }; if ((caracter == ',') || (caracter == '.')) { strcpy(nombre, coma[idioma]); if (++nomascomas > 1) { printf("Un número no puede tener más de una coma\n"); return KO; } return OK; } else if (isdigit(caracter)) { digito = digitea(caracter); strcpy(nombre, numeros[idioma][digito]); return OK; } printf("[ERROR] |%c| No es un caracter válido en un número positivo\n", caracter); strcpy(nombre, "ERROR"); return KO; } /****************************************** La función digitea devuelve un número entero a partir del caracter (char) proporcionado ******************************************/ int digitea(char caracter) { int digito; digito = (int) (caracter + '0'); digito -= 96; return digito; } int firma() { time_t tiempo = time(0); struct tm *tiempolocal = localtime(&tiempo); char txt_firma[128]; strftime(txt_firma,128,"\nGiusseppe Domínguez, a las %H:%M. M-%Y%m%d\n",tiempolocal); printf("%s\n",txt_firma); return OK; }