Foros del Web » Programación para mayores de 30 ;) » Programación General »

Buscando errores

Estas en el tema de Buscando errores en el foro de Programación General en Foros del Web. Este programa te saca la equivalencia en numeros romanos de la cantidad que metas, tengo que encontrar los errores, pero no llevo mucho tiempo programando ...
  #1 (permalink)  
Antiguo 17/01/2006, 16:19
 
Fecha de Ingreso: junio-2005
Mensajes: 53
Antigüedad: 19 años, 3 meses
Puntos: 0
Buscando errores

Este programa te saca la equivalencia en numeros romanos de la cantidad que metas, tengo que encontrar los errores, pero no llevo mucho tiempo programando y a lo mejor peco unppoco de novatilla, alguien me podria decir donde estan los fallos o que es lo que deberia poner??
Grasias

#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: printf("M",cant);
break;

case 100: printf("C","M","D",cant);
break;

case 10: printf("X","L","C");
break;

case 1: printf("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,5-cant);
escribe(d,1);
break;

}
}

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

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

for(i=1;i<=veces;i++)
{
putchar(car);
}
}
  #2 (permalink)  
Antiguo 19/01/2006, 11:33
Avatar de 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...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:09.