Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-04-2010
xeelons xeelons is offline
Registrado
 
Registrado: jul 2007
Posts: 4
Poder: 0
xeelons Va por buen camino
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
 Pila;
 tope:0..max;
 x:char;
 infija,posfija:string;
 i:integer;

procedure CreaPila(var Pila);
  begin
  tope:=0;
  end;
function PilaVacia(Pila):boolean;
  begin
  PilaVacia:=(tope=0);
  end;
function Pilallena(Pila):boolean;
  begin
  Pilallena:=(tope=max);
  end;
procedure Apilar(Var 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 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(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'osfija[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.

Última edición por xeelons fecha: 06-04-2010 a las 20:16:08.
Responder Con Cita
  #2  
Antiguo 06-04-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 06-04-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por BrunoBsso Ver Mensaje
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
Responder Con Cita
  #4  
Antiguo 06-04-2010
xeelons xeelons is offline
Registrado
 
Registrado: jul 2007
Posts: 4
Poder: 0
xeelons Va por buen camino
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'osfija[i]:=infija[i];
mejor subire el archivo
Responder Con Cita
  #5  
Antiguo 06-04-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ja, ja, ok. Creo que es un filtro del editor. Lo que pasa es que :p se usa para poner la carita 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
Responder Con Cita
  #6  
Antiguo 06-04-2010
xeelons xeelons is offline
Registrado
 
Registrado: jul 2007
Posts: 4
Poder: 0
xeelons Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema al implementar un bbcode en php gulder PHP 0 10-11-2008 14:05:00
Clases - pilas - colas Manshula OOP 6 21-05-2008 20:05:15
Ayudaaa Pilas estaticas alekandro OOP 6 26-04-2006 14:04:11
Pilas 'nuevas' al minuto Investment Noticias 0 30-03-2005 15:24:21


La franja horaria es GMT +2. Ahora son las 05:35:49.


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
Copyright 1996-2007 Club Delphi