完美的表达式求值程序源代码
本表达式求值程序支持加减乘除、乘方开方、括号嵌套,精确度约为十几位小数,并支持小数和多位数录入计算。支持最长 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}
题外话:我帮你整理了包括 AI 写作、绘画、视频(自媒体制作)零门槛 AI 课程 + 国内可直接顺畅使用的软件。想让自己快速用上 AI 工具来降本增效,辅助工作和生活?限时报名。
© 转载需附带本文链接,依据 CC BY-NC-SA 4.0 发布。