pascal 读入一个字符串 是一个算式 然后计算 得出值

2024-12-28 12:03:01
推荐回答(3个)
回答1:

来原题。啊

编程思路: 回朔法
若读入的是数据暂存于变量T中,若读入的是运算符(不包括"()"号),则将T中
存的数据字符窜转化为实数,并与上一次读入的运算符比较; 若当前运算符的权大于
上一次运算符的权,则此次读入的运算符及上次读入的数据均进栈; 反之将上次读入
的数据及栈顶数据对运算符进行计算,计算后栈指针减一..

program p66_2;
type
str10=string[10];
ptr=^node;
node=record
info:str10;
l,r:ptr;
end;
var
s:string;
root:ptr;
number:real;

function jian(s:string):integer;{寻找字符串S中运算级别最低的运算符}
var { 在串中的位置}
l:integer;
m,z,min:integer;
i:byte;
begin
l:=0;m:=0;min:=100;
for i:=1 to length(s) do
begin
z:=0;
case s[i] of
'(' :inc(m);
')' :dec(m);
'+' :z:=6*m+1;
'-' :z:=6*m+1;
'*' :z:=6*m+3;
'/' :z:=6*m+4;
end;
if (z<>0) and (z<=min) then
begin
min:=z;
l:=i;
end;
end;
jian:=l; {确定串中运算级别最低的运算符的位置}
end;

procedure make(s:string;var p:ptr); {建二叉树过程 }
var
l:integer;
t:str10;
i:byte;
begin
l:=jian(s); new(p);
if l=0 then {L=0是递归出口,表示当前S中已无运算符,只剩下数字 }
begin
t:='';
for i:=1 to length(s) do {将S中仅剩下的纯数字赋给变量t }
if not(s[i] in ['(',')']) then t:=t+s[i];
p^.info:=t; p^.l:=nil; p^.r:=nil; {建立一个叶节点 }
exit;
end;
p^.info:=s[l]; {建"根"节点 }
make(copy(s,1,l-1),p^.l); {递归建左子树 }
make(copy(s,l+1,length(s)),p^.r); {递归建右子树}
end;

function com(c1:real;ch:str10;c2:real):real;{计算C1与C2进行+,-,*,/ 后的值}
var
h:real;
begin
h:=0;
case ch[1] of
'+' :h:=c1+c2;
'-' :h:=c1-c2;
'*' :h:=c1*c2;
'/' :h:=c1/c2;
end;
com:=h;
end;

function compute(p:ptr):real; {计算过程(递归调用)}
var
buf:real;
c1,c2:real;
code1,code2:integer;
begin
buf:=0;
val(p^.l^.info,c1,code1);val(p^.r^.info,c2,code2);
{code1=0表示左子树是叶节点(数字),code2=0表示右子树是叶节点(数字 }
if (code1=0) or (code2=0) then {左右子树均是叶节点,则进行计算 }
begin
if (code1=0) and (code2=0) then
begin
buf:=com(c1,p^.info,c2);
end
else
if (code1=0) then {仅左子树是叶节点,则递归调用进行计算 }
begin
buf:=com(c1,p^.info,compute(p^.r));
end
else {仅右子树是叶节点,也则递归调用进行计算}
begin
buf:=com(compute(p^.l),p^.info,c2);
end;
end
else {左,右子树均不是叶节点,仍递归调用进行计算}
buf:=com(compute(p^.l),p^.info,compute(p^.r));
compute:=buf; {返回函数值,即计算结果 }
end;

begin
write('input string=');readln(s);
make(s,root);
number:=compute(root);
writeln(number);
end.