Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: dailia__ en 30 Abril 2018, 22:45 PM

Título: Invertir cadena de carácteres sobre si misma con punteros
Publicado por: dailia__ 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

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

Título: Re: Invertir cadena de carácteres sobre si misma con punteros
Publicado por: dijsktra 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



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

Que te sirva! Y perdón por los acentos que faltan!
Título: Re: Invertir cadena de carácteres sobre si misma con punteros
Publicado por: dailia__ en 10 Mayo 2018, 08:24 AM
Mil Gracias, de verdad.