elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar numeros enteros arábigos a romanos, por donde empezar.
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Pasar numeros enteros arábigos a romanos, por donde empezar.  (Leído 12,648 veces)
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #10 en: 13 Mayo 2014, 22:39 pm »

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:
Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main()
  5. {
  6. int num, i;
  7. int digitos[2];
  8. printf("Introduzca el numero (maximo 3 digitos):\n");
  9. scanf("%d", &num);
  10.  
  11. for (i = 2; i >= 0; i--)
  12. {
  13. digitos[i] = num / (pow(10, i));
  14. num -= digitos[i] * (pow(10, i));
  15. }
  16.  
  17. printf("%d\n", digitos[0]);
  18. printf("%d\n", digitos[1]);
  19. printf("%d\n", digitos[2]);
  20. return 0;
  21. }

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:
Citar
3
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.


« Última modificación: 13 Mayo 2014, 22:49 pm por Caster » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #11 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].


En línea

Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #12 en: 13 Mayo 2014, 22:50 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
En línea

erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #13 en: 13 Mayo 2014, 23:35 pm »

Tienes un contador inicializado en 0, y se introduce ejemplo el 376, entonces extraes el 6 en una variable y lo evaluas en el switch, la variable donde dice "cant_decimal" es donde va tu contador, en ese primer caso seria 0, y es correcto porque 6 pertenece a las unidades, y lo guardas en un vector de caracteres, luego haces lo mismo con el 7, en ese caso aumenta tu contador, y evaluas a 7 en la segunda fila que son las decenas otra vez con el switch y lo vas almacenando tambien en el vector de caracteres, y asi sucesivamente.

NOTA: Debes estar pendiente cuando guardes en el vector porque los numeros se almacenaran de atras para adelante.

376 = CCCLXXVI, si lo guardas a lo loco en el vector te saldra VILXXCCC.

No se si me he explicado bien.
En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #14 en: 17 Mayo 2014, 00:34 am »

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:
Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main()
  5. {
  6. int num, i, j, cant_decimal = 0, z;
  7. int digitos[3];
  8. char letras[4][3] = { 'I', 'V', 'X'
  9.                                              'X', 'L', 'C',
  10.                                              'C', 'D', 'M',
  11.                                              'M'};
  12. char digito_romano[20];
  13. printf("Introduzca el numero (máximo 3 digitos):\n");
  14. scanf("%d", &num);
  15.  
  16. for (i = 2; i >= 0; i--)
  17. {
  18. digitos[i] = num / (pow(10, i));
  19. num -= digitos[i] * (pow(10, i));
  20. }
  21.    printf("%d\n", digitos[0]);
  22.    printf("%d\n", digitos[1]);
  23.    printf("%d\n", digitos[2]);
  24.  
  25. for(j = 0; j <= 3; j++)
  26. {
  27. switch(digitos[j])
  28. {
  29. case 1:
  30. case 2:
  31. case 3:
  32. for( i = 0; i < digitos[j]; i++ )
  33. digito_romano[i] = letras[cant_decimal][0];
  34. break;
  35.  
  36. case 4:
  37. for( i = 0; i < 2; i++ )
  38. digito_romano[i] = letras[cant_decimal][i];
  39. break;
  40.  
  41. case 5:
  42. digito_romano[0] = letras[cant_decimal][1];
  43. i++;
  44. break;
  45.  
  46. case 6:
  47. case 7:
  48. case 8:
  49. digito_romano[0] = letras[cant_decimal][1];
  50. for( i = 1; i <= digitos[j] - 5; i++ )
  51. digito_romano[i] = letras[cant_decimal][0];
  52. break;
  53.  
  54. case 9:
  55. digito_romano[0] = letras[cant_decimal][0];
  56. digito_romano[1] = letras[cant_decimal][2];
  57. i = 2;
  58. break;
  59. }
  60.  
  61. digito_romano[i] = '\0';
  62. cant_decimal++;
  63. }
  64. for(z=0; z <= 20; z++)
  65. printf("%c", digito_romano[z]);
  66.  
  67. return 0;
  68. }

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.
« Última modificación: 17 Mayo 2014, 00:51 am por Caster » En línea

erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #15 en: 17 Mayo 2014, 01:22 am »

Amigo el error esta en que el codigo que te sugeri esta pensado para estar en una funcion, y "digito_romano" practicamente seria un arreglo donde se almacena cada digito que despues se pasaria a un arreglo que es donde estarian todos los numeros transformados, es decir, ejemplo:

Código
  1. void funcion( char romano[] )
  2. {
  3.    char digito_romano[4] = { 'I', 'I', 'I', '\0' };
  4.    strcat(romano, digito_romano);
  5. }
  6.  

Porque como podras ver, cada vez que se ejecutaba el switch, todos los datos se volvian a escribir desde el principio en "digito_romano".

Ahora por la forma en que lo tienes, puedes usar una variable contadora que te lleve la posicion actual de cada casilla de tu arreglo digito_romano, asi donde iria digito_romano[ i ] o digito_romano[0], seria algo del tipo digito_romano[pos_digito++]. Y probablemente algunas instrucciones que estan alli quizas ya no sean necesarias.

Como te dije anteriormente en una nota, el resultado de los numeros romanos te va a salir de atras para adelante, eso lo acomodaras. Otra cosa inicializa tu arreglo "digito_romano" por eso es que arroja esos valores basuras y tu for(j) va hasta <= 2 no <= 3.



Saludo.
En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #16 en: 18 Mayo 2014, 16:39 pm »

Ya tengo el código y creo que funciona bien, solo me queda saber como hacer para que desaparezcan esos caracteres basura que aparecen en el array, lei sobre la funcion memsert y lo hice asi:

Código
  1. memset(digito_romano, 0, 4);

Pero no consigo hacer que desaparezcan esos caracteres basura.

Un saludo
En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #17 en: 18 Mayo 2014, 16:55 pm »

Ya tengo el código y creo que funciona bien, solo me queda saber como hacer para que desaparezcan esos caracteres basura que aparecen en el array, lei sobre la

Solo debes inicializarlo de esta manera

Código
  1. char digito_romano[20] = "";

Saludos
En línea

Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #18 en: 18 Mayo 2014, 17:52 pm »

Bueno, después de romperme mucho la cabeza con este programa, creo que ya está listo, aquí el código para quien le interese:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <string.h>
  4.  
  5. void arabigos_a_romanos(int digitos[]);
  6.  
  7. int main()
  8. {
  9. int i, num;
  10. int digitos[3];
  11.  
  12. puts("Introduzca el numero (maximo 3 digitos):");
  13. scanf("%d", &num);
  14.  
  15. for (i = 2; i >= 0; i--)
  16. {
  17. digitos[i] = num / (pow(10, i));
  18. num -= digitos[i] * (pow(10, i));
  19. }
  20.  
  21. arabigos_a_romanos(digitos);
  22.    return 0;
  23. }
  24.  
  25. void arabigos_a_romanos(int digitos[]){
  26. char x[20], temp;
  27. char digito_romano[4] = "", romano[20] = "";
  28.    char letras[4][3] = { 'I', 'V', 'X',
  29.  'X', 'L', 'C',
  30.  'C', 'D', 'M',
  31.  'M'};
  32. int j, i, cant_decimal = 0, z, y, a;
  33. for(j = 0; j <= 2; j++)
  34. {
  35. switch(digitos[j])
  36. {
  37.            case 0:
  38.                digito_romano[j] = "";
  39. case 1:
  40. case 2:
  41. case 3:
  42. for( i = 0; i < digitos[j]; i++ )
  43. digito_romano[i] = letras[cant_decimal][0];
  44. break;
  45.  
  46. case 4:
  47. for( i = 0; i < 2; i++ )
  48. digito_romano[i] = letras[cant_decimal][i];
  49. break;
  50.  
  51. case 5:
  52.                                i = 0;
  53. digito_romano[0] = letras[cant_decimal][1];
  54. i++;
  55.                break;
  56.  
  57. case 6:
  58. case 7:
  59. case 8:
  60. digito_romano[0] = letras[cant_decimal][1];
  61. for( i = 1; i <= digitos[j] - 5; i++ )
  62. digito_romano[i] = letras[cant_decimal][0];
  63. break;
  64.  
  65. case 9:
  66. digito_romano[0] = letras[cant_decimal][0];
  67. digito_romano[1] = letras[cant_decimal][2];
  68. i = 2;
  69.                break;
  70. }
  71.  
  72. digito_romano[i] = '\0';
  73. cant_decimal++;
  74. strrev(digito_romano);
  75.    strcat(romano, digito_romano);
  76.    }
  77. puts("El numero en romano es:");
  78. for(z=10; z >= 0; z--)
  79.        printf("%c", romano[z]);
  80. }
  81.  

He añadido un case mas al switch porque cuando el numero terminaba en 0 daba un error, pero creo que ahora ya funciona perfectamente. He probado con numeros como 123(CXXIII), 400(CD), 434(CDXXXIV), 200(CC)... y el resultado ha sido siempre el esperado asi que supongo que dare por terminado el programa, muchas gracias a todos los que me habeis ayudado.

Un saludo
« Última modificación: 18 Mayo 2014, 18:27 pm por Caster » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Pasar numeros enteros arábigos a romanos, por donde empezar.
« Respuesta #19 en: 18 Mayo 2014, 18:15 pm »

La variable i la debes inicializar a cero, si le pasas al programa un cinco el programa revienta por que en ese ambito el valor i es deconocido, contiene basura y al utilizarlo como indice sobrescribis otras direcciones de memoria

Saludos
« Última modificación: 18 Mayo 2014, 18:22 pm por Blaster » En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calculadora que suma numeros romanos
Programación C/C++
miiku 1 10,334 Último mensaje 13 Agosto 2012, 03:50 am
por farresito
Numeros Romanos « 1 2 3 »
Programación C/C++
05K4R1N 20 13,627 Último mensaje 11 Junio 2013, 02:33 am
por edr89
verificar numeros romanos « 1 2 »
Programación C/C++
m@o_614 15 10,816 Último mensaje 22 Agosto 2013, 08:46 am
por rir3760
[Aporte]Convertidor de números decimales a romanos
Programación C/C++
0xFer 0 3,249 Último mensaje 24 Mayo 2015, 19:00 pm
por 0xFer
Conversor de números arábigos a números romanos
Programación C/C++
perico1995 0 1,900 Último mensaje 19 Diciembre 2017, 17:54 pm
por perico1995
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines