Pasar cifra numérica a letra en lenguaje C

Iniciado por NOB2014, 28 Marzo 2016, 00:23 AM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

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{
system("cls||clear");
ok = 1; contador = 0;
printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" );
while(( ch = getchar()) != '\n'){
if( isdigit(ch) ){
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..." );
getchar(); 
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
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

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

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

NOB2014

#2
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. - 
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

#3
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 ***/
char *s = malloc(strlen(decenas[tmp]+1) * sizeof(char));
strcpy(s, decenas[tmp]);
s[0] = toupper(s[0]); 
printf( "\n %s", s);
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.


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

NOB2014

#4
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{
system("cls||clear");
ok = 1; contador = 0;
printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" );
while(( ch = getchar()) != '\n'){
if( isdigit(ch) ){
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..." );
getchar(); 
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;
char m = toupper(decenas[tmp][0]);

if( contador == 1 ){
tmp = monto[0];
m = toupper(unidades[tmp][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)
printf( "\n %s ", "Cien" );
else
printf( "\n %s ", centenas[monto[0]] );

if( monto[1] == 0 )
printf( "%s", unidades[monto[2]] );
else if( monto[1] == 1 ){
tmp = monto[2];
m = tolower(especiales[tmp][0]);
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
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.-