[C con Clase] no puedo usar una funcion mas de 2 veces sino explota el programa
Jadder Antonio Moya Urbáez
jadder.antonio en gmail.com
Dom Mar 13 21:55:18 CET 2011
Muchas gracia croe que ha sido la mejor ayuda, hay muchas cosas que
tengo que analizar de las que me has dicho,.
Tengo un lio entre char y string, si usaba switch( string ) me daba un
error al no ser constante, y para resolver eso, tenia que pasar los
valores en grupo de 3 al char, pero si usaba un char me daba error
tenia que usar char[3], para que me aceptara el switch..
bueno tendre pendiente todos tus puntos para aplicarlo.
cual quier otras aclaraciones mejor :)
2011/3/13 Steven Davidson <srd4121 en njit.edu>:
> Hola Jadder,
>
> On 3/13/2011 12:41 AM, Jadder Antonio Moya Urbáez wrote:
>>
>> hola a todos tengo un problema, estoy haciendo un programa y tengo
>> una funcion pero si esa funcion la utilizo mas de 2 veces me explota
>> el programa, y no es una funcion recursiva.
>>
>> 1-ejecuten el programa y funciona
>> 2- descomenten cualquiera de las dos llamada a la funcion o ambas,
>> que estan al final del main
>> //conversion(millones);
>> //conversion(miles);
>> el programa funciona siempre y cuando dejen solamente 2 fucniones no
>> entiendo por que revienta el programa con mas llamada a la misma
>> funcion.
>>
>> aqui les dejo el codigo
>>
>
> Te voy comentando a medida que vaya viendo el código fuente.
>
>>
>> #include<iostream>
>> #include<string.h>
>
> Esto no es correcto. El nombre es <string>.
>
>> #include<cstring>
>>
>> using namespace std;
>> string conversion(string);
>>
>> main(){
>
> Esto es incorrecto en C++. Deberías escribir:
>
> int main()
>
>> int longitud =0;
>> char *monto = new char [13];
>
> No entiendo muy bien por qué quieres usar cadenas al estilo de C (char *)
> con cadenas al estilo de C++ (string). Si puedes usar 'string', entonces usa
> objetos de la clase 'string'.
>
>> string cadena, temporal;
>> string cientos, miles, millones, centavos;
>>
>> cout<< "Digite su monto: ";
>> cin>> monto;
>> cadena = monto;
>
> Esto es correcto, pero no necesitas 'monto' en este caso, porque podrías
> usar 'cadena' directamente:
>
> cin >> cadena;
>
>> longitud = strlen(monto);
>>
>
> Podrías usar esta función de <cstring> o simplemente usar la función
> miembro, 'size()', de la clase 'string' con el objeto 'cadena'.
>
> Por otro lado, no usas 'cadena' en este programa, por lo que no lo
> necesitas.
>
>> if(longitud<12){ //creo una cadena temporal rellenando con los
>> valores que faltan
>> for(int x=0;x<(12-longitud);x++){
>> temporal+= '0';
>> }
>
> Podrías haber usado la funcionalidad de 'string' para realizar esta tarea.
> Por ejemplo,
>
> temporal += string( 12-longitud, '0' );
>
> Creamos un objeto temporal que contenga varios '0', y lo agregamos al final
> de 'temporal'.
>
> Otra solución es rellenando 'temporal' con los doce '0' y luego copiando la
> cadena en el lugar correcto.
>
>> }
>> temporal += monto; //suma la cadena monto a la temporal
>> cout<< temporal<< endl;
>>
>> //cout<< monto<< endl;
>> // cout<< longitud<< endl;
>>
>> millones = temporal.substr(0,3);
>> miles = temporal.substr(3,3);
>> cientos = temporal.substr(6,3);
>> centavos = temporal.substr(9);
>>
>> cout<< endl;
>> //conversion(millones);
>> //cout<< "Millones ";
>>
>> //conversion(miles);
>> //cout<< "Mil "<< endl;
>>
>> conversion(cientos);
>> conversion(centavos);
>> cout<< "Centavos. ";
>>
>> cout<< endl;
>
> Como 'main()' debe retornar un entero, deberías retornar 0 para indicar que
> el programa terminó con éxito.
>
>> }
>
> Ten presente que no liberas la memoria que creaste dinámicanente para
> 'monto'.
>
>>
>> string conversion(string numero){
>> //cout<< "aqui: "<< numero<< endl;
>> bool c = true;
>> char *cant = new char [4];
>
> Si sabes que son 4 caracteres, entonces crea un array estático:
>
> char cant[4];
>
>> for(int x=0;x<=2;x++){ //creo este bucle para convertir de
>> string a char
>> cant[x] = numero[x]; // y ponder usar un swithc que trabaja
>> con constantes
>> }
>>
>
> No es necesario convertir a 'char *'. Puedes acceder a un carácter con el
> operador []. Por ejemplo,
>
> switch( numero[0] )
>
>> switch(cant[0]){
>> case '9': cout<< "Novecientos "; c=true; break;
>> case '8': cout<< "Ochocientos "; c=true; break;
>> case '7': cout<< "Setecientos "; c=true; break;
>> case '6': cout<< "Seiscientos "; c=true; break;
>> case '5': cout<< "Quinientos "; c=true; break;
>> case '4': cout<< "Cuatrocientos "; c=true; break;
>> case '3': cout<< "Trecientos "; c=true; break;
>> case '2': cout<< "Docientos "; c=true; break;
>> case '1': cout<< "Ciento "; c=true; break;
>> case '0': cout<< ""; c=true; break;
>> case '.': cout<< "con "; c=true; break;
>>
>
> En lugar de hacer esto, podrías crear un array de constantes y luego
> convierte el carácter-dígito a un entero para que sirva de índice para
> elegir la cadena correcta. Por ejemplo,
>
> centenares[10] = { "", "Ciento", "Doscientos", ... };
> ...
> cout << centenares[ cant[0]-'0' ];
>
> Obviamente, hay que hacer verificar el primer carácter.
>
>> default:
>> cout<<"defaul1 " ;
>> c=true; break;
>
> No entiendo muy bien qué quieres hacer con la variable 'c', especialmente
> cuando va a almacenar 'true', irrelevantemente del caso.
>
>> }
>>
>>
>> switch(cant[1]){
>> case '9': cout<< "Noventa "; c=true; break;
>> case '8': cout<< "Ochenta "; c=true; break;
>> case '7': cout<< "Setenta "; c=true; break;
>> case '6': cout<< "Sesenta "; c=true; break;
>> case '5': cout<< "Cincuenta "; c=true; break;
>> case '4': cout<< "Cuarenta "; c=true; break;
>> case '3': cout<< "Trenta "; c=true; break;
>> case '2': cout<< "Veinte "; c=true; break;
>> case '1': cout<< "Novecientos "; c=true; break;
>
> Debería ser: "dieci" y luego asociar un número para el otro dígito. Sin
> embargo, hay complicaciones si el número está entre 10 y 15.
>
>> case '0': cout<< ""; c=true; break;
>>
>
> Hacemos lo mismo que con los centenares
>
>> default:
>> cout<<"defaul2 " ;
>> c=true; break;
>> }
>>
>> if(c == true){
>> cout<< "y ";
>> c = false;
>> }
>>
>>
>> switch(cant[2]){
>> case '9': cout<< "Nueve "; c=true; break;
>> case '8': cout<< "Ocho "; c=true; break;
>> case '7': cout<< "Siete "; c=true; break;
>> case '6': cout<< "Seis "; c=true; break;
>> case '5': cout<< "Cinco "; c=true; break;
>> case '4': cout<< "Cuatro "; c=true; break;
>> case '3': cout<< "Tres "; c=true; break;
>> case '2': cout<< "Dos "; c=true; break;
>> case '1': cout<< "Uno "; c=true; break;
>> case '0': cout<< ""; c=true; break;
>>
>
> Lo mismo que con los centenares y decenas.
>
>> default:
>> cout<<"defaul "<< endl;
>> c=true; break;
>> }
>> cant = "";
>>
>> }
>
> Aquí está el error. Esta función retorna un objeto de la clase 'string',
> pero no retornas nada. Esto provoca errores de memoria en tu caso.
>
> Si no quieres retornar una cadena, entonces no lo hagas; define el prototipo
> como:
>
> void conversion( string );
>
> Aunque aconsejo usar referencias a una constante; esto es,
>
> void conversion( const string & );
>
>
> También ten presente que no liberas la memoria que creaste dinámicanente
> para 'cant'.
>
>
> Espero que esto te ayude.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
--
webmaster Jadder
Más información sobre la lista de distribución Cconclase