//Henry sanabria fuentes
//Universidad Federico Villarreal Lima-Peru
#include<dos.h> /*delay*/
#include<conio.h>/*putch y cprintf y formato de colores ,tambien gotoxy*/
#include<ctype.h>/*toupper*/
#include<stdlib.h>(exit y atoi)
#include<string.h>/*strlen (longitud de cadena)*/
int ind;
void fondo()
{
int i;
textcolor(7);
for(i=0;i<=80*25;i++)
cprintf("²");
gotoxy(1,25);
textattr(15 + BLINK);
textbackground(1);
cprintf("Esc PARA SALIR/ROMANOS A DECIMALES ");
gotoxy(37,25);
textcolor(14+BLINK);
cprintf("UNICOS CARACTERES PERMITIDOS I,V,X,L,C,D,M " );
}
void recuadro()
{
int i;
textcolor(0);
for(i=1;i<=11;i++)
{
gotoxy(15,7+i);
cprintf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ");
}
textcolor(7);
for(i=1;i<=11;i++)
{
gotoxy(18,6+i);
cprintf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ");
}
textcolor(0);
textbackground(7);
for(i=1;i<=9;i++)
{
gotoxy(19,7+i);
putch('º');
gotoxy(57,7+i);
putch('º');
}
for(i=1;i<=37;i++)
{
gotoxy(19+i,7);
putch('Í');
gotoxy(19+i,17);
putch('Í');
}
gotoxy(19,7);
putch('É');
gotoxy(19,17);
putch('È');
gotoxy(57,17);
putch('¼');
gotoxy(57,7);
putch('»');
}
/**********************************************************/
void pon_texto()
{
gotoxy(25,9);
cprintf("-*CONVERSION A DECIMAL*-");
gotoxy(21,12);
cprintf("INGRESE UN NUMERO ROMANO DE 0-999");
gotoxy(25,15);
cprintf("NUMERO:");
gotoxy(34,15);
textbackground(0);
cprintf(" ");
}
/**********************************************************/
void cuadro_mensaje(int x,int y,int x1,int y1,char *msg,char *r,int colortext,int colorant,int ind=0)
{
char bufer[4800];
int i,j,corx,cory;
corx=wherex();
cory=wherey();
gettext(x-2,y-1,x1+1,y1+1,bufer);
textcolor(0);
for(i=1;i<=(x1-x);i++)
{
gotoxy(x-2+i,y1+1);
cprintf("Û");
}
for(i=1;i<=(y1-y);i++)
{
gotoxy(x-1,y+1+i);
cprintf("Û");
gotoxy(corx,cory);
}
textbackground(1);
window(x,y,x1,y1);
clrscr();
gotoxy(5,2);
textcolor(colortext);
cprintf("%s",msg);
gotoxy(5,2+strlen(msg));
cprintf("%s",r);
textcolor(15);
gotoxy(1,1);
putch('É');
gotoxy(1,y1-y+1);
putch('È');
gotoxy((x1-x),(y1-y)+1);
putch('¼');
gotoxy(x1-x,1);
putch('»');
for(i=0;i<=(y1-y)-2;i++)
{
gotoxy(1,i+2);
putch('º');
gotoxy(x1-x,i+2);
putch('º');
}
for(i=0;i<=(x1-x)-3;i++)
{
gotoxy(i+2,y1-y+1);
putch('Í');
gotoxy(i+2,1);
putch('Í');
}
if(ind==0)
getch();
else
delay(150);
puttext(x-2,y-1,x1+1,y1+1,bufer);
window(1,1,80,25);
gotoxy(corx,cory);
textbackground(colorant);
}
/**********************************************************/
void cambia(char *x)/*CAMBIA DE MINUSCULA A MAYUSCULA ccxc a CCXC*/
{ /*se manda la direccion para que cambie la cadena original*/
int i=0;
ind=1;
while(x[i]!='\0')
{
if(x[i]>='a'&&x[i]<='z' )
{
x[i]=toupper(x[i]);/*toupper usa ctype.h*/
ind=0;
}
i++;
}
}
/**********************************************************/
int valida(char *x)/*verifica si caracteres ingresados son validos*/
{
int v,i=0;
int j;
char car;
if(x[0]=='\0') /* cadena vacia*/
return 0;
while(x[i]!='\0')
{
if(x[i]=='I'|| x[i]=='V' || x[i]=='X' || x[i]=='L' || x[i]=='C'|| x[i]=='D' || x[i]=='M')/*tienen que numeros validos I,V,X,L,D,M no U,J,K*/
i++; /*se ponen en mayuscula('M') porque ya fueron cambiados si estaban minuscula (no ('m')*/
else
return 0;
}
i=0;
while(x[i]!='\0')
{
car=x[i];
for(j=i+1;j<=strlen(x);j++)
if(car==x[j]&&(car=='V'||car=='L'||car=='D'))
return 0;
i++;
}
i=0;
j=0;
while(i<strlen(x)-1){
switch(x[i]){
case 'I':if(x[i+2]=='X'||x[i+2]=='C'||x[i+2]=='M'||x[i+2]=='D'||x[i+2]=='V'||x[2+i]=='L')
return 0;
break;
case 'V':if(x[i+1]!='I')
return 0;
break;
case 'X':if(x[i+1]=='D'|| x[i+1]=='M')
return 0;
break;
case 'L':if(x[i+1]=='D'||x[i+1]=='M')
return 0;
break;
}
i++;
}
i=0;
car=x[0];
while(x[i]!='\0' ||i<=strlen(x)) /*no puede ver mas de 3 iguales de forma seguida ejemplo III(valido en cambio) IIII (no)*/
{
v=0;
while(car==x[i])
{
v++;
i++;
}
if(v>3&&(car|| car=='I' ||car=='X'||car=='C'||car=='M'))/*no se pueden repetir mas de 3 veces*/
return 0;
car=x[i];
}
for(j=0;(j<=strlen(x)-3)&&strlen(x)>=3;j++)/*comprueba los numeros esten ingresados en forma secuencialejemplo MMCVI y no (MDMM o IVI) */
{
car=x[j];
i=j;
while(x[i]!='\0'||i+3<=strlen(x))
{
if(x[i+3]==car)
// if(x[i+2]==car)
return 0;
i++;
}
}
return 1;
}
/**********************************************************/
void borracadena(char *m,int x,int y)
{
int i=0;
while(m[i]!='\0')
{
m[i]=' ';
i++;
}
gotoxy(x,y);
cprintf("%s",m);
}
/****************************************************/
int decimal(char *x)
{
int num=0,i=0;
while(x[i]!='\0')
{
switch(x[i])
{
case 'I':if(x[i+1]=='V' || x[i+1]== 'X'|| x[i+1]=='L'|| x[i+1]=='C' || x[i+1]=='D'|| x[i+1]=='M')
num=num--;
else
num++;break;
case 'V': num=num+5;
break;
case 'X': if(x[i+1]=='L' || x[i+1]=='C'||x[i+1]=='D' || x[i+1]=='M')
num=num-10;
else
num=num+10;break;
case 'L': num=num+50;break;
case 'C': if(x[i+1]=='D' || x[i+1]=='M')
num=num-100;
else
num=num+100;break;
case 'D': num=num+500;break;
case 'M': num=num+1000;break;
}
i++;
}
return num;
}
void terminar()
{
textattr(14+BLINK);
textbackground(1);
gotoxy(1,25);
cprintf(" ") ;
gotoxy(21,25);
cprintf("PRESIONE UNA TECLA PARA TERMINAR");
textbackground(0);
}
/****************************************************/
void main()
{
char rom[13],car;
int i,band,num;
clrscr();
fondo();
recuadro();
pon_texto();
textcolor(15);
textbackground(0);
otro:
gotoxy(35,15);
i=0;
car=' ';
while(i<=12)
{
if(i==11)
cuadro_mensaje(20,10,60,12,"ULTIMO CARACTER POSIBLE A INGRESAR","",14,0);
car=getch();
if (car==27)/*si car es igual a Esc*/
{
clrscr();
exit(0);
}
if(car!=13) /*si car es diferente de enter*/
{
cprintf("%c",car);
rom[i++]=car;
}
else
goto fin;/*etiqueta goto entonces de esta linea se saltara demde se encuentre la palabra fin: */
} /*cuando presonas enter*/
fin:
rom[i]='\0';
cambia(rom);
if(ind==0)/*ind en funcion cambia() si hay cambio de minuscula a mayuscula se le da valor 0*/
{ /*para que despues se pueda visualizar el cambio al converitrlo*/
gotoxy(35,15); /*si ind=1 es porque no a vido ningun cambio y no se necesitar visualizarlo congelando la pantalla con getch*/
cprintf("%s",rom);
getch();
}
band=valida(rom);
if(band==0)
{
cuadro_mensaje(25,8,65,11,"VALOR NULO O NO ES NUMERO ROMANO\n\r O NO CONCUERDA","",14,0);
borracadena(rom,35,15);
goto otro;
}
num=decimal(rom);
itoa(num,rom,10);
if(num>999)
{
terminar();
cuadro_mensaje(20,7,50,11,"NUMERO MAYOR QUE 999:\n\r RESULTADO ",rom,14,0);
borracadena(rom,35,15);
goto otro;
}
else
{
cuadro_mensaje(25,1,50,4,"VALOR EN DECIMAL\r\n RESULTADO: ",rom,14,0);
for(i=1;i<=18;i++)
cuadro_mensaje(25,1+i,50,4+i,"VALOR EN DECIMAL\r\n RESULTADO: ",rom,14,0,1);
}
terminar();
if(num<=999)
cuadro_mensaje(25,19,50,22,"VALOR EN DECIMAL\r\n RESULTADO: ",rom,14,0,0);
}
Comentarios sobre la versión: Versión 1 (0)
No hay comentarios