主题:菜鸟急救!!!
知雨
[专家分:0] 发布于 2005-01-21 00:27:00
怎么可以用最简单的pascal程序写出四则运算要有优先级的
如100+5-6*5+5/6=
最后保留两个小数位
哪位高手帮帮忙
回复列表 (共3个回复)
沙发
勇敢的Evan [专家分:0] 发布于 2005-01-24 20:44:00
我的是带括号的加、减、乘、除运算;
输入算式,输出结果;
方法是:
1、一般表达式转换成后缀表达式;
2、利用堆栈算出后缀表达式;
program exam;
var a:array[1..50] of integer;
b:array[1..50] of char;
i,j,k:integer;
temp,leng:integer;
s,ss,top:string;
{初始化}
procedure init;
begin
readln(s);
leng:=length(s);
j:=0;k:=0;
end;
{普通表达式转化成后缀表达式}
procedure zhz;
begin
repeat
inc(k);
case s[k] of
'0'..'9':begin
while s[k] in ['0'..'9'] do
begin
ss:=ss+s[k];
inc(k);
end;
dec(k);ss:=ss+'.';
end;
'(':begin
inc(j);
b[j]:=s[k];
end;
')':begin
ss:=ss+b[j];ss:=ss+'.';dec(j);
while b[j]<>'(' do
begin
ss:=ss+b[j];ss:=ss+'.';dec(j);
end;
dec(j);
end;
'+','-':begin
if j<>0 then
begin
top:=b[j];
while top<>'(' do
begin
ss:=ss+b[j];ss:=ss+'.';dec(j);
if j=0 then break
else top:=b[j];
end;
end;
inc(j);b[j]:=s[k];
end;
'*','/':begin
if j<>0 then
begin
top:=b[j];
while (top='*') or (top='/') do
begin
ss:=ss+b[j];ss:=ss+'.';dec(j);
if j=0 then break
else top:=b[j];
end;
end;
inc(j);b[j]:=s[k];
end;
end;
until k=leng;
while j<>0 do
begin
ss:=ss+b[j];ss:=ss+'.';dec(j);
end;
end;
{计算后缀表达式}
procedure shz;
var s1,s2,s3:integer;
begin
i:=0;j:=0;k:=0;
leng:=length(ss);
repeat
inc(i);
case ss[i] of
'0'..'9':begin
j:=0;
repeat
j:=j*10+ord(ss[i])-ord('0');
inc(i);
until ss[i]='.';
inc(k);a[k]:=j;
end;
'*':begin
s2:=a[k];dec(k);
s1:=a[k];dec(k);
s3:=s1*s2;
inc(k);a[k]:=s3;
end;
'/':begin
s2:=a[k];dec(k);
s1:=a[k];dec(k);
s3:=s1 div s2;
inc(k);a[k]:=s3;
end;
'+':begin
s2:=a[k];dec(k);
s1:=a[k];dec(k);
s3:=s1+s2;
inc(k);a[k]:=s3;
end;
'-':begin
s2:=a[k];dec(k);
s1:=a[k];dec(k);
s3:=s1-s2;
inc(k);a[k]:=s3;
end;
end;
until i=leng;
writeln(a[1]);
end;
begin
assign(input,'p109.in');reset(input);
assign(output,'p109.out');rewrite(output);
init;
zhz;
shz;
close(input);close(output);
end.
板凳
迦香 [专家分:30] 发布于 2005-01-30 16:47:00
有没有发现很麻烦啊
3 楼
faintzw [专家分:2660] 发布于 2005-02-03 16:52:00
可以直接建立优先级表用栈算。另外to楼上的,你有什么好办法吗
我来回复