Invertir cadena de carácteres sobre si misma con punteros

Iniciado por dailia__, 30 Abril 2018, 22:45 PM

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

dailia__

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

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


dijsktra

#1
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



#include <string> // string
#include <iostream>  // cin, cout
#include <cstdlib> //  malloc
   
using namespace std;

int palindrome(const char* W)
{
  char *jj;
  const char *i, *j;
  for(i=W  ; *i  ;i++) ;  // compute len=(i-W)
  if (!(j=jj=(char *)calloc(sizeof(char),(i-W)+1)))
    {
      perror("calloc");
      exit(-1);
    }
  for(  ; i > W  ;i--,jj++) *jj=*(i-1); // reverse copy
  for(   ; *i && (*i == *j);i++,j++ ); //compare
  return !*i ; //  true if end reached.
}
   
int main(int argc, char **args)
{
 string phrase;
 for (; getline(cin,phrase); )
   cout << palindrome(phrase.c_str()) << endl;
 return 0;
}



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

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



#include <string> // string
#include <iostream>  // cin, cout
#include <cstdlib> //  malloc

#include <cctype> // isspace
#define sp(c) isspace((c)) // shortcut    

using namespace std;

int palindrome(const char* W)
{
  const char *i, *j;
  char *jj;

  for(i=W  ; *i  ;i++) ;
  if (!(j=jj=(char *)calloc(sizeof(char),(i-W)+1))) // len=(i-W)
    {
      perror("calloc");
      exit(-1);
    }
  for(  ; i > W  ;i--,jj++) *jj=*(i-1); // reverse copy
  const char *b; // key!
  for ( ; *i && (sp(*i)||sp(*j) || (*i==*j)); i+=(*i==*j)||sp(*i), j+=(*b==*j)||sp(*j)) b=i;
  return !*i ; //  true if end reached.
}

   
int main(int argc, char **args)
{
 string phrase;
 for (; getline(cin,phrase); )
   cout << palindrome(phrase.c_str()) << endl;
 return 0;
}


Algunso casos de prueba

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!
Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)