Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo averiguar si una frase es un palíndromo (https://www.clubdelphi.com/foros/showthread.php?t=64366)

neerii 28-03-2009 20:46:03

Cómo averiguar si una frase es un palíndromo
 
hola.. yo soy nueva en esto asi que no entiendo mucho.. tengo que hacer un programa que verifique si una frase es un palindromo, pero en delphi 7. se que tengo que cortar los espacios, todas las letras pasarlas a mayusculas y las acentuadas a no.. pero no se como hacerlo.. espero que me puedan ayudar..

Delphius 28-03-2009 21:14:53

Hola neerii,
Bienvenido a clubdelphi.

Como eres nuevo, te pido que te tomes unos minutos para leer la guia de estilo.

Respecto a tu duda sería útil que nos comentases que estuviste probando. Si nos comentas de forma más precisa sobre tus avances y/o dudas te podremos ser de mayor ayuda.

Intuyo que se trata de un ejercicio que te dieron en la facultad, instituto o cualquier otro establecimiento educativo. Y si te dieron esa tarea es para que tu te ejercites. No sería muy bueno de nuestra parte darte las cosas a modo de "regalo".

Yo en vez de ofrecerte una posible solución prefiero indicar opciones, guías, y/o comentarios para que tu mismo puedas unir conceptos y proponer un algoritmo. ¿Te parece justo?

Si estás de acuerdo, sería muy oportuno que nos comentes más respecto al tema.

Además, tienes a disposición un buscador en los foros en donde puedes buscar sobre el tema, tal vez sobre manejo de strings, trim, revesestring, y términos similares sean de ayuda;).

Saludos,

Cheerpipe 29-03-2009 03:24:49

Opino igual que el post anterior. Nunca es bueno dar las tareas hechas :D, y si es el caso, podrias decir que no tienes ni idea de como hacerlo.

El problema en si es bastante sensillo, es solo cosa de aislar las palabras usando los espacios como separador. La comprobacion es mas sencilla aun, recorres cada palabra en ambas direcciones y asi compruebas si es o no palindromo, la verdad se me ocurren muchas formas de como hacerlo.

Si tienes algo, postealo, se revisa y se te ayuda.

MAXIUM 29-03-2009 05:58:28

Para quitar o eliminar los espacios creo que se usa TRIM('hola amigos '), pero revisa la ayuda de Delphi.

Al igual que para dejar todo en mayúscula prueba con UPPERCASE('holaamigos'), pero consulta la ayuda de Delphi.

Puedes tratar la palabra como un arreglo de caracteres y manejarlo con un loop, como por ejemplo:

Para Texto:= 'RECONOCER';

Texto[0] = R
Texto[1] = E
...
...
Texto[8] = E
Texto[9] = R

Entonces vas comparando desde los extremos hacia el centro, si hay diferencias, entonces no es palindrome.

Texto[0] = Texto[9]
Texto[1] = Texto[8]

Usando Condiciones, Loop y la funchión Length estas al otro lado. Con esto mismo y previo, vas reemplazando las vocales tildadas por unas que no.

Código Delphi [-]
For desde:= 0 to length(Texto) do
begin
       Case Texto[desde] do
       begin
              'Á': Texto[desde]:= 'A'
              'É': Texto[desde]:= 'E'
              'Í': Texto[desde]:= 'I'
              'Ó': Texto[desde]:= 'O'
              'Ú': Texto[desde]:= 'U'
       end;
end;

Esa es la idea pero no se si esta correcta la estructura de CASE, revisa la ayuda de Delphi...

Finalmente, no te puedes presentar así, pidiendo que te hagamos todo el trabajo, muy mal augurio si lo tuyo tiene que ver con informática.

Para que tengas de prueba:
Cita:

Palabras palíndromos

Ana, arenera, arepera, anilina, ananá, Malayalam, Neuquén, Oruro, oso, radar, reconocer, rotor, salas, seres, somos, sometemos, oro, ala, ojo, solos y sagas.


Frases palíndromos

* ¿Acaso hubo búhos acá? (de Juan Filloy)
* Adivina ya te opina, ya ni miles origina, ya ni cetro me domina, ya ni monarcas, a repaso ni mulato carreta, acaso nicotina, ya ni cita vecino, anima cocina, pedazo gallina, cedazo terso nos retoza de canilla goza, de pánico camina, ónice vaticina, ya ni tocino saca, a terracota luminosa pera, sacra nómina y ánimo de mortecina, ya ni giros elimina, ya ni poeta, ya ni vida. (de Ricardo Ochoa)
* Allí por la tropa portado, traído a ese paraje de maniobras, una tipa como capitán usar boina me dejara, pese a odiar toda tropa por tal ropilla. (de Luis Torrent)
* Allí si María avisa y así va a ir a mi silla. (HG)
* Anita lava la tina. (Popular en México)
* Átale, demoníaco Caín, o me delata. (de Julio Cortázar)
* Dábale arroz a la zorra el abad. (Tal vez uno de los más populares)
* La ruta nos aportó otro paso natural.
* Nada, yo soy Adán. (Guillermo Cabrera Infante)
* No lata, no: la totalidad arada dilato talón a talón. (Juan Filloy)
*Aves, aten al planeta, se va.
http://es.wikipedia.org/wiki/Algunos_pal%C3%ADndromos

