Identificar frases palíndromas

Iniciado por AxelP, 15 Noviembre 2014, 06:10 AM

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

AxelP

Hola a todos, tengo que hacer un programa que identifique las frases palíndromas. Tengo este código, pero falla en el if al comprobar la cadena con la cadena invertida:

#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
char frase1[100];
char frase2[100];
printf("Aqui puedes identificar frases palindromas\n\nEscribe tu frase: ");
gets(frase1);
int letra1 = 0;
int letra2 = 0;
for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
{
    if (frase1[letra1] != ' ')
{
             frase2[letra2++] = frase1[letra1];
}
}
strlwr(frase2);
printf("%s", frase2);
if (frase2 == strrev(frase2))
{
printf("\nTu frase es palindroma!");
}
else
{
printf("\nTu frase no es palindroma!");
}
}

Ocelot1994

Prueba a cambiar esto :
-Con esto comprobamos letra por letra en la frase2.
Código (cpp) [Seleccionar]
int inicio=0;
int fin=letra2-1;

while((inicio<fin) && (frase2[letra1]==frase2[letra2])){
    inicio++;
    fin--;

}

si el while sale porque fin e inicio son iguales es que es palindromo y tirara por el if, si no se cumple la igualdad de las letras tirara por el else y no será palindromo

Código (cpp) [Seleccionar]
if (frase2[inicio] == frase2[fin])
{
printf("\nTu frase es palindroma!");
}else ......

engel lex

no puedes comprobarlo directamente porque los array de char son mas largos que las palabras que evaluas...

yo haría algo como

inicio = 0;
fin = strlen(frase)
while(inicio<=fin){
  si(frase[inicio++] != frase[fin--]) { //no estoy seguro si se resta 1
    //no es palindromo... hacer lo que se vaya a hacer
    break;
  }
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

leosansan

#3
Cita de: AxelP en 15 Noviembre 2014, 06:10 AM
Hola a todos, tengo que hacer un programa que identifique las frases palíndromas. Tengo este código, pero falla en el if al comprobar la cadena con la cadena invertida:

En esencia la idea está bien pero mal implementada:

* Al usar "strrev(frase2)" de forma automática la frase 2 queda invertida y lógicamente es siempre igual a si misma.

* Lo anterior lleva al uso de una tercera cadena para guardar frase1 igual a frase2:

Código (cpp) [Seleccionar]
for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
 if (frase1[letra1] != ' ')
   frase2[letra2++] = frase1[letra1] , frase3[letra2 - 1] = frase1[letra1];


y a continuación no hay más que comparar frase3 con frase2 invertida.

* Pero ahí viene el otro error grave que tienes que es comparar en el if dos cadenas con "==" cuando eso en C no es válido. Para ello has de usar "strcmp":

Código (cpp) [Seleccionar]
if (strcmp (frase3 , strrev(frase2))  == 0)
 printf("\nTu frase es palindroma!");
else
 printf("\nTu frase no es palindroma!");


Con esas correcciones tu código es totalmente funcional.

Aunque las otras ideas que te han dado son más "chachis".

P.D:Te falta el "return" de main.

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



AxelP

Les agradezco mucho a todos, ahora ya pude comprender mejor como lo hace  ;-)
Solo tengo una duda en la respuesta de leosansan, el código funciona, pero ¿Por qué le restas 1 en la parte de frase3[letra2 - 1]? Eso es lo único que no entiendo, y repito muchas gracias a todos.

Cita de: leosansan en 15 Noviembre 2014, 20:33 PM

* Lo anterior lleva al uso de una tercera cadena para guardar frase1 igual a frase2:

Código (cpp) [Seleccionar]
for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
 if (frase1[letra1] != ' ')
   frase2[letra2++] = frase1[letra1] , [u]frase3[letra2 - 1][/u] = frase1[letra1];




rir3760

Cita de: AxelP en 15 Noviembre 2014, 23:33 PMSolo tengo una duda en la respuesta de leosansan, el código funciona, pero ¿Por qué le restas 1 en la parte de frase3[letra2 - 1]? Eso es lo único que no entiendo
Es debido al uso del operador secuencial ",". Su comportamiento dada la expresión:
frase2[letra2++] = frase1[letra1] , frase3[letra2 - 1] = frase1[letra1];

Es el siguiente:
1) Se evalúa la expresión a la izquierda, esta es "frase2[letra2++] = frase1[letra1]" y su resultado se descarta.
2) Todos los efectos laterales del paso 1 se aplican: el valor de la variable "letra2" se incrementa en una unidad.
3) Se evalúa la expresión a la derecha, esta es "frase3[letra2 - 1] = frase1[letra1]". El punto importante aquí es que el valor de "letra2" ya se incremento en una unidad y ahora es el indice del siguiente carácter, por ello se le resta una unidad.

Ya que la idea es copiar la cadena en dos arrays otra opción mas sencilla y con el mismo efecto es:
frase3[letra2] = frase2[letra2] = frase1[letra1];
letra2++;


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

AxelP

Muchas gracias  :D ;-)
Ahora entiendo por qué es, y que tu ejemplo es lo mismo, creo que ya comprendo perfectamente el código, muchas gracias rir3760 y también a todos los demás, ya pude entender y hacer mi tarea  :D

leosansan

Cita de: rir3760 en 16 Noviembre 2014, 02:31 AM
......................................
Ya que la idea es copiar la cadena en dos arrays otra opción mas sencilla y con el mismo efecto es:
frase3[letra2] = frase2[letra2] = frase1[letra1];
letra2++;

.........................

Incluso más sencillo:

frase3[letra2] = frase2[letra2++] = frase1[letra1];

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




rir3760

Cita de: leosansan en 16 Noviembre 2014, 14:05 PMIncluso más sencillo:

frase3[letra2] = frase2[letra2++] = frase1[letra1];

No porque el operador de asignación no garantiza un punto de secuencia y por ende en la expresión:
frase3[letra2 /* B */] = frase2[letra2++ /* A */] = frase1[letra1];
Se corre el riesgo de que la expresión A se evalue y su efecto lateral se aplique antes que la evaluación de la expresión B.

Un caso similar que se utiliza para explicar el punto y que por supuesto no se recomienda es:
a[i] = i++;
Debido a que el resultado de la expresión depende del orden de evaluación de los operandos y el momento exacto de la aplicación de los efectos laterales (algo que no define el lenguaje).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language