Ayuda con este codigo de C++

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
symtaxiz
Mensajes: 8
Registrado: 20/12/2013 2:15 pm

Ayuda con este codigo de C++

#1 Mensaje por symtaxiz » 20/12/2013 2:26 pm

Hola, estoy aprendiendo a programar y tenia que hacer que detecte si la palabra insertada es un palindromo (significa que si se lee de atrás o de adelante es lo mismo) con una función recursiva o como se diga. Este es el código:
[code]
#include <iostream>

using namespace std;

bool Pali (char *p, char *q);
int main()
{
cout << "Introduze una oracion y te diremos si es lo mismo leerla de delante o de detras.(Max 20 palabras):-)" << endl << "Oracion:";
char cad[20];
char *a;
char *b;
cin.getline(cad,20);
a = &cad[0];
b = &cad[0];
while (*b)
{
if (*b >= 'A')
if (*b <= 'Z') *b = tolower(*b);
b++;
}
if (Pali(a,b) == true) cout << "Es... GG!!!";
else cout << "No es... :'(";
return 0;
}
bool Pali(char *p, char *q)
{
if (*p == ' ') p+=1;
if (*q == ' ') q+=1;
if (*p != *q) return false;
if (p < q) Pali(p+1,q-1);
return true;
}
[/code]
Me di cuenta que en la parte que falla es cuando comienza el bucle while en main.
[code]
while (*b)
{
if (*b >= 'A')
if (*b <= 'Z') *b = tolower(*b);
b++;
}
[/code]
Y allí 'b' pierde el valor. Agradecería mucho su ayuda porque ya he trabajado con bucles iguales y si funcionaron... lo único diferente es que cuando lo hice antes (en otro programa) solo un puntero apuntaba a la cadena de caracteres.
Gracias :)

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#2 Mensaje por Masakre » 20/12/2013 9:44 pm

Mientras la condición sea un valor distinto de cero, será considerado true, ¿verdad?
Es decir, vas a posicionarte en el caracter que sigue mientras *b sea distinto de cero.

Entonces creo que si usas simplemente while(b) no daría problema, porque mientras b (que es una dirección de memoria) sea diferente de 0 (null) puedes continuar avanzando sin problemas.

symtaxiz
Mensajes: 8
Registrado: 20/12/2013 2:15 pm

#3 Mensaje por symtaxiz » 21/12/2013 1:55 am

[quote="Masakre"]Mientras la condición sea un valor distinto de cero, será considerado true, ¿verdad?
Es decir, vas a posicionarte en el caracter que sigue mientras *b sea distinto de cero.

Entonces creo que si usas simplemente while(b) no daría problema, porque mientras b (que es una dirección de memoria) sea diferente de 0 (null) puedes continuar avanzando sin problemas.[/quote]

Si hago eso, entra en un bucle infinito... la manera en la que funciona este bucle es que mientras que no se encuentre el caracter nulo haga lo que se dice, pero no tiene sentido que b pierda el valor... no podria ser que sea un error de compilador? Uso Code::Blocks 12.11
Gracias por responder :wink:

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#4 Mensaje por Masakre » 21/12/2013 9:04 am

¿Qué error te da?
Porque he probado el siguiente código y funciona bien en Code::Blocks 10.05

Código: Seleccionar todo

#include <iostream>
using namespace std;

bool Pali(char * p, char * q);

int main()
{
    cout<<"Introduzca una oracion y le diremos si es lo mismo leerla de delante o de atras.(Max 20 caracteres)"<<endl<<"Oracion:";
    char cad[20], * a, * b;
    cin.getline(cad,20);
    a = &cad[0];
    b = &cad[0];
    while(*b)
    {
        if (*b >= 'A' && *b <= 'Z')
            *b = tolower(*b);
        b++;
    }
    if( Pali(a, b-1) )
        cout << "Es palindroma!";
    else cout << "No es palindroma!";
    return 0;
}

bool Pali(char * p, char * q)
{
    if (*p == ' ') ++p;
    if (*q == ' ') --q;
    if (*p != *q) return false;
    if (p < q) Pali(p+1,q-1);
    return true;
}
Sobre la condición del while, yo decía, si es diferente de 0 será true. Pero veo que '\0' es igual a 0 (escribí un if con un cout dentro, y se mostró el mensaje al considerar ambos iguales).
A la invocación de Pali desde el main le paso como argumento b-1, ya que b quedó apuntando a la dir de memoria con '\0', y dentro de Pali, si se encuentra un espacio para q, a mi parecer debe pasar a la dirección de memoria anterior.

symtaxiz
Mensajes: 8
Registrado: 20/12/2013 2:15 pm

#5 Mensaje por symtaxiz » 21/12/2013 9:39 am

No me tirar ningún error normal, o sea que compila. Pero el error esta en que el programa ya compilado no hace lo que le digo, esto ocurre porque en ese bucle b pierde el valor. Eso es posible de ver si agruegas una linea cout para que te muestre el valor antes del bucle y luego otra despues del bucle. No podria el problema estar porque dos punteros apuntan a la misma variable?

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#6 Mensaje por Masakre » 21/12/2013 2:11 pm

No hay problema con que 2 punteros almacenen la misma dirección de memoria.
¿Ha probado el código que puse antes? Porque he ingresado una oración palíndroma y la ha identificado como tal, y si cambio algo, indica que no es palíndroma.

symtaxiz
Mensajes: 8
Registrado: 20/12/2013 2:15 pm

#7 Mensaje por symtaxiz » 22/12/2013 3:59 am

Muchas Gracias!!! Tu código anda de maravillas. Pero podrías decirme exactamente donde esta mi error.
Gracias :D

Masakre
Mensajes: 249
Registrado: 06/06/2012 10:52 am

#8 Mensaje por Masakre » 22/12/2013 3:51 pm

Cambié:
- La invocación de Pali desde el main, pues como segundo parámetro se envía b-1 (antes se enviaba b, y la idea es que se envie la dirección que apunta al último caracter de la oración y no al '\0').
- Y en la función Pali, cuando *q es un espacio en blanco, se retrocede al caracter anterior (antes avanzaba).

Y también esto, pero que no modifica en nada la lógica:
- Agrupar 2 if en uno solo.
- Quitar el ==true que aparecía en el if que está fuera del while en la función main.

symtaxiz
Mensajes: 8
Registrado: 20/12/2013 2:15 pm

#9 Mensaje por symtaxiz » 27/12/2013 11:43 am

Muchisimas gracias!!!!!!!! :D
Esos pequeños errores siempre me pasan y me ponen a veces me ponen muy nervioso :oops:

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados