elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda para saber si una cadena es palíndromo o no
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda para saber si una cadena es palíndromo o no  (Leído 3,950 veces)
Kaori22

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ayuda para saber si una cadena es palíndromo o no
« en: 6 Diciembre 2021, 03:38 am »

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:

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #define L 50
  5.  
  6. void LEER_CADENA(char []);
  7. void VER_CADENA(char []);
  8. void QUITAR_ESPACIOS(char [], char []);
  9. void PALINDROMO (char[], char[]);
  10.  
  11. int main(){
  12.    char CAD[L];
  13.    char CADNUEVA[L];
  14.    int CON;
  15.    LEER_CADENA(CAD);
  16.    QUITAR_ESPACIOS(CAD,CADNUEVA);
  17.    VER_CADENA(CADNUEVA);
  18.    PALINDROMO(CAD,CADNUEVA);
  19.    getch();
  20. }
  21.  
  22. void LEER_CADENA(char cad[]){
  23.    printf("Ingresa la cadena: ");
  24.    gets(cad);
  25. }
  26.  
  27. void VER_CADENA(char cadnueva[]){
  28.    printf("\nLa cadena ingresada es: %s",cadnueva);
  29. }
  30.  
  31. void QUITAR_ESPACIOS(char cad[], char cadnueva[]){
  32.    int i,j,n;
  33.    i=0;
  34.    j=0;
  35.    n=strlen(cad);
  36.    for(i=0;i<n;i++){
  37.        if(cad[i]!=' '){
  38.            cadnueva[j]=cad[i];
  39.            j=j+1;
  40.        }
  41.    }
  42. }
  43.  
  44. void PALINDROMO(char cad[], char cadnueva[]){
  45.    int i,m,n;
  46.    i=0;
  47.    m=0;
  48.    int cont=0;
  49.    n=strlen(cad);
  50.    for(i=0;i<n/2;i++){
  51.            if(cad[i]!=cadnueva[m]){
  52.                cont++;}
  53.            if(cad[i]!=cadnueva[m]){
  54.                cont++;}
  55.            if(cad[i]!=cadnueva[m]){
  56.                cont++;}
  57.    }
  58.    if(cont==0) printf("\n\nEs un palindromo.\n");
  59.    else printf("\n\nNo es un palindromo.\n");
  60. }

MOD: Etiqueta GeSHi


« Última modificación: 6 Diciembre 2021, 15:55 pm por MCKSys Argentina » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda para saber si una cadena es palíndromo o no
« Respuesta #1 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.


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Ayuda para saber si una cadena es palíndromo o no
« Respuesta #2 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...

Código:
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.
En línea

Kaori22

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Ayuda para saber si una cadena es palíndromo o no
« Respuesta #3 en: 6 Diciembre 2021, 15:31 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...

Código:
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 :(

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
« Última modificación: 6 Diciembre 2021, 15:55 pm por MCKSys Argentina » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Ayuda para saber si una cadena es palíndromo o no
« Respuesta #4 en: 7 Diciembre 2021, 02:18 am »

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...

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 :(

Código:
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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines