Autor
|
Tema: Ayuda para saber si una cadena es palíndromo o no (Leído 3,950 veces)
|
Kaori22
Desconectado
Mensajes: 2
|
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); } void LEER_CADENA(char cad[]){ printf("Ingresa la cadena: "); } 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; 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; 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
|
|
« Última modificación: 6 Diciembre 2021, 15:55 pm por MCKSys Argentina »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
|
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.
|
|
|
En línea
|
|
|
|
Kaori22
Desconectado
Mensajes: 2
|
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
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
|
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 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
AYUDA. Quiero saber como cortar una cadena hasta un identificador.
Programación Visual Basic
|
el_trocha
|
3
|
5,944
|
16 Septiembre 2007, 12:00 pm
por el_trocha
|
|
|
[Python]Formas de saber si una palabra es palindromo
Scripting
|
0x5d
|
2
|
22,764
|
26 Abril 2012, 01:19 am
por 0x5d
|
|
|
Ayuda - Saber si se repiten caracteres en una misma cadena
Programación C/C++
|
Miky Gonzalez
|
2
|
22,917
|
4 Julio 2012, 14:07 pm
por Miky Gonzalez
|
|
|
[Python 3x] Saber si una frase o palabra es un palíndromo
Scripting
|
erickcasita
|
2
|
4,353
|
4 Febrero 2018, 06:21 am
por tincopasan
|
|
|
necesito ayuda para resolver este algoritmo
Ejercicios
|
arapisa
|
2
|
4,309
|
17 Marzo 2018, 23:49 pm
por dijsktra
|
|