Hola,
Despues de conseguir, con ayuda, eliminar los espacios de un texto; me propongo saber si un texto es palindromo ( se lee igiual de izda a decha que al reves), he redactado lo que sigue, pero hay algun errorcillo que espero que me podais ayudar a detectar
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char texto[30];
char copytexto[30];
int i, j;
printf (" escribe la frase:");
gets( texto );
// se copia esta frase en un nuevo arreglo sin espacios
for( i=0;i<strlen(texto);i++ )
{
if( texto[i] == ' ' )/* si hay un espacio*/
{
for( j = i+1 ; texto[j] !='\0' ; j++ )
{
texto[j-1] = texto[j];
}
texto[j-1] = '\0';
}
}
printf( "Sin espacios : %s\n" ,texto );
/*strcpy (copytexto,texto);*/
for (i=0;i<strlen (texto);i++)
{
for(j<strlen(texto);j=0;j--)
if (texto[i]=texto[j])
printf("es palindromo");
else
printf("no lo es");
}
system( "pause" );
}
Muchas gracias
Muy util cuando llegue a casa lo miro.
Thanks
He editado un poco tu código de manera que lo que hace es que al texto sin espacios , lo copio a copytexto y a copytexto lo invierto , después comparo las dos cadenas y si son iguales , el texto es palíndromo ;-) ¡Gracias por el aporte!
PD: Para ver la salida que el programa produce no es necesario llamar al sistema , puedes hacer lo mismo con printf + getchar.
#include <string.h>
#include <stdio.h>
void invertir_cadena(char *cadena);
int main()
{
char texto[30];
char copytexto[30];
int i, j;
printf (" escribe la frase:");
gets( texto );
for( i=0;i<strlen(texto);i++ )
{
if( texto[i] == ' ' )/* si hay un espacio*/
{
for( j = i+1 ; texto[j] !='\0' ; j++ )
{
texto[j-1] = texto[j];
}
texto[j-1] = '\0';
}
}
strcpy (copytexto,texto);
invertir_cadena(copytexto);
printf( "Sin espacios : %s\n" ,texto );
if (strcmp(texto,copytexto)==0)
printf("Es palindromo\n");
else
printf("No es palindromo\n");
printf("Presione una tecla para continuar . . .");
getchar();
return 0;
}
void invertir_cadena(char *cadena)
{
char *p_f_cadena=cadena+strlen(cadena)-1;
char save=0;
for(int i = 0; cadena+i<=p_f_cadena; ++i)
{
save=*(cadena+i);
*(cadena+i)=*p_f_cadena;
*p_f_cadena=save;
--p_f_cadena;
}
}
Muchas gracias,
voy a mirarlo tranquilamente para tratar de entender lo que has escrito
saludos
Hola! no es mas facil tener dos indices, uno al inicio y otro al final del arreglo, para ir comparando letra por letra?? algo asi:
for(i=0,j=strlen(texto)-1; i!=j; i++,j-- )
if(texto[i]==texto[j])
"es palindromo"
Saludos
Cita de: durasno en 13 Julio 2012, 17:39 PM
for(i=0,j=strlen(texto)-1; i!=j; i++,j-- )
if(texto[i]==texto[j])
"es palindromo"
Solo estas comparando pares de letras, no todo el texto que pueda recivir.
Aqui tienes otra funcion:
#include <math.h>
#include <stdlib.h>
#include <string.h>
int palindromo(char *texto) /* texto no puede tener espacios en blanco */
{
int longitud = strlen(texto),i;
for(i = 0 ; i < longitud / 2 ; i++)
if(pow((rand() % 100) + 2 , texto[i] - texto[longitud - i - 1]) - 1)
return sin(acos(1));
return cos(log(1));
}
XD
¡Saludos!
estoy de acuerdo con durasno, veo mas sencillo recorrer el texto comparando 2 indices que empiezan al principio y al final, y se recorren hasta llegar a la mitad de la cadena. dejo aqui mi codigo, lo he probado y funciona:
#include <stdio.h>
#include <string.h>
#define SIZE 256
int main(int argc, char** argv)
{
char buffer[SIZE];
int i, j, cond=1;
printf("Introduzca la frase: ");
fgets(buffer, SIZE-1, stdin);
buffer[strlen(buffer)-1]='\0';
//eliminar espacios en blanco
for (i=0; i<strlen(buffer)-1; i++) {
if (buffer[i] == ' ') {
for (j=i; j<strlen(buffer)-1; j++) {
buffer[j]=buffer[j+1];
}
buffer[strlen(buffer)-1]='\0';
}
}
printf("La frase sin espacios es: %s\n", buffer);
//comprobar si es palindromo
for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
if (buffer[i] != buffer[strlen(buffer)-i-1]) {
cond=0;
}
}
if (cond == 1) {
printf("Es palindromo.\n");
} else {
printf("No es palindromo.\n");
}
return 0;
}
Exacto yo me referia a esto:
for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
if (buffer[i] != buffer[strlen(buffer)-i-1]) {
cond=0;
}
}
Igual me parece innecesario eliminar los espacios
Saludos
Cita de: durasno en 14 Julio 2012, 00:22 AM
Igual me parece innecesario eliminar los espacios
Si no eliminases los espacios, oraciones como "dabale arroz a la zorra el abad" no se cosiderarian palindromos, siendo que si se consideran como tal... o tampoco seria un palindromo el famoso "a man a plan a canal panama", que incluso hay programadores que han trabajado con este ultimo para extenderlo todo lo posible.
Todo depende de la "pureza" que quieras darle a un palindromo...
¡Saludos!
Lo acabo de hacer recien en el comentario y no lo probe, fijate si anda.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
string str, str2;
cin >> str;
size_t pos = str.find_first_of(" ");
while(pos != string::npos){
str.erase(pos);
pos = str.find_first_of(" ");
}
str2 = str.substr(0, str.length());
reverse(str.begin(), str.end());
if(str2 == str)
cout << "La frase '"<<str<<"' es palindroma." <<endl;
else
cout << "La frase '"<<str<<"' no es palindroma." <<endl;
system("pause");
return EXIT_SUCCESS;
}
Citar
Si no eliminases los espacios, oraciones como "dabale arroz a la zorra el abad" no se cosiderarian palindromos, siendo que si se consideran como tal... o tampoco seria un palindromo el famoso "a man a plan a canal panama", que incluso hay programadores que han trabajado con este ultimo para extenderlo todo lo posible.
:) ya entendi... Saludos
Cita de: bemone en 14 Julio 2012, 05:30 AM
Lo acabo de hacer recien en el comentario y no lo probe, fijate si anda.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
string str, str2;
cin >> str;
size_t pos = str.find_first_of(" ");
while(pos != string::npos){
str.erase(pos);
pos = str.find_first_of(" ");
}
str2 = str.substr(0, str.length());
reverse(str.begin(), str.end());
if(str2 == str)
cout << "La frase '"<<str<<"' es palindroma." <<endl;
else
cout << "La frase '"<<str<<"' no es palindroma." <<endl;
system("pause");
return EXIT_SUCCESS;
}
ummm funciona con palabras más no con frases.
Hola he retomado este tema y he encontrado este código, que de una manera facil y entendible para los que somos principaiantes, dice si una palabra es o no palindromo. Pero me surge la siguiente duda de principante, en el bucle for termina con ';' ( en los codigos que yo he hecho hasta ahora no se termina con ';') y si se elimina, aunque el programa compila y ejecuta, no funciona correctamente ¿ por que?
muchas gracias
int longitud;
int inicio=0, fin;
void palindromo (char palin[]);
char palin[30];
main()
{
palindromo(palin);
getch();
}
void palindromo (char palin[])
{
printf("dime una palabra:");
gets (palin);
longitud = strlen(palin);
for(fin=longitud-1; palin[fin]==palin[inicio] && fin>=0; inicio++,fin--);
if (inicio==longitud)
{
printf( "Es palindromo");
}
else
{
printf( "no es palindromo");
}
}
Mucho más simple
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char Palabra[100];
int i,len;
memset(Palabra,0,100);
printf("Introduce la palabra: ");
scanf("%s",&Palabra);
len = strlen(Palabra);
for (i=0;i!=len;i++)
{
if (Palabra[i] != Palabra[len-i-1]) break;
}
if (i==len) printf("Palindroma\n");
else printf("No es palindroma\n");
system("PAUSE");
return 0;
}
Muchas gracias por tu respuesta
por cierto que significa memset(Palabra,0,100);?
gracias
Cita de: ALONSOQ en 7 Agosto 2012, 17:34 PM
Muchas gracias por tu respuesta
por cierto que significa memset(Palabra,0,100);?
gracias
Llena el buffer Palabra con bytes nulos.
http://www.cplusplus.com/reference/clibrary/cstring/memset/
Cita de: ALONSOQ en 7 Agosto 2012, 17:34 PM
por cierto que significa memset(Palabra,0,100);?
http://bit.ly/HniJLP
google no muerde :-X ni tampoco cplusplus.com
Saludos