Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Caster

#61
Buenas, aqui estoy de nuevo, me da mucha rabia postear porque estais haciendo eel trabajo vosotros y no yo, pero es que no logro ver los fallos, supongo que sera por la falta enorme de practica que tengo. El programa, teóricamente, está terminado pero no se porque motivo no da el resultado esperado, aqui el codigo:
#include <stdio.h>
#include <math.h>

int main()
{
int num, i, j, cant_decimal = 0, z;
int digitos[3];
char letras[4][3] = { 'I', 'V', 'X'
                                             'X', 'L', 'C',
                                             'C', 'D', 'M',
                                             'M'};
char digito_romano[20];
printf("Introduzca el numero (máximo 3 digitos):\n");
scanf("%d", &num);

for (i = 2; i >= 0; i--)
{
digitos[i] = num / (pow(10, i));
num -= digitos[i] * (pow(10, i));
}
   printf("%d\n", digitos[0]);
   printf("%d\n", digitos[1]);
   printf("%d\n", digitos[2]);

for(j = 0; j <= 3; j++)
{
switch(digitos[j])
{
case 1:
case 2:
case 3:
for( i = 0; i < digitos[j]; i++ )
digito_romano[i] = letras[cant_decimal][0];
break;

case 4:
for( i = 0; i < 2; i++ )
digito_romano[i] = letras[cant_decimal][i];
break;

case 5:
digito_romano[0] = letras[cant_decimal][1];
i++;
break;

case 6:
case 7:
case 8:
digito_romano[0] = letras[cant_decimal][1];
for( i = 1; i <= digitos[j] - 5; i++ )
digito_romano[i] = letras[cant_decimal][0];
break;

case 9:
digito_romano[0] = letras[cant_decimal][0];
digito_romano[1] = letras[cant_decimal][2];
i = 2;
break;
}

digito_romano[i] = '\0';
cant_decimal++;
}
for(z=0; z <= 20; z++)
printf("%c", digito_romano[z]);

return 0;
}


Probe con algunos numeros y haciendolo mentalmente con el codigo delante aparentemente funciona bien pero seguro que hay algun detalle que se me escapa porque sino tendria que funcionar bien el programa y de verdad que no doy visto donde esta el fallo, porque apostaria a que es una tonteria.

Un saludo

EDITO:Revisando el codigo me fije en que el fallo puede estar en los for's dentro del switch ya que puede ser problema de que la variable i que se utiliza en esos ciclos se ponga a 0 cada ez que se cmabia de cifra entonces eso de problemas, no se.
#62
Cita de: ivancea96 en 13 Mayo 2014, 22:45 PM
"int digitos[2];"
Estás diciendo que el array tiene 2 casilles (0 y 1). No debes acceder a digitos[2].

Estaba haciéndolo desde el punto de vista de que digitos[2] significaba que existia digitos[0], digitos[1] y digitos[3], muchas gracias.

Un saludo
#63
No me estas entendiendo lo que te quiero decir, lo que no es el patrón que siguen los numeros, no entiendo a que te refieres más arriba cuando me lo explicas con  "se le resta la unidad al numero del medio"




Y aprovecho ya, porque pense que lo de separar los digitos de los numeros me iba bien pero ya me esta dando problemas, tenog este codigo:
#include <stdio.h>
#include <math.h>

int main()
{
int num, i;
int digitos[2];
printf("Introduzca el numero (maximo 3 digitos):\n");
scanf("%d", &num);

for (i = 2; i >= 0; i--)
{
digitos[i] = num / (pow(10, i));
num -= digitos[i] * (pow(10, i));
}

printf("%d\n", digitos[0]);
printf("%d\n", digitos[1]);
printf("%d\n", digitos[2]);
return 0;
}


Los printf son simplemente para ver si da el resultado esperado, la salida de este programa es (introduciendo 123):

Citar-9
-9
0

Cuando la salida esperada sería:
Citar3
2
1

Sin embargo si el array digitos lo declaro como digitos[3] el programa arroja el resultado esperado y no entiendo donde radica la diferencia.

Un saludo.

EDITO:Ya entendi el funcionamiento del algoritmo, solo me queda saber el error que me da al separar el numero en digitos, muchas gracias.
#64
Ya he empezado a peleame con el código por la parte de separar los digitos de los numeros, esto lo llevo bien, lo que no termino de entender es el patrón que siguen los numeros romanos, el primer punto creo que lo entiendo, cuando en las unidades o decenas o centenas... aparece el numero 3, se repiten 3 veces, por ejemplo, 376, en las centenas a parece el numero 3 por lo tanto en romanos el numero empezara por CCC... lo que si que no entiendo son el resto de puntos a partir de este.

Un saludos
#65
Pero sin embargo si introduces los números 15 y 1, el total es 16 por lo tanto al dividir 15/16 en los alumnos aprobados el resultado es 0.9... lo que redondea a 1 y multiplicado por 100 es 100 no 0 y el resultado que da el programa es 0.

Un saludo
#66
Cita de: Blaster en 12 Mayo 2014, 23:38 PM
En el codigo de Spiderboot al dividir el número de aprobados por el total, el resultado siempre es cero ya que en C siempre se trunca cualquier valor real donde interviene el tipo int pasandolo al entero mas cercano y luego al multiplicarlo por cien da el cero que mencionas

Saludos





Al dividir 15/35 da 0.4... por lo tanto lo redondea a 0 y después al multiplicarlo por 100 sigue dando cero, ¿no?
#67
Cita de: ivancea96 en 11 Mayo 2014, 16:39 PM
Para esos 9 sería:
9*10^X <= n < 10*10^X

Perdón, se me olvidó ponerlo: X sería la cifra. En fin, ignóralo.

Vas a tener que perdonar mi torpeza pero no terminé de entenderlo, ¿la cifra? Entonces si la cifra es 234 sería 9x10^234, eso es un número enorme. Y después, esa sería la condición, ¿pero que tendría que hacer en ese caso?

erest0r, no entendí muy bien el patrón que siguen, a partir del número 4 me perdi.

Muchas gracias, un saludo.
#68
¿Y por qué el resultado es 0 haciendo las operaciones sin paréntesis?
#69
No lo entendí muy bien

Cita de: ivancea96 en 11 Mayo 2014, 15:37 PM
Al final, se reduciría a 4 condiciones en cada cifra:
1*10^X <= n < 4*10^X
4*10^X <= n < 5*10^X
5*10^X <= n < 9*10^X
9*10^X <= n < 10*10^X

¿Qué son esas X?

Haciéndolo con el 379 por ejemplo:

379:
Si está entre 100 <= n < 500: C -> restamos 100
279:
Si está entre 100 <= n < 500: C -> restamos 100
179:
Si está entre 100 <= n < 500: C -> restamos 100
79:
Si está entre 50 <= n < 100: L -> restamos 50
29:
Si está entre 10 <= n < 50: X -> restamos 10
19:
Si está entre 10 <= n < 50: X -> restamos 10

Quedan 9, siguiendo el mismo proceso primero se restaría 5(V) y despues 4(IIII) y quedaría por lo tanto CCCLXXVIIII pero el correcto sería CCCLXXIX, creo que no era algo así lo que dices tu, pero no lo entendí.

Un saludo
#70
Buenas a todos, estoy intentando hacer un programa que pase de números arábigos a romanos, busqué en el foro pero solo encontré un par de temas en los que se hablaba de como hacer el proceso a la inversa. Lo que yo había pensado era darle a programa las equivalencias entre los numeros romanos y los arábigos e ir comparando, me explico:
-Si tenemos el numero 200, el numero romano mas grande que podemos utilizar para representar el 200 es C, entonces se escribe una C y se resta a 200, quedarían otros 100 y por lo tanto se pondría otra C, 200= CC.
-Lo mismo por ejemplo con el número 1200, el romano mas cercano al 1200 y que no sea mayor es M, se restaria a 1200 quedando 200, y a partir de aqui igual que el proceso para el número anterior.

El problema viene si se trata del número 4 por ejemplo, V no valdría porque es mayor entonces, siguiendo el mismo proceso de antes, seria IIII, pero eso tampoco es posible, quería alguna orientación para saber como resolver este problema o hacia donde orientar mi programa, muchas gracias.

Un saludo.