PDA

Ver la Versión Completa : Problema al implementar Pilas


xeelons
06-04-2010, 15:28:03
Despues de 1 año de no haber programado en delphi tube problemas al tratar de implementar el algoritmo que transforma una cadena de numeros y operadores a otra, lo que es llamado de infija a posfija,no logro darme cuenta cuall es el problema , se los agradeceria si podrian ayudarme.

Gracias

program posfijaproject;



uses
SysUtils,dialogs;
const
max=100;
type
tipoelemento=char;
pila=array[1..max]of tipoelemento;
var
P:pila;
tope:0..max;
x:char;
infija,posfija:string;
i:integer;

procedure CreaPila(var P:pila);
begin
tope:=0;
end;
function PilaVacia(P:pila):boolean;
begin
PilaVacia:=(tope=0);
end;
function Pilallena(P:pila):boolean;
begin
Pilallena:=(tope=max);
end;
procedure Apilar(Var P:pila ; x:char);
begin
if Pilallena(P)
then
showmessage('La pila esta llena')
else
begin
tope:=tope+1;
P[tope]:=x;
end;
end;
procedure Desempilar(Var P:pila ; x:char);
begin
if PilaVacia(P)
then
showmessage('la pila esta vacia')
else
begin
x:=P[tope];
tope:=tope-1;
end;
end;
procedure Accesatope(P:pila);
begin
if not PilaVacia(P)
then showmessage(P[tope]);
end;

function Prioridad(var x:char):integer;
var
pri:integer;
begin
case x of
'@':Prioridad:=3;
'*':Prioridad:=2;
'/':Prioridad:=2;
'+':Prioridad:=1;
'-':Prioridad:=1;
'(':Prioridad:=0;
')':Prioridad:=0;
'0'..'9':Prioridad:=0;
else
showmessage('operador invalido')
end;
end;



begin
infija:=inputbox('infija','','');
CreaPila(P);
i:=0;
for i:=1 to length(infija) do
begin
showmessage(intTostr(i));

case infija[i] of
'0'..'9':posfija[i]:=infija[i];
'(' :Apilar(P,infija[i]);
')':
begin
showmessage(infija[i]);
while P[tope]<>'(' do
begin
Desempilar(P,infija[i]);
posfija[i]:=infija[i];
end;
end;
'@': Apilar(P,infija[i]);
'-','+','*','/':
begin
while Prioridad(P[tope])>=Prioridad(infija[i]) do
begin
Desempilar(P,P[tope]);
posfija[i]:=P[tope];
end;
Apilar(P,infija[i]);
end;

else
showmessage('que paso')
end;

end;





end.

BrunoBsso
06-04-2010, 19:03:40
Eso no compilará jamás en Delphi porque Delphi es OO.
Ese programa está hecho para Pascal, programación procedural.
Otra cosa, este procedimiento

procedure Desempilar(Var Pila ; x:char);
begin
if PilaVacia(P)
then
showmessage('la pila esta vacia')
else
begin
x:=P[tope];
tope:=tope-1;
end;
end;

no te va a devolver nada porque el parámetro x está pasado por valor y no por referencia. Tendrías que pasarlo por referencia (var) para que te devuelva algo (o mejor, hacer una función).
Si es otro el problema, avisá y miro lo demás.

roman
06-04-2010, 19:20:09
Eso no compilará jamás en Delphi porque Delphi es OO.

Delphi está basado en Pascal y puede programarse proceduralmente sin ningún problema.

Otra cosa es que realmente no compila porque hay muchas declaraciones sin tipo como


var
Pila;


Yo le recomendaría a xeelons que primero corrija ese tipo de errores para que compile y luego comente qué problemas le da el algoritmo.

Y, claro, no deja de ser recomendable comenzar a trabajar más OOP y menos P :)

// Saludos

xeelons
06-04-2010, 20:22:36
si tienes razon,pero cuando copie y pege el codigo si especifique el tipo de variable que es P: Pila; pero por algun motivo no aparece en el post ,ya intente modificarlo,pero sigue sin aparecer correctamente.
lo que quiero saber es por que no se ejecuta el bucle for,creo que el error tiene ver con esta parte del codigo: '0'..'9'osfija[i]:=infija[i];debe de ser '0'..'9':posfija[i]:=infija[i];
mejor subire el archivo

roman
06-04-2010, 20:55:25
Ja, ja, ok. Creo que es un filtro del editor. Lo que pasa es que :p se usa para poner la carita :p y supongo que por eso se confunde y lo omite.

En fin, razón de más para recordar que conviene anteponer una T a los tipos de datos:


type
TPila = array[1..max]of tipoelemento;


Si el ciclo for no se ejecuta, da la impresión de que en la llamada


infija:=inputbox('infija','','');


el usuario cancela el cuadro de diálogo y el valor devuelto es una cadena vacía. ¿Has verificado eso?

