主题:关于优先级的算法!
lvzhu18
[专家分:90] 发布于 2006-01-04 16:59:00
我要编个计算器的程序,可是对于判断+、-、*、/、(、)的优先级的算法不知道怎么写,还请各位高手指点一下,谢谢了!
回复列表 (共3个回复)
沙发
wanggcc [专家分:1450] 发布于 2006-01-04 17:14:00
()最大,x/其次,+ -最小
板凳
jtchang [专家分:5370] 发布于 2006-01-05 15:12:00
计算器有两种,生活中普通用的计算器是没有优先级的,但科学型计算器就分优先级,还能计算函数。
这是“表达式求值”问题。很久以前我在一本Turbo Pascal编程技巧的书里看到,并把它改编了一下。主要设计出一个函数:
function Compute(s:string; var error:boolean):real;
s :表达式字符串,比如 '(2-1)*(3+4)'。只算加减乘除,因为编函数的话程序真的有够长的。
error:表达式是否除零
返回值:表达式的值
这个程序和《数据结构》里的表达式求值算法,虽然道理一样,但写法采用了递归和嵌套。
program calc;
var
s:string;
_result:real;
error:boolean;
function Compute(s:string; var error:boolean):real;
var
r:real;
procedure eval(var s:string; var r:real);
const
Number:set of char=['0'..'9','.'];
var
p,i:integer;
ch:char;
procedure nextp;
begin
repeat
p:=p+1;
if p<=length(s) then ch:=s[p]
else ch:=#13;
until ch<>'';
end;
function expr:real;
var
E:real;
oprt:char;
function smplexpr:real;
var
rs:real;
oprt:char;
temp:real;
function s_fact: real;
function fct: real;
var
L,start:integer;
f:real;
procedure proces_number;
var
code :integer;
begin
begin
start:=p;
repeat
nextp
until not (ch in number);
if ch='.' then
repeat
nextp;
until not ( ch in number);
val(copy(s,start,p-start),f,code);
if code<>0 then
begin
error:=true;
f:=0;
end;
end;
end;
procedure proces_expr;
begin
nextp;
f:=expr;
if ch=')' then nextp
end;
begin
if ch in number then proces_number
else if ch='(' then proces_expr;
fct:=f;
end;
begin
if ch='-' then
begin
nextp;
s_fact:=-fct;
end
else s_fact:=fct;
end;
begin
rs:=s_fact;
while ch in ['*','/'] do
begin
oprt:=ch;
nextp;
case oprt of
'*': rs:=rs*s_fact;
'/': begin
temp:=s_fact;
if temp=0 then
begin
error:=true;
rs:=0;
end
else rs:=rs/temp;
end;
end;
end;
smplexpr:=rs;
end;
begin
E:=smplexpr;
while ch in ['+','-'] do
begin
oprt:=ch;
nextp;
case oprt of
'+': E:=E+smplexpr;
'-': E:=E-smplexpr;
end;
end;
expr:=E;
end;
begin
if s[1]='.' then s:='0'+s;
if s[1]='+' then delete(s,1,1);
p:=0;
nextp;
r:=expr;
if ch<>#13 then error:=true;
end;
begin
eval(s,r);
Compute:=r;
end;
begin
repeat
writeln('Enter Formula , Press Enter to stop : ');
readln(s);
if s='' then exit;
write(s,' = ');
error:=false;
_result:=Compute(s,error);
if error then writeln('Error!')
else writeln(_result:0:6);
until false;
end.
3 楼
游侠UFO [专家分:1200] 发布于 2006-01-15 10:43:00
我那本书是先用栈把它转换成逆波兰式,然后求值
我来回复