Palindromo C++

Iniciado por Bob1098, 22 Agosto 2014, 22:43 PM

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

Bob1098

Hola a todos. Quería comentarles una duda que tengo intentando resolver un ejercicio en C++. El enunciado se incluye en el código. El problema es que creo que esta todo bien y correcto, pero el resultado es que la función siempre devuelve true, o al menos eso parece. Aquí esta el 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>

using namespace std;

bool Palindromo(char palabra[40]);
int LongCad(char[]);

int main() {
char posiblePalindromo[40];
cout << "Introduce tu palindromo: ";
cin >> posiblePalindromo;

if (Palindromo(posiblePalindromo)) cout << "\nSi es un palindromo." << endl;
else cout << "\nNo es un palindromo." << endl;

cin.sync();
cin.get();
return 0;
}

bool Palindromo(char palabra[40]) {
char copia[40];
strcpy_s(copia, palabra);

int q = 0, p = LongCad(palabra), aux;
while (palabra[q] < p) {
aux = palabra[q];
palabra[q] = palabra[p];
palabra[p] = aux;
q++;
p--;
}

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

int LongCad(char a[]) {
int i = 0;
while (a[i]) i++;
return 0;
}
[code=cpp][code=actionscript]
[/code][/code]

**EDITO: En el código no he puesto la librería necesaria "cstring" aun asi el código compilaba =S. Luego la puse y el mismo resultado.

kutcher

La función debería quedar mas o menos así:

Código (cpp) [Seleccionar]
bool Palindromo(char palabra[40])
{
    char copia[40];
    int q = 0, p;

    p = LongCad(palabra) - 1;

    while (palabra[q] != '\0')
    {
        copia[q] = palabra[p];
        q++, p--;
    }
    copia[q] = '\0';

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


Y en la función LongCad debes retornar i no cero

DarkMatrix

Creo que tienes 2 errores en el codigo, el primero y mas notable es que la funcion LongCad siempre retorna cero y deberia retornar "i", el segundo es en esta linea "while (palabra[q] < p)", deberia ser "while (q < p)"

Código (cpp) [Seleccionar]
/*
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 <string>

using namespace std;

bool Palindromo(char palabra[40]);
int LongCad(char[]);

int main() {
char posiblePalindromo[40];

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

if (Palindromo(posiblePalindromo)) cout << "\nSi es un palindromo." << endl << endl;
else cout << "\nNo es un palindromo." << endl << endl;

cin.sync();
cin.get();
return 0;
}

bool Palindromo(char palabra[40]) {
char copia[40];
strcpy(copia, palabra);
int q = 0, p = LongCad(palabra)-1, aux;
while (q < p) {
aux = palabra[q];
palabra[q] = palabra[p];
palabra[p] = aux;
q++;
p--;
}

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

int LongCad(char a[]) {
int i = 0;
while (a[i]) i++;
return i;
}

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

kutcher

Cita de: DarkMatrix en 22 Agosto 2014, 23:26 PM
el segundo es en esta linea "while (palabra[q] < p)", deberia ser "while (q < p)"

El código es muy inconsistente al copiar directamente la palabra a la cadena copia no lograras comprobar si es o no palíndromo y con la condición del while dispuesta de es manera solo copiara la mitad de la palabra a la cadena destino

Saludos kutcher

DarkMatrix

palabra = "AnitaLavaLaTina"
copia = "AnitaLavaLaTina"

luego del bucle:

palabra = "aniTaLavaLatinA"

palindroma = (strcmp(palabra,copia) == 0)

Como el programa no tiene que distinguir entre mayusculas y minusculas, no importa como lo puse, fue para que se viera al invertir la palabra, la otra mitad no hace falta comprobarla ya que lo que hace el bucle es tomar la primera letra y cambiarla con la ultima, luego la segunda con la penultima, etc..., al llegar a la mitad ya se habran intercambiado todas las letras necesarias para saber si la palabra es palindroma, ya que si es asi la otra mitad sera igual a la ya intercambiada y la comparacion dara true, de lo contrario dara false.

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

Bob1098

#5
Vale, gracias a todos por las respuestas, la próxima vez me pondré a programar después de tomarme un buen café xd.

Aquí esta el código terminado, he corregido los fallos y añadido el "sistema" para las mayúsculas y minúsculas:

Código (cpp) [Seleccionar]

/*
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>
#include <cctype>

using namespace std;

bool Palindromo(char palabra[40]);
int LongCad(char[]); //Calcula la longitud de una cadena

int main() {
char posiblePalindromo[40];
cout << "Introduce tu palindromo: ";
cin >> posiblePalindromo;

if (Palindromo(posiblePalindromo)) cout << "\nSi es un palindromo." << endl;
else cout << "\nNo es un palindromo." << endl;

cin.sync();
cin.get();
return 0;
}

bool Palindromo(char palabra[40]) {
char copia[40];


for (int i = 0; i <= LongCad(palabra) - 1; i++) if (isupper(palabra[i])) palabra[i] = tolower(palabra[i]); //Convierte todos los caracteres a minuscula

strcpy_s(copia, palabra); //Se copia la cadena para una posterior comparación

int q = 0, p = LongCad(palabra) - 1, aux;
while (q < p) { //Invierte los elementos de la cadena "palabra"
aux = palabra[q];
palabra[q] = palabra[p];
palabra[p] = aux;
q++;
p--;
}

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

int LongCad(char a[]) {
int i = 0;
while (a[i]) i++;
return i;
}


kutcher

Cita de: DarkMatrix en 23 Agosto 2014, 00:07 AM
Como el programa no tiene que distinguir entre mayusculas y minusculas, no importa como lo puse, fue para que se viera al invertir la palabra, la otra mitad no hace falta comprobarla ya que lo que hace el bucle es tomar la primera letra y cambiarla con la ultima, luego la segunda con la penultima, etc..., al llegar a la mitad ya se habran intercambiado todas las letras necesarias para saber si la palabra es palindroma, ya que si es asi la otra mitad sera igual a la ya intercambiada y la comparacion dara true, de lo contrario dara false.

Es verdad no me tome el tiempo de leerlo con detalle jaja

Saludos kutcher

leosansan

#7
Lo que no me acaba de convencer es la necesidad de usar una copia de "palabra". Podrías comparar directamente los caracteres equidistantes de palabra, algo como:

Código (cpp) [Seleccionar]
bool Palindromo(char palabra[40]) {
 nt q = 0, p = (LongCad(palabra) - 1);
 while (q < p) {
   if ( tolower (palabra[q]) != tolower (palabra[p]) )
     return false;
   q++, p--;
 }
 return true;
}


"Creo" que así funcionará.

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



EDITADO con la observación de Blaster.

Blaster

#8
Seria mas apropiado realizar el decremento e incremento fuera del while justo después de la primera comparación:

Código (cpp) [Seleccionar]
while (q < p)
{
  if (palabra[q] != palabra[p])
      return false;
  q++, p--;
}


Tu código al procesar una cadena como esta arenere retornara true

Saludos

leosansan

Cita de: Blaster en 23 Agosto 2014, 20:49 PM
Seria mas apropiado realizar el decremento e incremento fuera del while justo después de la primera comparación:
...........................
Saludos

Por algo puse "Creo", no sé por qué pero algo me decía que no estaba bien.  ;)

Gracias por la observación. Ya edité el mensaje anterior donde recojo lo que mencionas.

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