Научная работа

PASCAL:"Вычисление выражений"
Сазонов Д.О.

В клавиатуры вводится математическое выражение (могут содержаться знаки +, -, *, / и скобки).
Вычислить значение выражения:

uses crt;

const dl:set of char=['+','-','*','/','(',')'];
dl2:set of char=['+','-','*','/'];
nm: set of char=['0'..'9','.'];
stack:integer=0;
x_t:string='2.23';

var i,j:integer;
token,st:array[1..100] of string[9]; {это значение складывается как 3+5+1
см.строку 159.
1 - это знак выражения}
s:string;
x,y,r:real;
cur:integer;
res,temp,temp2:string;


procedure push(a:string);
begin
inc(stack);
st[stack]:=a;
end;

function pop:string;
begin
if stack<1 then pop:='' else begin
pop:=st[stack];
dec(stack);
end;
end;

procedure get(temp:string);
var i:integer;
s:string[6];
begin
cur:=1;
i:=1;
while i<length(temp) do
begin
if temp[i]=' ' then begin
inc(i);
continue;
end;
if temp[i] in dl then
while temp[i] in dl do begin token[cur]:=temp[i];inc(cur);inc(i);end;

if temp[i] in nm then begin
s:='';
while (temp[i] in nm) and (i<=length(temp)) do begin s:=s+temp[i];inc(i);end;
token[cur]:=s;
inc(cur);
end;
end;
end;

function prior(a:string):integer;
var i:integer;
begin
case a[1] of
'(':i:=0;
')','+','-':i:=1;
'*','/':i:=2;
else i:=255;
end;
prior:=i;
end;

{НАЧАЛО ПРОГРАММЫ}

begin
clrscr;
readln(s);

{проверка на соответствие}
j:=0;
for i:=1 to length(s) do
begin
if s[i]=')' then dec(j);
if s[i]='(' then inc(j);
if j<0 then begin
writeln('Ошибка в выражении');
halt(1);
end;
end;
if j>0 then begin
writeln('Ошибка в выражении');
halt(1);
end;
{Заменяю переменную x}
if pos('x',s)<>0 then
begin
j:=pos('x',s);
delete(s,j,1);
insert(x_t,s,j);
end;

get(s);
res:='';

for i:=1 to cur do
begin
if token[i][1] in nm then res:=res+token[i]+' ';
if token[i][1]='(' then push(token[i]);
if token[i][1]=')' then begin
repeat
temp:=pop;
if (temp='') or (temp='(') then break;
res:=res+temp+' ';
until false;
end;
if token[i][1] in dl2 then begin
repeat
temp:=pop;
if (temp='') or (prior(token[i][1])>prior(temp)) then begin inc(stack); break;end;
res:=res+temp+' ';
until false;
push(token[i][1]);
end;
end;

temp:='';
repeat
temp:=pop;


if (temp='') then break;
res:=res+temp;
until false;

res:=res+' ';

stack:=1;

fillchar(token,sizeof(token),0);
get(res);

for i:=1 to cur do begin
if token[i][1] in nm then push(token[i]);
if token[i][1] in dl2 then
begin
temp:=pop;
temp2:=pop;
val(temp,y,j);
val(temp2,x,j);
case token[i][1] of
'+':x:=x+y;
'-':x:=x-y;
'*':x:=x*y;
'/':x:=x/y;
end;
str(x:5:3,temp);
push(temp);
end;
end;

writeln('Результат выражения:',s,'=',pop);

readln;
end.