Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Bob1098 en 31 Mayo 2014, 17:51 pm



Título: Problema con palindromo
Publicado por: Bob1098 en 31 Mayo 2014, 17:51 pm
Hola, estoy intentando resolver este problema, en el código viene el enunciado en un comentario:

Código:

/*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?


Título: Re: Problema con palindromo
Publicado por: leosansan en 31 Mayo 2014, 18:16 pm
Estas comparando "palabra", que si tiene o puede tener mayúsculas con aux a las que has eliminado las mayúsculas:

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


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con palindromo
Publicado por: Blaster en 31 Mayo 2014, 18:18 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


Título: Re: Problema con palindromo
Publicado por: eferion en 31 Mayo 2014, 18:29 pm
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
  1. std::string Invertir( const std::string& cadena )
  2. {
  3.  return std::string( cadena.rbegin( ), cadena.rend( ) );
  4. }

* Pasar a minúsculas:

Código
  1. std::string AMinusculas( const std::string& cadena )
  2. {
  3.  std::string to_return = cadena;
  4.  std::transform( to_return .begin( ), to_return .end( ), to_return .begin( ), ::tolower);
  5.  return to_return;
  6. }

* Comprobar si dos cadenas son iguales:

Código
  1. bool Comparar( const std::string& cadena1, const std::string& cadena2 )
  2. {
  3.  return cadena1 == cadena2;
  4. }

* Conocer la longitud de una cadena:

Código
  1. int Longitud( const std::string& cadena )
  2. {
  3.  return cadena.size( );
  4. }


Título: Re: Problema con palindromo
Publicado por: Bob1098 en 1 Junio 2014, 19:33 pm
Gracias a todos por las respuestas, de todas formas ya conseguí solucionarlo minutos después de postearlo