Problema con palindromo

Iniciado por Bob1098, 31 Mayo 2014, 17:51 PM

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

Bob1098

Hola, estoy intentando resolver este problema, en el código viene el enunciado en un comentario:



/*5.Hacer un programa que contenga una función con el prototipo bool Palindromo(char palabra[40]);.
La función debe devolver true si la palabra es un palíndromo, y false si no lo es.
Una palabra es un palíndromo si cuando se lee desde el final al principio es igual que leyendo desde el principio,
por ejemplo: "Otto", o con varias palabras "Anita lava la tina", "Dábale arroz a la zorra el abad".
En estos casos debemos ignorar los acentos y los espacios, pero no es necesario que tu función haga eso,
bastará con probar cadenas como "anitalavalatina", o "dabalearrozalazorraelabad".
La función no debe hacer distinciones entre mayúsculas y minúsculas.*/

#include <iostream>
#include <cstring> //Para strcmp() y strcpy()

using namespace std;

bool Palindromo(char[]); //Comprueba si la palabra es un palíndromo o no
void Invertir(char[], int); //Invierte los elementos de un array tipo char.
int longCad(char[]); //Calcula la longitud de una cadena

int main() {
char posiblePalindromo[40];

cout << "Introduce un palindromo: ";
cin >> posiblePalindromo;

if(Palindromo(posiblePalindromo)) {
cout << "Si, es un palindromo. " << endl;
}
else cout << "No, no es un palindromo. " << endl;

cin.get();
return 0;
}

bool Palindromo(char palabra[40]) {
char aux[40];
strcpy(aux, palabra); //Hacemos una copia en la variable aux, para poder compararlas posteriormente.

for(int i=0; i<=longCad(aux); i++) { // Bucle para convertir cualquier mayuscula a minuscula.
if(isupper(aux[i])) aux[i] = tolower(aux[i]);
}
Invertir(aux, longCad(aux));

if(strcmp(aux, palabra) == 0) return true;
else return false;
}

void Invertir(char a[], int m) {
int i = 0, j = m-1, aux;
while(i < (m / 2)) {
aux = a[i];
a[i] = a[j];
a[j] = aux;
i++; j--;
}
}

int longCad(char a[]) {
int n = 0;
while(a[n] != 0) n++;
return n;
}


En principio, el programa me funciona bien, pero no consigo solucionar que el programa ingore las mayúsculas a la hora comprobar el palíndromo. He escrito un bucle for en la función para convertir cualquier mayúscula a minúscula, pero es como si el bucle no existiera, cuando escribo un palíndromo con mayúsculas y minúsculas me dice que no lo es, pero cuando lo escribo todo en minúscula me dice que si. ¿Alguna idea?

leosansan

Estas comparando "palabra", que si tiene o puede tener mayúsculas con aux a las que has eliminado las mayúsculas:

Código (cpp) [Seleccionar]
for(int i=0; i<longCad(aux); i++) { // Bucle para convertir cualquier mayuscula a minuscula.
    if(aux[i]<97){
      palabra[i]+= 32;
      aux[i] += 32;
     }
   }



¡¡¡¡ Saluditos! ..... !!!!



Blaster

Cita de: Bob1098 en 31 Mayo 2014, 17:51 PM
En principio, el programa me funciona bien, pero no consigo solucionar que el programa ingore las mayúsculas a la hora comprobar el palíndromo. He escrito un bucle for en la función para convertir cualquier mayúscula a minúscula, pero es como si el bucle no existiera, cuando escribo un palíndromo con mayúsculas y minúsculas me dice que no lo es, pero cuando lo escribo todo en minúscula me dice que si. ¿Alguna idea?

No te funciona por que si en el caso de que la cadena se mayuscula tu la conviertes en minuscula y la guardas en la variable auxiliar y luego la comparas con la cadena original que esta en mayuscula y te retorna false ya que son diferentes

Saludos

eferion

Lo que te sucede es que únicamente estás pasando a minúsculas 'aux'... ¿qué pasa con 'palabra'?

Al no convertir ambas cadenas a minúsculas es difícil que coincidan.

PD.: Si usas C++... por qué no usas la clase string??

* Invertir una cadena:

Código (cpp) [Seleccionar]

std::string Invertir( const std::string& cadena )
{
 return std::string( cadena.rbegin( ), cadena.rend( ) );
}


* Pasar a minúsculas:

Código (cpp) [Seleccionar]

std::string AMinusculas( const std::string& cadena )
{
 std::string to_return = cadena;
 std::transform( to_return .begin( ), to_return .end( ), to_return .begin( ), ::tolower);
 return to_return;
}


* Comprobar si dos cadenas son iguales:

Código (cpp) [Seleccionar]

bool Comparar( const std::string& cadena1, const std::string& cadena2 )
{
 return cadena1 == cadena2;
}


* Conocer la longitud de una cadena:

Código (cpp) [Seleccionar]

int Longitud( const std::string& cadena )
{
 return cadena.size( );
}

Bob1098

Gracias a todos por las respuestas, de todas formas ya conseguí solucionarlo minutos después de postearlo