[Back to MATH SWAG index] [Back to Main SWAG index] [Original]
{ Author: Gavin Peters. }
Program PostFixConvert;
(*
* This Program will convert a user entered expression to postfix, and
* evaluate it simultaniously. Written by Gavin Peters, based slightly
* on a stack example given in Algorithms (Pascal edition), pg
*
*)
Var
Stack : Array[1 .. 3] of Array[0 .. 500] of LongInt;
Procedure Push(which : Integer; p : LongInt);
begin
Stack[which,0] := Stack[which,0]+1;
Stack[which,Stack[which,0]] := p
end;
Function Pop(which : Integer) : LongInt;
begin
Pop := Stack[which,Stack[which,0]];
Stack[which,0] := Stack[which,0]-1
end;
Var
c : Char;
x,t,
bedmas : LongInt;
numbers : Boolean;
Procedure Evaluate( ch : Char );
Function Power( exponent, base : LongInt ) : LongInt;
begin
if Exponent > 0 then
Power := Base*Power(exponent-1, base)
ELSE
Power := 1
end;
begin
Write(ch);
if Numbers and not (ch = ' ') then
x := x * 10 + (Ord(c) - Ord('0'))
ELSE
begin
Case ch OF
'*' : x := pop(2)*pop(2);
'+' : x := pop(2)+pop(2);
'-' : x := pop(2)-pop(2);
'/' : x := pop(2) div pop(2);
'%' : x := pop(2) MOD pop(2);
'^' : x := Power(pop(2),pop(2));
'L' : x := pop(2) SHL pop(2);
'R' : x := pop(2) SHR pop(2);
'|' : x := pop(2) or pop(2);
'&' : x := pop(2) and pop(2);
'$' : x := pop(2) xor pop(2);
'=' : if pop(2) = pop(2) then
x := 1
else
x := 0;
'>' : if pop(2) > pop(2) then
x := 1
else
x := 0;
'<' : if pop(2) < pop(2) then
x := 1
else
x := 0;
'0','1'..'9' :
begin
Numbers := True;
x := Ord(c) - Ord('0');
Exit
end;
' ' : if not Numbers then
Exit;
end;
Numbers := False;
Push(2,x);
end;
end;
begin
Writeln('Gavin''s calculator, version 1.00');
Writeln;
For x := 1 to 3 DO
Stack[x, 0] := 0;
x := 0;
numbers := False;
Bedmas := 50;
Writeln('Enter an expression in infix:');
Repeat
Read(c);
Case c OF
')' :
begin
Bedmas := Pop(3);
Evaluate(' ');
Evaluate(Chr(pop(1)));
end;
'^','%','+','-','*','/','L','R','|','&','$','=','<','>' :
begin
t := bedmas;
Case c Of
'>','<' : bedmas := 3;
'|','$',
'+','-' : bedmas := 2;
'%','L','R','&',
'*','/' : bedmas := 1;
'^' : bedmas := 0;
end;
if t <= bedmas then
begin
Evaluate(' ');
Evaluate(Chr(pop(1)));
end;
Push(1,ord(c));
Evaluate(' ');
end;
'(' :
begin
Push(3,bedmas);
bedmas := 50;
end;
'0','1'..'9' : Evaluate(c);
end;
Until Eoln;
While Stack[1,0] <> 0 DO
begin
Evaluate(' ');
Evaluate(Chr(pop(1)));
end;
Evaluate(' ');
Writeln;
Writeln;
Writeln('The result is ',Pop(2));
end.
{
That's it, all. This is an evaluator, like Reuben's, With a few
more features, and it's shorter.
Okay, there it is (the above comment was in the original post). I've
never tried it, but it looks good. :-) BTW, if it does work you might
want to thank Gavin Peters... after all, he wrote it. I was just
interested when I saw it, and stored it along With a bunch of other
source-code tidbits I've git here...
}
[Back to MATH SWAG index] [Back to Main SWAG index] [Original]