Ayuda para saber si una cadena es palíndromo o no

Iniciado por Kaori22, 6 Diciembre 2021, 03:38 AM

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

Kaori22

Buenas noches, agradecería si me ayudaran con mi código, por favor, ya que sólo me dice si una palabra es palíndromo pero si introduzco una frase, no funciona. Mi profesora me dijo que con el valor de N, ya sin los espacios, tenía que hacer el bucle (con for) y comparar cad[0] con cad[N-1]; cad[1] con cad[N-2] y así hasta llegar a cuando N es igual a la mitad de la cadena, pero creo que no supe como hacerlo. Este es mi código:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define L 50

void LEER_CADENA(char []);
void VER_CADENA(char []);
void QUITAR_ESPACIOS(char [], char []);
void PALINDROMO (char[], char[]);

int main(){
    char CAD[L];
    char CADNUEVA[L];
    int CON;
    LEER_CADENA(CAD);
    QUITAR_ESPACIOS(CAD,CADNUEVA);
    VER_CADENA(CADNUEVA);
    PALINDROMO(CAD,CADNUEVA);
    getch();
}

void LEER_CADENA(char cad[]){
    printf("Ingresa la cadena: ");
    gets(cad);
}

void VER_CADENA(char cadnueva[]){
    printf("\nLa cadena ingresada es: %s",cadnueva);
}

void QUITAR_ESPACIOS(char cad[], char cadnueva[]){
    int i,j,n;
    i=0;
    j=0;
    n=strlen(cad);
    for(i=0;i<n;i++){
        if(cad[i]!=' '){
            cadnueva[j]=cad[i];
            j=j+1;
        }
    }
}

void PALINDROMO(char cad[], char cadnueva[]){
    int i,m,n;
    i=0;
    m=0;
    int cont=0;
    n=strlen(cad);
    for(i=0;i<n/2;i++){
            if(cad[i]!=cadnueva[m]){
                cont++;}
            if(cad[i]!=cadnueva[m]){
                cont++;}
            if(cad[i]!=cadnueva[m]){
                cont++;}
    }
    if(cont==0) printf("\n\nEs un palindromo.\n");
    else printf("\n\nNo es un palindromo.\n");
}


MOD: Etiqueta GeSHi

MAFUS

No te acuerdas cómo funcionan las cadenas en C.
Acuérdate del carácter terminal y que en una cadena construida a mano, como en quitar_espacios, C no te lo va a incluir automáticamente.

Después explícame qué haces en la función palindromo. No lo que deberías hacer, sino lo qué haces.

Serapis

En vez de complicarte eliminando espacios, simplemente sáltalos.
Tendrás 2 punteros, el de posición de lectura del principio, y el del final.
Mientras un cáracter sea espacio (ó puntuaciíon: ',' '.' ':' ';', paréntesis, etc..) avanzas sin hacer la comparación, así llegas a un carácter comparable.
Luego igual desde el final, cuando localizas dos caracteres comparables, es cuando realizas dicha comparación.

Es realidad, es preferible hacer saltos, simplificando la lógica, es decir mientras no sea un carácter saltar al siguiente...


entero ini=0, fin= cadena.length
buleano pal=FALSE

Hacer mientras (Ini < fin)
    // saltar caracteres 'extraños' de la parte delantera
    hacer mientras esAlfaAZ(texto(ini))= false
       ini +=1
       si (ini >= fin) devolver pal
    repetir
    // saltar caracteres extraños de la parte trasera
    hacer mientras esAlfaAZ(texto(fin))= false
       fin -=1
       si (fin<= ini) devolver pal
    repetir
   
    // comparar la pareja de caracteres vigente
    si (texto(ini) <> texto(fin)) devolver FALSE
    ini +=1
    fin -=1
    pal= true
repetiir

devolver TRUE


Con este pseudocódigo para evitar que devuelva como palíndromo un texto que no contuviera ni un solo carácter, alfabético en el rango AZ... se controla, desde la última línea del bucle, solo si se ha ejecutado al menos una vez una comparación satisfactoria, 'pal= TRUE'.

