完美的表達式求值程序源代碼

本表達式求值程序支持加減乘除、乘方開方、括號嵌套,精確度約為十幾位小數,並支持小數和多位數錄入計算。支持最長 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} 
当前页阅读量为: