Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/01/2006, 11:33
Avatar de Mephisto
Mephisto
 
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 8 meses
Puntos: 3
Este es el programa corregido...

#include <stdio.h>
#include <conio.h>

void romano(int,int);
void romano2(char,char,char,int);
void escribe(char,int);

void main()
{
int num,num2,div;

do{
clrscr();
printf("Introduzca numero decimal a convertir (0 para salir) => ");
scanf("%d",&num);
num2=num;
if(num!=0)
{
div=1000;
printf("El numero romano equivalente es => ");
while(num!=0)
{
romano(num/div,div);
num=num%div;
div=div/10;
}
getch();
fflush(stdin);
}
}while(num2!=0);

}

///////////////////////////////////////////////////////////////////////////////

void romano(int cant,int div)
{
switch(div)
{
case 1000: romano2('M',' ',' ',cant);
break;

case 100: romano2('C','D','M',cant);
break;

case 10: romano2('X','L','C',cant);
break;

case 1: romano2('I','V','X',cant);
break;

}
}

///////////////////////////////////////////////////////////////////////////////

void romano2(char u, char d, char c,int cant)
{
switch (cant)
{
case 1:
case 2:
case 3: escribe(u,cant);
break;
case 4:
case 5: escribe(u,5-cant);
escribe(d,1);
break;
case 6:
case 7:
case 8: escribe(d,1);
escribe(u,cant-5);
break;
case 9:
escribe(u,1);
escribe(c,1);
break;

}
}

///////////////////////////////////////////////////////////////////////////////

void escribe(char car,int veces)
{
int i;

for(i=1;i<=veces;i++)
{
putchar(car);
}
}

Los problemas que tenias eran los siguientes:
* En la funcion romano tenias un printf() que te mandaba el primer caracter a la pantalla cuando en realidad lo que se necesitaba era llamar a la funcion romano 2 que es la que aplica las condiciones para la conversion.
* En esos mismos printf(), al cambiar a la funcion romano2(), se requiere modificar las comillas " " por apostrofes ' ' ya que estas sirven para mandar un caracter y las comillas para mandar cadenas de caracteres.
*En los mismos printf(), el orden si lo ves de abajo hacia arriba es 1,5,10 (I,V,X); 10,50,100 (X,L,C); y en la ultima estaba 100, 1000, 500 (C, M, D) y la logica de la funcion romano2() se establece para que el utlimo lo cambies por 100, 500, 1000 (C, M, D)
*En el case 10: de la funcion romano() mandas printf("X","L","C"); y tendría que ser printf('X','L','C',cant)
* Finalmente en el case 9: de la funcion romano2() solo se manda imprimir una vez cada caracter, esto es:
escribe(u,1);
escribe(d,1);
* Otra cosa que no es relevante pero optimazaria el codigo es el eliminar de la funcion romano2() el char c, ya que no se usa...aunque esto no provoca errores en el programa...
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...