回 帖 发 新 帖 刷新版面

主题:关于优先级的算法!

我要编个计算器的程序,可是对于判断+、-、*、/、(、)的优先级的算法不知道怎么写,还请各位高手指点一下,谢谢了!

回复列表 (共3个回复)

沙发

()最大,x/其次,+ -最小

板凳

计算器有两种,生活中普通用的计算器是没有优先级的,但科学型计算器就分优先级,还能计算函数。

这是“表达式求值”问题。很久以前我在一本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 楼

我那本书是先用栈把它转换成逆波兰式,然后求值

我来回复

您尚未登录,请登录后再回复。点此登录或注册