Problema en C (Ayuda)

Buenas me podriáis hacer el favor de ayudarme a codificar un programa a C utilizando funciones y sin strings, lo llevo intentando todo el dia y no lo consigo “Obtener un algoritmo que corresponda a un programa para cambiar de números arabigos a números romanos. Hacer que el usuario solo pueda introducir números menores que 3000”.

Muchas gracias!!!
Pues la idea general creo que podria ser:

1- Declarar un vector de char con cada simbolo romano ordenado de mayor a menor y otro vector de int con cada valor numerico de los simbolos.

2- Hacer una funcion que compare el numero dado con los valores numericos que tienes en el segundo vector empezando por el mayor. Cuando encuentres un valor que puedas restarlo, hazlo y pones el simbolo romano correspondiente a ese valor.

3- Tienes que tener en cuenta que no puedes repetir mas de 3 veces el mismo simbolo. Asi que, tendras que ir guardandote la informacion y mostrarla solo cuando cuando sepas que no se repite mas de 3 veces o cambiarlo por la forma correcta si se repitiera.

Ej.

Num 400.
Como maximo le puedes restar 100.
400 - C (la C sin mostrar aun, solo guardada).
300 - CC
200 - CCC
100 - Aqui ves que tocaria otra C, pero como llevabas 3 tienes que cambiar esas 3 C por un simbolo superior (D) y seguir normal (ademas, ya puedes mostrarlo)
100 - DC
0 Ya esta!

Empieza con el codigo y te vamos ayudando mejor.

Saludos!
Una duda nen, el autor dice sin strings, pero un vector de char no es un string?
srpatato escribió:Una duda nen, el autor dice sin strings, pero un vector de char no es un string?


Tecnicamente si, pero no se accede a el como si fuera String. Es decir, no lees su contenido de golpe, accedes a cada char de forma independiente.

Edito. Por si te pusieran pegas por el vector de chars, a ver si alguien te propone otra idea por aqui. Supongo que se puede conseguir lo mismo con una funcion que vaya comparando primero con el caracter M, luego el D,...
El problema es que tampoco hemos dado vectores de momento.

Si m pudieséis ayudar un poco con el pseudo-código...
¿Y a base de switchs?

Por ejemplo:

res = num/1000;
for (int n=0;n<res;n++) printf("M");
res = (num%1000) /100;
switch (res)
{
case 0:
break;
case 1: printf("C");
break;
case 2: printf("CC");
break;
case 3: printf("CCC");
break;
case 4: printf("DC");
break;
case 5: printf("D");
break;
case 6: printf("DC");
break;
case 7: printf("DCC");
break;
case 8: printf("DCCC");
break;
case 9: printf("CM");
break;
}

Y tal... No se muy bien como van los números romanos...
Pero entonces serían infinitos los switches, no?
JaguarSpen escribió:Pero entonces serían infinitos los switches, no?


No, millares, centenas, decenas y unidades. El bucle para los millares, tres switch para los otros...
//el numero arabico esta en n
while (n >= 1000){
    printf ("M"); //supongo que este string sera valido no?
    n -= 1000;
}
if (n >= 900) {
    printf("CM");
    n -= 900;
}
if (n >= 500) {
    printf("D");
    n -= 500;
}
if (n >= 400) {
    printf("CD");
    n -=400;
}
while (n >= 100) {
    printf("C");
    n -= 100;
}
if (n >= 90) {
    printf("XC");
    n -= 90;
}
if (n >= 50) {
    printf("L");
    n -= 50;
}
if (n >= 40) {
    printf("XL");
    n -= 40;
}
while (n >= 10) {
   printf("X");
   n -= 10;
}
if (n >= 9) {
    printf("IX");
    n -= 9;
}
if (n >= 5) {
    printf("V");
    n -= 5;
}
if (n >= 4) {
    printf("IV");
    n -= 4;
}
while (n >= 1) {
   printf("I");
   n -= 1;
}

//FIN


diria que asi cuela.

hay una forma mas elegante y corta que es utilizando una funcion auxiliar, pero me da pereza y prefiero poner copi-paste y cambiar un par de letras.

lo he hecho en un segundo, asi que puede tener algun error de compilacion, o algun numero me habre equivocado o una chorrada varia, pero esta es la esencia


PD: DCCC es 800 no 400 (para el primero en responder)
(el que ha puesto el codigo antes que yo) DC es 600, no 400(supongo que ha sido un lapsus) pero aparte tu codigo solo le falta poner la parte de decenas y unidades, y funciona bien(creo, lo digo a ojimetro)
xgc1986 escribió:
//el numero arabico esta en n
while (n >= 1000){
    printf ("M"); //supongo que este string sera valido no?
    n -= 1000;
}
if (n >= 900) {
    printf("CM");
    n -= 900;
}
if (n >= 500) {
    printf("D");
    n -= 500;
}
if (n >= 400) {
    printf("CD");
    n -=400;
}
while (n >= 100) {
    printf("C");
    n -= 100;
}
if (n >= 90) {
    printf("XC");
    n -= 90;
}
if (n >= 50) {
    printf("L");
    n -= 50;
}
if (n >= 40) {
    printf("XL");
    n -= 40;
}
while (n >= 10) {
   printf("X");
   n -= 10;
}
if (n >= 9) {
    printf("IX");
    n -= 9;
}
if (n >= 5) {
    printf("V");
    n -= 5;
}
if (n >= 4) {
    printf("IV");
    n -= 4;
}
while (n >= 1) {
   printf("I");
   n -= 1;
}

//FIN


diria que asi cuela.

hay una forma mas elegante y corta que es utilizando una funcion auxiliar, pero me da pereza y prefiero poner copi-paste y cambiar un par de letras.

lo he hecho en un segundo, asi que puede tener algun error de compilacion, o algun numero me habre equivocado o una chorrada varia, pero esta es la esencia


PD: DCCC es 800 no 400 (para el primero en responder)
(el que ha puesto el codigo antes que yo) DC es 600, no 400(supongo que ha sido un lapsus) pero aparte tu codigo solo le falta poner la parte de decenas y unidades, y funciona bien(creo, lo digo a ojimetro)


Vaya, no queria decir DCCC, solo DC. Pero si, un fallo poner la C la derecha XD.

Saludos!
no pasa nada xD

pero igualmente en tu codigo puede ser un poco tediosa a la hora de implementar, ya que vas de menos a mas, es decir primero pones C y luego una D si es necesario, es mas facil comprobar si esta ente 400 y 499 directamente como lo hace greatxavi o yo.
Lo que no acabo de ver claro es que le pidan que no use strings (¿Qué entienden por strings en C pelado?) y que usen funciones (¿Cuantas funciones?).

Por que si vamos a lo bruto con una función basta: bool itor(int i; char* r); donde r es un vector con los caracteres romanos. Y dentro de la función hacer la conversión. A no ser que consideren que un array de chars es un vector, que entonces no sé yo como embutir ahí una función, a no ser que la misma vaya escribiendo el resultado en pantalla...
Y si, el 400 es CD... Temas del C&P y las prisas...
11 respuestas