Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema al implementar Pilas (https://www.clubdelphi.com/foros/showthread.php?t=67219)

xeelons 06-04-2010 15:28:03

Problema al implementar Pilas
 
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
Código Delphi [-]
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
Código Delphi [-]
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

Cita:

Empezado por BrunoBsso (Mensaje 359456)
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

Código Delphi [-]
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:

Código Delphi [-]
type
  TPila = array[1..max]of tipoelemento;

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

Código Delphi [-]
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
Código Delphi [-]
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

Cita:

Empezado por BrunoBsso (Mensaje 359540)
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:

Cita:

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

;) ;) ;) ;)
 
Cita:

Empezado por roman (Mensaje 359563)
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
Cita:

Empezado por roman
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.


La franja horaria es GMT +2. Ahora son las 05:28:07.

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