// Saludos

xeelons
06-04-2010, 22:54:03
Si tienes razon ,ahora usare el T. bueno creo que ya solucione parte de mi problema,este era que cuando cree la varialble posfija como string surge algun tipo de error con posfija[i]:=infija[i].
la forma en que solucione este problema es el siguiente: posfija[i]:=infija[i]; lo reemplaze con
posfija:= posfija +infija[i].
y antes del bucle for,inicializarla con posfija:=' ' ; vacio.

BrunoBsso
07-04-2010, 02:22:06
Román, yo me refería a que no iba a compilar en un VCL. Pensé que quedaba claro lo que dije, pero la próxima vez tendré que ser más específico en cada palabra que escriba.
Por cierto, gracias por la aclaración de que Delphi está basado en Pascal (u Object Pascal será), pero lo sé desde hace unos 4 años cuando empecé.

roman
07-04-2010, 03:15:27
Román, yo me refería a que no iba a compilar en un VCL.

¿A qué te refieres con esto? El código de xeelons, salvo los errores ya comentados, compila sin problemas. No conozco el concepto de compilar en un VCL.

// Saludos

BrunoBsso
07-04-2010, 04:04:32
A ver.
Abrí el IDE. Crea un nuevo form VCL. Borrá todo lo que viene por defecto. Pegá ese código.
¿Ahora sí se entiende? VCL = Visual Component Library = Programita con ventanas.
A eso me refería yo, pensé que había hecho eso. Ya ví a una persona hacerlo cuando abrió por primera vez el IDE de Delphi, así que no me hubiese sorprendido que alguien más lo haga.
Espero que sea entendible para vos ahora lo que dije.
Sino bueno, más palabras no puedo agregar.

roman
07-04-2010, 05:01:54
En todo caso, de tu aseveración original:

Eso no compilará jamás en Delphi porque Delphi es OO.
Ese programa está hecho para Pascal, programación procedural.

no era posible deducir lo que ahora comentas. Recuerda que oop != vcl. Se puede escribir un programa oop sin ninguna ventanita ;)

// Saludos

BrunoBsso
07-04-2010, 05:47:37
Recuerda que oop != vcl. Se puede escribir un programa oop sin ninguna ventanita ;)

Claro, puse OO pensando en visual, me equivoqué. Pero igual, yo te respondí cuando dijiste que
No conozco el concepto de compilar en un VCL.

Así que en todo caso, la duda que tenías era sobre VCL y yo te respondí concretamente eso.

Para que sea más facilito de entender y no me vengas de nuevo con preguntas hacia una cosa para luego "arreglas" refiriéndote a otra (digo, porque no conocías el concepto de compilar en un VCL pero después la arreglaste volviendo con que se puede escribir un programa oop sin ninguna ventanita) yo hablaba de VCL.

VCL - VCL - VCL - VCL.

Espero que así sea fácil de entender. Porque en VCL se hacen programas con "ventanitas", ¿no? ;)

PD: ¿hacía alguna falta la cara de guiñar el ojo? yo no le veo ningún sentido, no aporta nada... pero después empiezan con que los dialectos y toda la bola que no me la creo 2 veces :rolleyes: sin ofender.

PD2: chau foro, espero nunca más tener que preguntar algo acá, hay personitas que responden con un leve tono egocéntrico, pero si se los decís te agarran todos juntitos para denfender al pollito.

roman
07-04-2010, 07:07:11
Puedes enredarte lo que quieras pero al final lo que hay es lo que hay. Hiciste una aseveración que no es correcta y yo hice una simple aclaración para que quienes lean esto no se confundan.

Pero tal parece que tiendes a interpretar cualquier corrección como un ataque o crítica a tu persona y de ahí derivó el resto.

Por cierto, el guiño era precisamente para lo contrario que tu imaginas; la intención era poner un tono amistoso en el comentario.

En fin, ojalá rectifiques en tu decisión, porque has hecho aportaciones muy buenas.

// Saludos

Casimiro Notevi
07-04-2010, 11:41:59
Quien tiene boca... se equivoca :)

Yo me equivoco muchísimas, muchísimas, muchísimas veces... ¡y me quieren igual! :D

A veces se contesta con prisas y no nos damos cuenta que estamos equivocándonos nosotros mismos o contestando cosas que no tienen mucho que ver con lo que preguntan. Esas cosas suceden, pero tiene fácil solución: "!huy!, me he equivocado, cierto" :D y me río de mi error :D, de los errores se aprende... así que es bueno equivocarse :D

Caral
07-04-2010, 13:58:36
Hola
Seré yo Maestro?????, seré yo?????.
Pio, pio, pio...........:D:D:D:D
Saludos
PD: Aparte de la broma:
Lastima, seguí este debate de ideas desde ayer y me pareció muy interesante.
Que pena que no se pueda reconocer que nadie es poseedor de la verdad absoluta.