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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Invertir cadena de carácteres sobre si misma con punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Invertir cadena de carácteres sobre si misma con punteros  (Leído 3,641 veces)
dailia__

Desconectado Desconectado

Mensajes: 8



Ver Perfil
Invertir cadena de carácteres sobre si misma con punteros
« en: 30 Abril 2018, 22:45 pm »

Hola,
Tengo que hacer un programa para saber si una frase es un palíndromo o no. para ello tengo que hacer una función que invierta la frase sobre si misma pero tengo que hacerlo con punteros y con los operadores de incremento y decremento aplicados a éstos. Pero es que no tengo ni idea de como hacerlo la verdad.
Lo único que hice de la función es esto, para determinar la longitud, me parece que se puede hacer con strl algo pero en clase aún no di eso así que lo hice así.
Agradecería un poco de ayuda, por favor

Código:
char *invertir (char *frase){
int i=0;
while (*frase!='\0'){
i++;
}
i--;
}



En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Invertir cadena de carácteres sobre si misma con punteros
« Respuesta #1 en: 1 Mayo 2018, 18:14 pm »

hola!

Yo preferiría hacerlo sin invertir las cadenas, porque es más fácil, pero si hay que hacerlo invirtiendo....


1 version. Sin incluir espacios, sólo palabras


Código
  1. #include <string> // string
  2. #include <iostream>  // cin, cout
  3. #include <cstdlib> //  malloc
  4.  
  5. using namespace std;
  6.  
  7. int palindrome(const char* W)
  8. {
  9.  char *jj;
  10.  const char *i, *j;
  11.  for(i=W  ; *i  ;i++) ;  // compute len=(i-W)
  12.  if (!(j=jj=(char *)calloc(sizeof(char),(i-W)+1)))
  13.    {
  14.      perror("calloc");
  15.      exit(-1);
  16.    }
  17.  for(  ; i > W  ;i--,jj++) *jj=*(i-1); // reverse copy
  18.  for(   ; *i && (*i == *j);i++,j++ ); //compare
  19.  return !*i ; //  true if end reached.
  20. }
  21.  
  22. int main(int argc, char **args)
  23. {
  24.  string phrase;
  25.  for (; getline(cin,phrase); )
  26.    cout << palindrome(phrase.c_str()) << endl;
  27.  return 0;
  28. }


Aquí algunos ejemplos de ejecución. 1 expresa que es palíndromo, 0 que no lo es.

Código:
1234
0
1111
1
1221
1
12344321
1
2
1
331133
1
33113
0
    (intro, palabra vacía, que es palindromo)
1

2 versión. Frases que pueden incluir varias palabras separadas por espacios, blancos, tabuladores...
(Nota: Los separadores están "normalizados" por la funcion isspace(int c))


Código
  1. #include <string> // string
  2. #include <iostream>  // cin, cout
  3. #include <cstdlib> //  malloc
  4.  
  5. #include <cctype> // isspace
  6. #define sp(c) isspace((c)) // shortcut    
  7.  
  8. using namespace std;
  9.  
  10. int palindrome(const char* W)
  11. {
  12.  const char *i, *j;
  13.  char *jj;
  14.  
  15.  for(i=W  ; *i  ;i++) ;
  16.  if (!(j=jj=(char *)calloc(sizeof(char),(i-W)+1))) // len=(i-W)
  17.    {
  18.      perror("calloc");
  19.      exit(-1);
  20.    }
  21.  for(  ; i > W  ;i--,jj++) *jj=*(i-1); // reverse copy
  22.  const char *b; // key!
  23.  for ( ; *i && (sp(*i)||sp(*j) || (*i==*j)); i+=(*i==*j)||sp(*i), j+=(*b==*j)||sp(*j)) b=i;
  24.  return !*i ; //  true if end reached.
  25. }
  26.  
  27.  
  28. int main(int argc, char **args)
  29. {
  30.  string phrase;
  31.  for (; getline(cin,phrase); )
  32.    cout << palindrome(phrase.c_str()) << endl;
  33.  return 0;
  34. }

Algunso casos de prueba

Código:
dabale arroz a la zorra el              abad
1
dabale arroz a la zorra el abad
1
dabale arroz al zorro el  abad
0
               (30 espacios en blanco e intro)
1

Lo que pasa es que no me da tiempo a explicarlo. Si, se que mi escritura del for puede desconcertar a algunos, pero se trata de un doble avance...de los punteros... Dos comentarios más :
  • con python no haria falta la variable "b" porque puede simular la asignacion simultanea.
  • se puede prescindir una de las variables, "j" o "jj" (la que quede debe se (char *)), a cambio de un bucle similar al primero para rescatar de nuevo la longitud de la cadena, antes de el último for de comparación 

Que te sirva! Y perdón por los acentos que faltan!


« Última modificación: 3 Mayo 2018, 09:12 am por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
dailia__

Desconectado Desconectado

Mensajes: 8



Ver Perfil
Re: Invertir cadena de carácteres sobre si misma con punteros
« Respuesta #2 en: 10 Mayo 2018, 08:24 am »

Mil Gracias, de verdad.
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