UTNianos

Versión completa: ayuda urgente!!!
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
hola! soy nueva en este foro y necesito ayuda estoy trabada con un ejercicio que me piden que lo realice en turbo pascal tengo tiempo de entregar el 18/11 a las 23.55 hs. Esta es la consiga:

"Generar una lista doblemente encadenada que cargue una palabra letra por letra (cada nodo es un caracter) mediante prim como pila y luego verifique si dicha palabra es un palíndrome."
ejemplo: TOPAPOT es palíndrome
CARACAS no es palíndrome

esto es lo que tengo hecho en pascal:

program PALO;
type
lista=^nodo;
nodo=record
letra:string;
ant:lista;
sig:lista;
end;

listadoble=record
pri:lista;
ult:lista;
end;

var
a:string;
prim,ult,q,r:lista;
palindrome:boolean;

begin
prim:=nil;
write ('ingrese letra: '); readln (a);
while (a<>'') do begin
new(q);
q^.letra:=a;
q^.ant:=nil;
if (prim=nil) then begin
q^.sig:=nil;
ult:=q;
end else begin
q^.sig:=prim;
prim^.ant:=q;
end;
prim:=q;
write ('ingrese letra: '); readln (a);
end;

q:=prim; r:=ult;
if (q^.letra=r^.letra) or (r^.sig=q) then
palindrome:=true
else begin
if (q^.letra<>r^.letra) then
palindrome:=false;
end;

if palindrome then begin
writeln ('la palabra es palindromo: ');
end else begin
writeln ('la palabra no es palindromo: ');
q:=q^.sig;
end;
end.

*cuando lo hago con el dato tipo string funciona pero en el ejercicio me pide que sea de tipo caracter y cuando lo hago entra en un bucle infinito.....agradecería que alguien me ayude porque no estoy encontrando el error......

gracias!
En que parte te entra en un bucle infinito ?
No podés hacerlo para que termine con un 0?

begin
prim:=nil;
write ('ingrese letra: '); readln (a);
while (a<>'0') do begin
new(q);
q^.letra:=a;
q^.ant:=nil;
if (prim=nil) then begin
q^.sig:=nil;
ult:=q;
end else begin
q^.sig:=prim;
prim^.ant:=q;
end;
prim:=q;
write ('ingrese letra: '); readln (a);
end;
Seria mejor si sube el codigo posta que tiene que entregar, y ahi revisarlo.
hola chicos! en el código que subí primero me faltaba hacer el recorrido para verificar si la palabra es o no palíndromo, eso lo agregué pero ahora el problema es cuando ingreso una palabra como 'ana' que es palíndromo y entra en un bucle infinito escribiendo que la palabra es palíndromo.

les adjunto el código que tengo hecho para que lo revisen......

program PALO;
type
lista=^nodo;
nodo=record
letra:char;
ant:lista;
sig:lista;
end;

var
a:char;
prim,ult,q,r:lista;
palindrome:boolean;

begin
prim:=nil;
write ('ingrese letra: '); readln (a);
while (a<>'')and (a<>'.') do begin
new(q);
q^.letra:=a;
q^.ant:=nil;
if (prim=nil) then begin
q^.sig:=nil;
ult:=q;
end else begin
q^.sig:=prim;
prim^.ant:=q;
end;
prim:=q;
write ('ingrese letra: '); readln (a);
end;

q:=prim; r:=ult;
while (q<>r) do begin
if (q^.letra=r^.letra) or (r^.sig=q) then
palindrome:=true
else begin
if (q^.letra<>r^.letra) then
palindrome:=false;
end;

if palindrome then begin
writeln ('la palabra es palindromo: ');
end else begin
writeln ('la palabra no es palindromo: ');
q:=q^.sig;
end;
end;
readln;
end.


desde ya muchas gracias chicos! roll
while (q<>r) do
begin
if (q^.letra=r^.letra) or (r^.sig=q) then
palindrome:=true
else begin
if (q^.letra<>r^.letra) then
palindrome:=false;
end;

if palindrome then begin
writeln ('la palabra es palindromo: ');
end else begin
writeln ('la palabra no es palindromo: ');
q:=q^.sig;
end;
end;

Ahi esta el error, esta dentro del while, por eso te lo imprime infinitas veces.

Ademas tendrias que validar que no se te acaben los nodos. Sino q:=q^.sig tira error cuando q=nil
a ver si entendí decís que coloque:

while (q<>nil) and (q<>r) do begin

así? o como?Confused
Tendria que revisar la logica mas a fondo, creo que vos recorres hasta el ultimo nodo, asi que creo que no tendrias problema. De todas formas ponelo asi, mas seguridad.


No te olvides de lo importante, sacar esto de dentro del while:

if palindrome then begin
writeln ('la palabra es palindromo: ');
end else begin
writeln ('la palabra no es palindromo: ');
end;


Lo que tendrias que hacer, es agregarle otra bandera, si entra por el else setearla en falso. Y eso nunca cambia. Y al final del programa te fijas si esa bandera esta en true o false, y ahi informas si es un palindromo. En pseudocodigo barato:


bandera:=true;
while (mi linda condicion) do begin
logica;

if (condicion de palindromo) then
logica;
else begin
logica;
bandera:=false; <------------ Al modificarse solo por el false, aseguras de que no se te vuelva a poner en true
end;

mas_logica;

end; (del while)

if (bandera) then writeln('Es un palindromo');
else writeln('No es un palindromo');
hola! mirá este es el programa definitivo, ingresa letras hasta que sea distinto de punto cuando es un punto me dice si la palabra es palindromo o no. Ayer le consulté a mi profesor de teoría y me dijo que tengo que ver la condición de que no se cruzen los punteros....lo compilé y funciona sólo el tema de la condición de los punteros no sé como plantearlos....

program PALO;
type
lista=^nodo;
nodo=record
letra:char;
ant:lista;
sig:lista;
end;

var
a:char;
prim,ult,q,r:lista;
palindrome:boolean;

begin
prim:=nil;
write ('ingrese letra: '); readln (a);
while (a<>'.') do begin
new(q);
q^.letra:=a;
q^.ant:=nil;
if (prim=nil) then begin
q^.sig:=nil;
ult:=q;
end else begin
q^.sig:=prim;
prim^.ant:=q;
end;
prim:=q;
write ('ingrese letra: '); readln (a);
end;

q:=prim; r:=ult;
while (q<>r) do begin
if (q^.letra=r^.letra) or (r^.sig=q) then
palindrome:=true
else begin
palindrome:=false;
end;
q:=q^.sig;
r:=r^.ant;
end;

if palindrome then begin
writeln ('la palabra es palindromo: ');
end else begin
writeln ('la palabra no es palindromo: ');
end;
readln;
end.
Que no se cruzen los punteros esta planteado cuando haces while (q<>r) do begin


De todas formas me parece que el programa ese pincha.

Proba la siguiente palabra:

abbbbbbc

Deberia decirte que no es palindromo, sin embargo sospecho que te va a decir que si.

Si te dice que no. Listo, el programa ya esta.
hola! probé y me dice que no es palíndromo.....muchas gracias chicos por contestar!!!!
De nada. Suerte
URLs de referencia