Delphius 29-03-2009 17:26:41

Hola a todos,
MAXIUM dio unos buenos tips.

Yo solo quiero hacer dos observaciones:

1. En vez de UpperCase, yo recomiendo AnsiUperCase. Revisar la ayuda para más información.

2. La estructura CASE es case ... of.;)

Saludos,

marcoszorrilla 29-03-2009 17:59:06

Mira este código que acabo de preparar, puedes crear con él una función o símplemente modificarlo, nota utilizo dos "Edit", para que resulte más didáctico, pero obviamente no son necesarios.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=AnsiUpperCase(StringReplace(Edit1.Text,' ','',[rfReplaceAll]));;
Edit2.Text:=ReverseString(Edit1.Text);

  If Edit1.text = Edit2.Text then
  ShowMessage('Es palíndromo.')
  else
  ShowMessage('No es palíndromo.');

end;

Un Saludo.

Al González 30-03-2009 06:13:04

Habrá inconvenientes con las letras que lleven acentos o diéresis, pues todas las funciones nativas discriminan entre letras con diacríticos y sin diacríticos (a no ser que se me escape alguna).

La solución a esto pasa por emplear "mapeo" de caracteres. Digamos una constante String con las letras que pueden llevar diacrítico, pero sin él, y una segunda constante String con las mismas letras pero con el diacrítico puesto.

Pero si se quiere impresionar al profesor y se cuenta con el tiempo y la disposición suficientes para investigar, convendría recurrir a la función MultiByteToWideChar de la API de Windows. Ya que ésta permite separar las partes de un carácter compuesto, digamos una a acentuada (á) en las partes que la componen (a y ´). Sólo tener cuidado de exceptuar a la eñe, que por alguna "extraña" razón fue tomada como letra compuesta por algún ingeniero en alguna parte del mundo.

Un saludo.

Al González. :)

ContraVeneno 30-03-2009 17:02:00

Cita:

Empezado por Al González (Mensaje 343148)
Habrá inconvenientes con las letras que lleven acentos o diéresis, pues todas las funciones nativas discriminan entre letras con diacríticos y sin diacríticos (a no ser que se me escape alguna).

Yo pensé que esto no era problema con "AnsiUpperCase"... :confused::confused::confused:

Cheerpipe 30-03-2009 17:04:36

Les dejo una funcion para extraer los simbolos (letra pura) de caracteres multybyte, en resumen, quitar acentos y otras hierbas usando la api mencionada arriba. Un detalle importante es que esto lo hice en Delphi 2009, en versiones anteriores la declaracion de uso de la api podria variar y por tanto las funciones que puse, no funcionaran, esto porque la declaración es ahora Unicode.

Código Delphi [-]
function extractSimbolFromMultiByteChar(Text: PAnsiChar): Char;
var
  Buffer: Char;
  Size: Integer;
begin
  Size := MultiByteToWideChar(0,0,Text,-1,nil,0);
  if (Size > 0) then
  begin
    MultiByteToWideChar(0 ,MB_COMPOSITE , Text,-1, @Buffer, Size);
    result:=Buffer;
  end;
end;

function clearMultiByteChar(Text: String): String;
var
  i: Integer;
begin
  result:='';
  for I := 1 to Length(Text) do
    Result:=Result+extractSimbolFromMultiByteChar(PAnsiChar(AnsiString(text[i])));
end;

Al González 30-03-2009 17:33:04

Cita:

Empezado por ContraVeneno (Mensaje 343174)
Yo pensé que esto no era problema con "AnsiUpperCase"... :confused::confused::confused:

Lo que tiene ANSIUpperCase es que considera a todos los caracteres del idioma actual, incluyendo los acentuados. Pero no da por iguales a una "a" y una "á".

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage (UpperCase ('a, á'));
  ShowMessage (ANSIUpperCase ('a, á'));
end;

Sería terrible que ANSIUpperCase quitara los acentos al convertir a mayúsculas. ;)

ContraVeneno 30-03-2009 17:55:12

cierto, cierto, ya entendí cuál sería el problema con los acentos. Gratzie :)


La franja horaria es GMT +2. Ahora son las 18:51:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi