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;
}