#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 100
int longitud;//LONGITUD DE LA CADENA ENTRADA
int salgo;//BANDERA Q HACE ACABAR EL PROGRAMA SI EL USUARIO HA INSERTADO UNA MALA ENTRADA
char entrada[MAX];//ENTRADA DEL USUARIO
char salida[MAX];//SALIDA YA CONVERTIDA A LETRAS
char actual[MAX];//VALOR DEL NUMERO ACTUAL
char actualposterior[MAX];//VALOR DEL NUMERO POSTERIOR
char revisada[MAX]; //LA ENTRADA UNA VEZ REVISADA PARA Q EL USUARIO NO ENTRE LETRAS
char opcio[MAX]; //OPCION SELECCIONADA 1 CASTELLANO 2 ROMANO
int p;
int aux;
int revisaelnumero(char a_revisar[]);//MIRA Q LA LONGITUD DEL TEXTO SEA MENOR DE 9 Y Q NO HAYAN LETRAS
void traduce_a_Cas(char revisada[]); //FUNCION Q "TRADUCE" AL CASTELLANO
void traduce_a_Rom(int); //FUNCION Q "TRADUCE" AL ROMANO
void interface(); //FUNCION Q PRINTA EL MENSAJE DE BIENVENIDA Y LAS OPCIONES
void Bienvenida(); //TAMBIEN ES LA Q SE ENCARGA DE RECOGER LA ENTRADA DEL USUARIO
/*********************************MAIN DEL PROGRAMA**************************************/
int main()
{
while (salgo != 2)// 0. MIENTRAS NO DECIDAN SALIR...
{
Bienvenida();// LLAMA A LA FUNCION BIENBENIDA...
getche();
interface();//1. MUESTRA EL TEXTO EN PANTALLA Y ESPERA ENTRADA
salgo = revisaelnumero(entrada);//2. REVISA Q LA ENTRADA ESTE BIEN
if (salgo == 0)
{
system("cls");
printf("n_______________________________________________________________nn");
printf("La entrada ha sido erronea! Vuelva a intentarlo!n");
printf("nRecuerde que la longitud maxima son 3 numeros y no ponga letras!!");
printf("n_______________________________________________________________nn");
getche();
main();
}
if (salgo == 3)
{
system("cls");
printf("n_______________________________________________________________nn");
printf("La entrada ha sido erronea! Vuelva a intentarlo!n");
printf("nSolo el Numero 100 es soportado para 3 digitos!!");
printf("n_______________________________________________________________nn");
getche();
main();
}
if (salgo == 2)
{
printf("nAdios!!!n");//3.5 EL USUARIO HA DECIDIDO SALIR
}
else //4. SI LA ENTRADA ESTA BIEN LO TRADUCE AL IDIOMA SELECCIONADO
{
if (strcmp(opcio,"1") == 0)
{
system("cls");
printf("n__________________________________________________________nn");
printf("nSU NUMERO EN PALABRAS:n");
printf("n__________________________________________________________nn");
traduce_a_Cas(entrada);
}
else
{
system("cls");
printf("n__________________________________________________________nn");
printf("nSU NUMERO EN ROMANO:n");
printf("n__________________________________________________________nn");
traduce_a_Rom(p);
}
printf("nn");
printf("%sn ",salida);//5. MUESTRA LA SALIDA
printf("nn");
strcpy(salida,"");//6. VACIO LA SALIDA PARA NO CONCATENAR
getche();
}
}
}
/*************************************FUNCIONES*******************************************/
// FUNCION QUE "TRADUCE" EL NUMERO A EL CASTELLANO
void traduce_a_Cas(char revisada[])
{
char unidades[MAX][MAX]={"uno ","dos ","tres ","cuatro ","cinco ","seis ","siete ","ocho ","nueve "};
char decenas[MAX][MAX]={"diez ","veinte ","treinta ","cuarenta ","cincuenta ","sesenta ","setenta ","ochenta ","noventa "};
char centenas[MAX][MAX]={"ciento ","doscientos ","trescientos ","cuatrocientos ","quinientos ","seiscientos ","setecientos ","ochocientos ","novecientos "};
char decenasespeciales[MAX][MAX]={"diez ","once ","doce ","trece ","catorce ","quince ","dieciseis ","diecisiete ","dieciocho ","diecinueve "};
int numerito;
int numeritoposterior;
int i;
int bandera;
int posicionactual;
longitud = strlen(revisada);
for (i=longitud;i >= 1 ;i--)
{
bandera = longitud - i;
posicionactual = longitud - bandera;
switch(posicionactual)
{
case 1:case 4:case 7: //unidades
actual[0] = revisada[bandera];actual[1] = ' ';
numerito = atoi(actual);
if (numerito != 1)
{
strcat(salida,unidades[numerito-1]);
}
else
{
if (longitud == 4 && posicionactual == 4)
{
}
else if(longitud == 7 && posicionactual == 7)
{
strcat(salida,"un ");
}
else
{
strcat(salida,unidades[numerito-1]);
}
}
break;
case 2:case 5:case 8: //decenas
actual[0] = revisada[bandera];actual[1] = ' ';
numerito = atoi(actual);
actualposterior[0] = revisada[bandera+1];actualposterior[1] = ' ';
numeritoposterior = atoi(actualposterior);
if (numerito == 1)
{
if (numeritoposterior != 0)
{
strcat(salida,decenasespeciales[numeritoposterior]);
i--;
}
else
{
strcat(salida,decenas[numerito-1]);
}
}
else
{
strcat(salida,decenas[numerito-1]);
if (numeritoposterior !=0 && numerito != 0) strcat(salida,"y ");
}
break;
case 3:case 6: //centenas
actual[0] = revisada[bandera];actual[1] = ' ';
numerito = atoi(actual);
if (posicionactual == 6 && longitud > 6)
{
if (longitud == 7 && revisada[bandera-1] == '1')
{
strcat(salida,"millon ");
}
else
{
strcat(salida,"millones ");
}
}
else
if (posicionactual == 3 && longitud > 3)
{
if(revisada[bandera-1] =='0' && revisada[bandera-2] == '0' && revisada[bandera-3] == '0')
{
}
else
{
strcat(salida,"mil ");
}
}
if (numerito == 1 && revisada[bandera+1] == '0' && revisada[bandera+2] == '0')
{
strcat(salida,"cien ");
}
else
{
strcat(salida,centenas[numerito - 1]);
}
break;
}//fin del switch
}//fin del for
} //fin de funcion
/*******************************************/
// FUNCION QUE "TRADUCE" EL NUMERO AL ROMANO
void traduce_a_Rom(int x)
{
while(x>=1000){x-=1000;printf("M");}
while(x>=900){x-=900;printf("CM");}
while(x>=500){x-=500;printf("D");}
while(x>=400){x-=400;printf("CD");}
while(x>=100){x-=100;printf("C");}
while(x>=90){x-=90;printf("XC");}
while(x>=50){x-=50;printf("L");}
while(x>=40){x-=40;printf("XL");}
while(x>=10){x-=10;printf("X");}
while(x>=9){x-=9;printf("IX");}
while(x>=5){x-=5;printf("V");}
while(x>=4){x-=4;printf("IV");}
while(x>=1){x-=1;printf("I");}
} //fin de funcion
/***********************/
// FUNCION DE BIENVENIDA
void Bienvenida()
{
system("cls");
printf("n________________________________________________________________________________nn");
printf("BIENVENIDO SR USUARIOn");
printf("ESTA APLICACION LE PERMITE TRADUCIR NUMEROS A PALABRAS O NUMEROS ROMANOS.n");
printf("n________________________________________________________________________________nn");
printf("presione la tecla ENTERn");
}
/******************/
//FUNCION OPCIONES
void interface()
{
system("cls");
printf("n__________________________________________________________nn");
printf(" Digite un numero entre 1 y 100 , luego presione ENTER.n");
printf(" Si desea salir pulse * y ENTER.n");
printf("n__________________________________________________________nn");
printf("nNumero : ");
scanf("%s",entrada);
p=atoi(entrada);
if (entrada[0] != '*')
{
system("cls");
printf("n__________________________________________________________nn");
printf("nSELECCIONE UN TIPO DE TRADUCCION:n");
printf("n__________________________________________________________nn");
printf("nn");
printf("n[1] - TRADUCIR A PALABRAS.n");
printf("nn");
printf("n[2] - TRADUIR A NUMERO ROMANO.n");
printf("nn");
printf("nOpcion : ");
scanf("n%s",opcio);
}
}
/*********************************************************************************/
//FUNCION Q REVISA EL NUMERO EN BUSCA DE UNA LONGITUD INCORRECTA O CARACTERES ALFA
int revisaelnumero(char a_revisar[])
{
int decision = 1;
int largo;
int i;
largo = strlen(a_revisar);
aux=atoi(a_revisar);
if (aux>100)
{
decision = 3;
}
if ((largo > 3) || (largo < 1)) //MIRO Q LA LONGITUD SEA CORRECTA
{
decision = 0;
}
else if(a_revisar[0] == '*')
{
decision = 2;
}
else
{
for(i=0;i<largo;i++)
{
if(isalpha(a_revisar[i]) != 0) //MIRO Q NO HAYA LETRAS INTRODUCIDAS
{
decision = 0;
}
}
}
return decision;
}