Autor
|
Tema: Pasar cifra numérica a letra en lenguaje C (Leído 2,240 veces)
|
NOB2014
Desconectado
Mensajes: 366
|
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#include <stdio.h> #include <ctype.h> #include <windows.h> int ingreso( int monto[] ); void mostrar( int monto[], int contador ); int main( void ){ int monto[3], contador = 0; contador = ingreso( monto ); mostrar( monto, contador ); return 0; } int ingreso( int monto[] ){ int ch, ok, contador ; do{ ok = 1; contador = 0; printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" ); if( contador < 3 ){ monto[contador] = ch - '0'; contador++; } else{ ok = 0; } } else{ ok = 0; } } if( ok == 0 || monto[0] == '0'){ printf( "\n Ingreso incorrecto...\n\n\tPulse <Enter> para intentarlo nuevamente..." ); ok = 0; } }while(!ok); return contador; } void mostrar( int monto[], int contador ){ char *unidades[] = { "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez" }, *decenas[] = { "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" }, *centenas[] = { "", "Cien", "Doscientos", "Trescientos", "Cuatrociento", "Quinientos", "Seiscientos", "Setecientos", "Ochocientos", "Novecientos" }, *especiales[] = { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete", "Dieciocho", "Diecinueve", "Veinti" }; int tmp; if( contador == 1 ){ printf( "\n %s", unidades [monto [0]] ); } if( contador == 2 ){ tmp = monto[0]-2; if( monto[0] == 1) printf( "\n %s ", especiales [monto [1]] ); else if( monto[1] == 0 ){ decenas [tmp ][0] = toupper(decenas [tmp ][0]); printf( "\n %s", decenas [monto [0]-2] ); } else if( monto[0] == 2 && monto[1] > 0 ) printf( "\n %s%s", especiales [10], unidades [monto [1]] ); else{ decenas [tmp ][0] = toupper(decenas [tmp ][0]); printf( "\n %s y %s", decenas [monto [0]-2], unidades [monto [1]] ); } } if( contador == 3 ){ printf( "\n %s ", centenas [monto [0]] ); if( monto[1] == 0 ) printf( "%s", unidades [monto [2]] ); else if( monto[1] == 1 ) printf( "%s", especiales [monto [2]] ); else printf( "%s y %s", decenas [monto [1]-2], unidades [monto [2]] ); } } /* Ejercicio 6-1. Escriba un programa que solicite un número entero positivo menor que 1000 y a continuación, cree y genere un valor de tipo string que es el valor del entero en palabras. Por ejemplo, si 941 es introducido, el programa creará la cadena "Novecientos cuarenta y uno". */
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
Mensajes: 222
|
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
Mensajes: 366
|
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
Mensajes: 1.603
|
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. /*** recuerda incluir #include <string.h> para que funcione esta solución ***/
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. printf("%c%s", m , &decenas [tmp ][1]);
|
|
« Última modificación: 28 Marzo 2016, 03:28 am por MAFUS »
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
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. - #include <stdio.h> #include <ctype.h> #include <windows.h> int ingreso( int monto[] ); void mostrar( int monto[], int contador ); int main( void ){ int monto[3], contador = 0; contador = ingreso( monto ); mostrar( monto, contador ); return 0; } int ingreso( int monto[] ){ int ch, ok, contador ; do{ ok = 1; contador = 0; printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" ); if( contador < 3 ){ monto[contador] = ch - '0'; contador++; } else{ ok = 0; } } else{ ok = 0; } } if( ok == 0 || monto[0] == '0'){ printf( "\n Ingreso incorrecto...\n\n\tPulse <Enter> para intentarlo nuevamente..." ); ok = 0; } }while(!ok); return contador; } void mostrar( int monto[], int contador ){ char *unidades[] = { "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez" }, *decenas[] = { "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" }, *centenas[] = { "", "Ciento", "Doscientos", "Trescientos", "Cuatrocientos", "Quinientos", "Seiscientos", "Setecientos", "Ochocientos", "Novecientos" }, *especiales[] = { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete", "Dieciocho", "Diecinueve", "Veinti" }; int tmp = monto[0]-2; if( contador == 1 ){ tmp = monto[0]; printf( "\n %c%s", m , &unidades [tmp ][1] ); } if( contador == 2 ){ if( monto[0] == 1) printf( "\n %s ", especiales [monto [1]] ); else if( monto[1] == 0 ){ printf("\n %c%s", m , &decenas [tmp ][1] ); } else if( monto[0] == 2 && monto[1] > 0 ) printf( "\n %s%s", especiales [10], unidades [monto [1]] ); else{ printf("\n %c%s y %s", m , &decenas [tmp ][1], unidades [monto [1]]); } } if( contador == 3 ){ if( monto[0] == 1 && monto[1] == 0 && monto[2] == 0) else printf( "\n %s ", centenas [monto [0]] ); if( monto[1] == 0 ) printf( "%s", unidades [monto [2]] ); else if( monto[1] == 1 ){ tmp = monto[2]; printf( "%c%s", m , &especiales [tmp ][1] ); } else if( monto[2] == 0) printf( "%s", decenas [monto [1]-2] ); else if( monto[1] == 2 ) printf( "%s%s", "veinti", unidades [monto [2]] ); else printf( "%s y %s", decenas [monto [1]-2], unidades [monto [2]] ); } }
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.-
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda sobre almacenar palabra letra a letra
.NET (C#, VB.NET, ASP)
|
Meyer900
|
5
|
9,967
|
27 Septiembre 2008, 19:59 pm
por SeniorX
|
|
|
dividir cadena letra por letra
Scripting
|
morenochico
|
3
|
9,078
|
3 Julio 2009, 18:46 pm
por leogtz
|
|
|
Pasar vb a cualquier lenguaje
Programación Visual Basic
|
SOMBRIO
|
2
|
6,635
|
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,281
|
8 Marzo 2011, 19:45 pm
por [D4N93R]
|
|
|
Pasar codigo a lenguaje C++
Programación C/C++
|
diamonroyor
|
2
|
2,495
|
19 Junio 2012, 12:00 pm
por Saberuneko
|
|