完美的表达式求值程序源代码

本表达式求值程序支持加减乘除、乘方开方、括号嵌套,精确度约为十几位小数,并支持小数和多位数录入计算。支持最长 4GB 的表达式。

//By Ceeji 
//Date: 2009-4-16 
//Type: Stack 
//State: Accepted 
//For LL 
//简要说明:支持加减乘除、乘方开方、括号嵌套,精确度约为十几位小数,并支持小数和多位数录入计算。支持最长 4GB 的表达式。 
//版权所有,保留所有权利。使用时必须保留注释。 
Program biaodashi; 
Const p='+-*/^()#'; 
      c:array[1..8,1..8]of integer= 
          {+  -  *  /  ^  (  )  #} 
 {+}     ((1, 1, 0, 0, 0, 0, 1, 1), 
 {-}      (1, 1, 0, 0, 0, 0, 1, 1), 
 {*}      (1, 1, 1, 1, 0, 0, 1, 1), 
 {/}      (1, 1, 1, 1, 0, 0, 1, 1), 
 {^}      (1, 1, 1, 1, 1, 0, 1, 1), 
 {(}      (0, 0, 0, 0, 0, 0, 2, 1), 
 {)}      (3, 3, 3, 3, 3, 3, 3, 3), 
 {#}      (0, 0, 0, 0, 0, 0, 0, 2) 
          ); 
Var i,j,k:longint; 
    a,jg:extended; 
    s:ansistring; 
 
//计算两个数加减乘除或乘方,支持小数指数。 
Function jisuan(shu1,shu2:extended; k:longint):extended; 
Var jg:extended; 
begin 
    case k of 
    1: jg:=shu1+shu2; 
    2: jg:=shu1-shu2; 
    3: jg:=shu1*shu2; 
    4: jg:=shu1/shu2; 
    5: jg:=exp(shu2*ln(shu1)); 
    end; 
    jisuan:=jg; 
end; 
//把带有空格的表达式转换为标准表达式以便进行计算。本程序为辅助子程序。 
Function guifan(st:ansistring):ansistring; 
var sn,ste:ansistring; 
    i,j,max:integer; 
begin 
   i:=0; 
   sn:=st; 
   max:=length(st); 
   while i='0')and(s[i]<='9')))or(s[i]='.') do 
        begin 
            b:=true; 
            if (s[i]<>'.')and(bb=false) then 
            begin 
               val(s[i],x); 
               shu[ls+1]:=10*shu[ls+1]+x; 
               i:=i+1; 
               continue; 
            end; 
            if s[i]='.' then begin bb:=true; i:=i+1; t:=i-1; continue; end; 
            if bb=true then 
            begin 
               val(s[i],x); 
               shu[ls+1]:=shu[ls+1]+ x*1/exp((i-t)*ln(10)); 
               i:=i+1; 
               continue; 
            end; 
        end; 
        if b=true then begin ls:=ls+1; i:=i-1; continue; end; 
        k:=pos(s[i],p); 
        if (k=0)or(k>8) then begin writeln('error'); exit; end; 
        inc(lf); 
        fu[lf]:=k; 
        while (lf>1)and(c[fu[lf-1],fu[lf]]<>0)do begin 
           if c[fu[lf-1],fu[lf]]=2 then 
           begin 
              dec(lf,2); 
              continue; 
           end; 
           shu[ls-1]:=jisuan(shu[ls-1],shu[ls],fu[lf-1]); 
           dec(ls); 
           dec(lf); 
           fu[lf]:=fu[lf+1]; 
        end; 
    end; 
    until i>=len; 
    jisuanbiaodashi:=shu[1]; 
end; 
 
begin 
   readln(s); 
   jg:=jisuanbiaodashi(guifan(s)); 
   writeln(jg:0:3); //保留三位小数。可以修改这个数值以便获得更高的精度。 
   readln; 
end.{main} 

本文版权遵循 CC BY-NC-SA 4.0发布,转载需附带本文链接。

当前页阅读量为: