Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 28 Marzo 2016, 00:23 am



Título: Pasar cifra numérica a letra en lenguaje C
Publicado por: NOB2014 en 28 Marzo 2016, 00:23 am
Hola, gente.
Tengo un error que por más que investigo no logro solucionar, hice un montón de pruebas como con la función printf para saber si accedía a la posición de memoria correcta y realmente en todos los casos imprimía la fila correcta y el contenido de la primer columna, pero siempre al acceder a esta parte del programa el mismo se cierra. -
Un favorcito más, si alguien conoce otra manera para lograr lo mismo le agradecería me dé alguna pista. - 


lineas 67 y 73
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <windows.h>
  4.  
  5. int ingreso( int monto[] );
  6. void mostrar( int monto[], int contador );
  7.  
  8.  
  9. int main( void ){
  10. int monto[3], contador = 0;
  11.  
  12. contador = ingreso( monto );
  13. mostrar( monto, contador );
  14.  
  15. return 0;
  16. }
  17.  
  18. int ingreso( int monto[] ){
  19. int ch, ok, contador ;
  20.  
  21. do{
  22. system("cls||clear");
  23. ok = 1; contador = 0;
  24. printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" );
  25. while(( ch = getchar()) != '\n'){
  26. if( isdigit(ch) ){
  27. if( contador < 3 ){
  28. monto[contador] = ch - '0';
  29. contador++;
  30. }
  31. else{
  32. ok = 0;
  33. }
  34. }
  35. else{
  36. ok = 0;
  37. }
  38. }
  39. if( ok == 0 || monto[0] == '0'){
  40. printf( "\n Ingreso incorrecto...\n\n\tPulse <Enter> para intentarlo nuevamente..." );
  41. getchar();  
  42. ok = 0;
  43. }
  44. }while(!ok);
  45.  
  46. return contador;
  47. }
  48.  
  49. void mostrar( int monto[], int contador ){
  50. char  *unidades[] = { "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez" },
  51.      *decenas[]  = { "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" },
  52.  *centenas[] = { "", "Cien", "Doscientos", "Trescientos", "Cuatrociento", "Quinientos",
  53. "Seiscientos", "Setecientos", "Ochocientos", "Novecientos" },
  54.  *especiales[] = { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete",
  55.  "Dieciocho", "Diecinueve", "Veinti" };
  56. int tmp;
  57.  
  58. if( contador == 1 ){
  59. printf( "\n %s", unidades[monto[0]] );
  60. }
  61.  
  62. if( contador == 2 ){
  63. tmp = monto[0]-2;
  64. if( monto[0] == 1)
  65. printf( "\n %s ", especiales[monto[1]] );
  66. else if( monto[1] == 0 ){
  67. decenas[tmp][0] = toupper(decenas[tmp][0]);  
  68. printf( "\n %s", decenas[monto[0]-2] );
  69. }
  70. else if( monto[0] == 2 && monto[1] > 0 )
  71. printf( "\n %s%s", especiales[10], unidades[monto[1]] );
  72. else{
  73. decenas[tmp][0] = toupper(decenas[tmp][0]);  
  74. printf( "\n %s y %s", decenas[monto[0]-2], unidades[monto[1]] );
  75. }
  76. }
  77.  
  78. if( contador == 3 ){
  79. printf( "\n %s ", centenas[monto[0]] );
  80. if( monto[1] == 0 )
  81. printf( "%s", unidades[monto[2]] );
  82. else if( monto[1] == 1 )
  83. printf( "%s", especiales[monto[2]] );
  84. else
  85. printf( "%s y %s", decenas[monto[1]-2], unidades[monto[2]] );
  86. }
  87. }
  88.  
  89.  
  90. /*
  91. Ejercicio 6-1. Escriba un programa que solicite un número entero positivo menor que 1000
  92. y a continuación, cree y genere un valor de tipo string que es el valor del entero en palabras.
  93. Por ejemplo, si 941 es introducido, el programa creará la cadena "Novecientos cuarenta y uno".
  94. */

Saludos.
Daniel


Título: Re: Pasar cifra numérica a letra en lenguaje C
Publicado por: crack81 en 28 Marzo 2016, 01:09 am
Cual es el error que muestra?  o mas bien con que numero ingresado aparece el error

Saludos..


Título: Re: Pasar cifra numérica a letra en lenguaje C
Publicado por: NOB2014 en 28 Marzo 2016, 01:54 am
Hola.
Nada de eso, es lo que muestra la captura.

(http://i64.tinypic.com/140ds85.png)

Gracias.
Daniel

Perdón por leer apurado, por Ej. 35 todo número que tenga 2 cifras, para escribir Treinta y cinco, debo pasar treinta a Treinta. - 


Título: Re: Pasar cifra numérica a letra en lenguaje C
Publicado por: MAFUS en 28 Marzo 2016, 03:19 am
El problema es que quieres cambiar constantes.

Fíjate que todos tus arrays son de cadenas, son constantes que se guardan en la zona de memoria de sólo lectura del programa. Cualquier intento en cambiarlas producirá un error de fallo de segmento.
Pues eso es lo que estás haciendo en las líneas que has mencionado. Con la función toupper estás intentando cambiar la primera letra de una cadena constante y el propio S.O. te lo impide.

Para solucionar esto de forma sencilla: crea una variable dinámica del tamaño de la palabra que querías acceder, teniendo en cuenta que además debes dar cabida al carácter nulo; copia la cadena dentro de la nueva variable; haz lo que querías hacer pero usando esta nueva variable; libera la memoria adquirida para esta variable.

Código
  1. /*** recuerda incluir #include <string.h> para que funcione esta solución ***/
  2. char *s = malloc(strlen(decenas[tmp]+1) * sizeof(char));
  3. strcpy(s, decenas[tmp]);
  4. s[0] = toupper(s[0]);  
  5. printf( "\n %s", s);
  6. free(s);

O: crea una variable tipo char a la que meterás dentro el primer carácter de la cadena pero en mayúsculas; muestra por pantalla el contenido de esta variable; muestra por pantalla el contenido de la cadena a partir de la posición 1.

Código
  1. char m = toupper(decenas[tmp][0]);
  2. printf("%c%s", m, &decenas[tmp][1]);


Título: Re: Pasar cifra numérica a letra en lenguaje C
Publicado por: NOB2014 en 28 Marzo 2016, 03:58 am
Hola, MAFUS.
Funciona a la perfección, tome la segunda opción porque todavía tengo que repasar memoria dinámica, dejo el programa funcionando para que si alguien pasa por esto tenga alguna idea.-
No prometo nada, pero si logro mejorarlo lo corrijo. -

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <windows.h>
  4.  
  5. int ingreso( int monto[] );
  6. void mostrar( int monto[], int contador );
  7.  
  8.  
  9. int main( void ){
  10. int monto[3], contador = 0;
  11.  
  12. contador = ingreso( monto );
  13. mostrar( monto, contador );
  14.  
  15. return 0;
  16. }
  17.  
  18. int ingreso( int monto[] ){
  19. int ch, ok, contador ;
  20.  
  21. do{
  22. system("cls||clear");
  23. ok = 1; contador = 0;
  24. printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" );
  25. while(( ch = getchar()) != '\n'){
  26. if( isdigit(ch) ){
  27. if( contador < 3 ){
  28. monto[contador] = ch - '0';
  29. contador++;
  30. }
  31. else{
  32. ok = 0;
  33. }
  34. }
  35. else{
  36. ok = 0;
  37. }
  38. }
  39. if( ok == 0 || monto[0] == '0'){
  40. printf( "\n Ingreso incorrecto...\n\n\tPulse <Enter> para intentarlo nuevamente..." );
  41. getchar();  
  42. ok = 0;
  43. }
  44. }while(!ok);
  45.  
  46. return contador;
  47. }
  48.  
  49. void mostrar( int monto[], int contador ){
  50. char  *unidades[] = { "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez" },
  51.      *decenas[]  = { "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" },
  52.  *centenas[] = { "", "Ciento", "Doscientos", "Trescientos", "Cuatrocientos", "Quinientos",
  53. "Seiscientos", "Setecientos", "Ochocientos", "Novecientos" },
  54.  *especiales[] = { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete",
  55.  "Dieciocho", "Diecinueve", "Veinti" };
  56. int tmp = monto[0]-2;
  57. char m = toupper(decenas[tmp][0]);
  58.  
  59. if( contador == 1 ){
  60. tmp = monto[0];
  61. m = toupper(unidades[tmp][0]);
  62. printf( "\n %c%s", m, &unidades[tmp][1] );
  63. }
  64.  
  65. if( contador == 2 ){
  66. if( monto[0] == 1)
  67. printf( "\n %s ", especiales[monto[1]] );
  68. else if( monto[1] == 0 ){
  69. printf("\n %c%s", m, &decenas[tmp][1] );
  70. }
  71. else if( monto[0] == 2 && monto[1] > 0 )
  72. printf( "\n %s%s", especiales[10], unidades[monto[1]] );
  73. else{
  74. printf("\n %c%s y %s", m, &decenas[tmp][1], unidades[monto[1]]);
  75. }
  76. }
  77.  
  78. if( contador == 3 ){
  79. if( monto[0] == 1 && monto[1] == 0 && monto[2] == 0)
  80. printf( "\n %s ", "Cien" );
  81. else
  82. printf( "\n %s ", centenas[monto[0]] );
  83.  
  84. if( monto[1] == 0 )
  85. printf( "%s", unidades[monto[2]] );
  86. else if( monto[1] == 1 ){
  87. tmp = monto[2];
  88. m = tolower(especiales[tmp][0]);
  89. printf( "%c%s", m, &especiales[tmp][1] );
  90. }
  91. else if( monto[2] == 0)
  92. printf( "%s", decenas[monto[1]-2] );
  93. else if( monto[1] == 2 )
  94. printf( "%s%s", "veinti", unidades[monto[2]] );
  95. else
  96. printf( "%s y %s", decenas[monto[1]-2], unidades[monto[2]] );
  97. }
  98. }

Saludos.
Daniel