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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar cifra numérica a letra en lenguaje C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar cifra numérica a letra en lenguaje C  (Leído 1,972 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Pasar cifra numérica a letra en lenguaje C
« 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


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Pasar cifra numérica a letra en lenguaje C
« Respuesta #1 en: 28 Marzo 2016, 01:09 am »

Cual es el error que muestra?  o mas bien con que numero ingresado aparece el error

Saludos..


En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar cifra numérica a letra en lenguaje C
« Respuesta #2 en: 28 Marzo 2016, 01:54 am »

Hola.
Nada de eso, es lo que muestra la captura.



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. - 
« Última modificación: 28 Marzo 2016, 02:01 am por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Pasar cifra numérica a letra en lenguaje C
« Respuesta #3 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]);
« Última modificación: 28 Marzo 2016, 03:28 am por MAFUS » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar cifra numérica a letra en lenguaje C
« Respuesta #4 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
« Última modificación: 29 Marzo 2016, 03:09 am por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda sobre almacenar palabra letra a letra
.NET (C#, VB.NET, ASP)
Meyer900 5 9,594 Último mensaje 27 Septiembre 2008, 19:59 pm
por SeniorX
dividir cadena letra por letra
Scripting
morenochico 3 8,771 Último mensaje 3 Julio 2009, 18:46 pm
por leogtz
Pasar vb a cualquier lenguaje
Programación Visual Basic
SOMBRIO 2 6,470 Último mensaje 11 Enero 2010, 04:07 am
por SOMBRIO
Insertar en una nueva hoja de al pasar de una letra A a B y asi sucesivamente c#
.NET (C#, VB.NET, ASP)
joalbela 3 3,027 Último mensaje 8 Marzo 2011, 19:45 pm
por [D4N93R]
Pasar codigo a lenguaje C++
Programación C/C++
diamonroyor 2 2,288 Último mensaje 19 Junio 2012, 12:00 pm
por Saberuneko
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines