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
Cual es el error que muestra? o mas bien con que numero ingresado aparece el error
Saludos..
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. -
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]);
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