完美的表達式求值程序源代碼
本表達式求值程序支持加減乘除、乘方開方、括號嵌套,精確度約為十幾位小數,並支持小數和多位數錄入計算。支持最長 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 釋出。