Autor
|
Tema: Palindromo C++ (Leído 10,610 veces)
|
Bob1098
Desconectado
Mensajes: 87
|
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.
|
|
« Última modificación: 22 Agosto 2014, 23:08 pm por Bob1098 »
|
En línea
|
|
|
|
kutcher
Desconectado
Mensajes: 53
|
La función debería quedar mas o menos así: 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
|
|
|
En línea
|
|
|
|
DarkMatrix
Desconectado
Mensajes: 150
Nuestro Limite es la Imaginacion
|
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)" /* 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; }
|
|
|
En línea
|
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
Desconectado
Mensajes: 53
|
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
|
|
|
En línea
|
|
|
|
DarkMatrix
Desconectado
Mensajes: 150
Nuestro Limite es la Imaginacion
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 87
|
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: /* 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; }
|
|
« Última modificación: 23 Agosto 2014, 00:35 am por Bob1098 »
|
En línea
|
|
|
|
kutcher
Desconectado
Mensajes: 53
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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: 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.
|
|
« Última modificación: 23 Agosto 2014, 21:05 pm por leosansan »
|
En línea
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
Seria mas apropiado realizar el decremento e incremento fuera del while justo después de la primera comparación: 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
|
|
« Última modificación: 23 Agosto 2014, 20:54 pm por Blaster »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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! ..... !!!!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Palindromo con Pilas
Programación C/C++
|
Muffin
|
1
|
14,905
|
28 Enero 2011, 02:32 am
por ricardo_b
|
|
|
palindromo
« 1 2 »
Programación C/C++
|
ALONSOQ
|
16
|
12,808
|
7 Agosto 2012, 17:52 pm
por X3R4CK3R
|
|
|
Palindromo en un archivo
Programación C/C++
|
Eva93
|
8
|
4,498
|
30 Agosto 2013, 13:20 pm
por Eva93
|
|
|
Palindromo
Java
|
vhh70
|
7
|
5,195
|
9 Junio 2016, 20:54 pm
por DIANA KARINA HM
|
|
|
palindromo con pilas en java
Java
|
Mantzur
|
1
|
6,675
|
10 Octubre 2016, 16:35 pm
por MinusFour
|
|