...y es de suponer que la capitalización no debe ser un obstáculo para considerarlo palíndromo, pero esto último abórdalo solo cuando hayas solucionado el problema y te funcione bien.

Kaori22

#3
Cita de: Serapis en  6 Diciembre 2021, 13:33 PM
En vez de complicarte eliminando espacios, simplemente sáltalos.
Tendrás 2 punteros, el de posición de lectura del principio, y el del final.
Mientras un cáracter sea espacio (ó puntuaciíon: ',' '.' ':' ';', paréntesis, etc..) avanzas sin hacer la comparación, así llegas a un carácter comparable.
Luego igual desde el final, cuando localizas dos caracteres comparables, es cuando realizas dicha comparación.

Es realidad, es preferible hacer saltos, simplificando la lógica, es decir mientras no sea un carácter saltar al siguiente...


entero ini=0, fin= cadena.length
buleano pal=FALSE

Hacer mientras (Ini < fin)
   // saltar caracteres 'extraños' de la parte delantera
   hacer mientras esAlfaAZ(texto(ini))= false
      ini +=1
      si (ini >= fin) devolver pal
   repetir
   // saltar caracteres extraños de la parte trasera
   hacer mientras esAlfaAZ(texto(fin))= false
      fin -=1
      si (fin<= ini) devolver pal
   repetir
   
   // comparar la pareja de caracteres vigente
   si (texto(ini) <> texto(fin)) devolver FALSE
   ini +=1
   fin -=1
   pal= true
repetiir

devolver TRUE


Con este pseudocódigo para evitar que devuelva como palíndromo un texto que no contuviera ni un solo carácter, alfabético en el rango AZ... se controla, desde la última línea del bucle, solo si se ha ejecutado al menos una vez una comparación satisfactoria, 'pal= TRUE'.

...y es de suponer que la capitalización no debe ser un obstáculo para considerarlo palíndromo, pero esto último abórdalo solo cuando hayas solucionado el problema y te
funcione bien.

Es que mi profesora dijo que debe llevar la función de quitar los espacios y después para saber si es palindromo, usar otra subrutina que compare los caracteres del inicio con los del final de la cadena sin espacios. Pero ahí ya no sé cómo se hace el ciclo con for, que es lo que me pide también :(


Cita de: MAFUS en  6 Diciembre 2021, 11:37 AM
No te acuerdas cómo funcionan las cadenas en C.
Acuérdate del carácter terminal y que en una cadena construida a mano, como en quitar_espacios, C no te lo va a incluir automáticamente.

Después explícame qué haces en la función palindromo. No lo que deberías hacer, sino lo qué haces.

Dijo mi profesora que por eso debíamos usar la función strlen, para que no contara el caracter nulo del final.

La función se supone que divide la cadena a la mitad y compara si esas son iguales, entonces sí es palíndromo, pero estoy confundida precisamente en esa parte, ya que mi profesora me dijo que debía comparar los caracteres de esa cadena, los del principio con los del final y si eran iguales, ya te dice si es o no palíndromo. Pero no sé cómo debería hacer eso usando for.

MOD: No hacer doble post

Serapis

Cita de: Kaori22 en  6 Diciembre 2021, 15:31 PM
Es que mi profesora dijo que debe llevar la función de quitar los espacios y después para saber si es palindromo
Entonces tendrás que hacerlo como se solicita...

Cita de: Kaori22 en  6 Diciembre 2021, 15:31 PM
usar otra subrutina que compare los caracteres del inicio con los del final de la cadena sin espacios. Pero ahí ya no sé cómo se hace el ciclo con for, que es lo que me pide también :(


entero ini=0, fin= cadena.length //strlen

//Hacer mientras (Ini < fin)
bucle FOR con ini desde 0 hasta (fin/2)
   si (texto[ini] <> texto[fin]) devolver FALSE   // comparar la pareja de caracteres
   fin -=1   //ini +=1
siguiente
//repetiir

devolver TRUE