手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

一个新算法的表达式求值的函数

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

begin
result:=t 1;
exit;
end;
if t=1 then result:=1;
end;
end;


end;
function rightsigh(s:string;i:integer):integer ;
var
t,L:integer;
begin
L:=length(s);
if s[i 1]=''''('''' then
begin
for t:=i 2 to L do
if s[t]='''')'''' then
begin
result:=t;
exit;
end;
end
else
begin
for t:=i 1 to L do
begin
if not is123(s[t]) then
begin
result:=t-1;
exit;
end;
if t=L then result:=L;
end;
end;
end;
////////////////////////////////////

function nomulti(s:string):string ;
var
i,L,le,ri:integer;
j,k:double ;
begin
s:=nospace(s);
result:=s;
L:=length(s);
i:=firstsignex(s,''''*'''');
if (i=0) or (s[i]<>''''*'''') then exit;
le:=leftsigh(s,i);
j:=leftnum(s,i);
k:=rightnum(s,i);
ri:=rightsigh(s,i);
file://if ii<L then
if j*k>=0 then
result:=nomulti(leftstr(s,le-1) floattostr(j*k) rightstr(s,L-ri))
else
result:=nomulti(leftstr(s,le-1) ''''('''' floattostr(j*k) '''')'''' rightstr(s,L-ri))

end;
function nodiv(s:string):string ;
var
i,L,le,ri:integer;
j,k:double ;
begin
s:=nospace(s);
result:=s;
L:=length(s);
i:=firstsignex(s,''''/'''');
if (i=0) or (s[i]<>''''/'''') then exit;
le:=leftsigh(s,i);
j:=leftnum(s,i);
k:=rightnum(s,i);
ri:=rightsigh(s,i);
if j/k>=0 then
result:=nodiv(leftstr(s,le-1) floattostr(j/k) rightstr(s,L-ri))
else
result:=nodiv(leftstr(s,le-1) ''''('''' floattostr(j/k) '''')'''' rightstr(s,L-ri))

end;
function noadd(s:string):string ;
var
i,L,le,ri:integer;
j,k:double ;
begin
s:=nospace(s);
result:=s;
L:=length(s);
i:=firstsignex(s,'''' '''');
if (i=0) or (s[i]<>'''' '''') then exit;
le:=leftsigh(s,i);
j:=leftnum(s,i);
k:=rightnum(s,i);
ri:=rightsigh(s,i);
if j k>=0 then
result:=noadd(leftstr(s,le-1) floattostr(j k) rightstr(s,L-ri))
else
result:=noadd(leftstr(s,le-1) ''''('''' floattostr(j k) '''')'''' rightstr(s,L-ri))

end;
function nosub(s:string):string ;
var
i,L,le,ri:integer;
j,k:double ;
begin
s:=nospace(s);
result:=s;
L:=length(s);
i:=firstMinussignEX(s);
if (i=0) or (s[i]<>''''-'''') then exit;
le:=leftsigh(s,i);
j:=leftnum(s,i);
k:=rightnum(s,i);
ri:=rightsigh(s,i);
if j-k>=0 then
result:=nosub(leftstr(s,le-1) floattostr(j-k) rightstr(s,L-ri))
else
result:=nosub(leftstr(s,le-1) ''''('''' floattostr(j-k) '''')'''' rightstr(s,L-ri))

end;
function alltoone(s:string):string ;
begin
s:=nomulti(s);
s:=nodiv(s);
s:=noadd(s);
s:=nosub(s);
result:=s;
end;


function myexpress(s:string):string;
var
c,j,L:integer;
le,ri,al,substr,s0:string;
tryit:double;
begin
s:=nospace(s);
s0:=s;
L:=length(s);
if (s[1]<>''''('''') or (s[L]<>'''')'''') then
s:=''''('''' s '''')'''';
if (s[1]=''''('''') and (s[L]='''')'''') and((s[2]=''''-'''') or (isminus(s,L))) then
s:=''''('''' s '''')'''';
L:=length(s);
j:=firstJ(s);
c:=firstc(s,j);
if (j<L) and (c>1) and (j>c) then
begin
substr:=copy(s,c 1,j-c-1);
file://le:=leftstr(s,c-1);
file://ri:= rightstr(s,L-j);
le:=leftstr(s,c-1);
le:=rightstr(le,length(le)-1);
ri:= rightstr(s,L-j);
ri:=leftstr(ri,length(ri)-1);
file://showmessage(substr);
al:=alltoone(substr);
file://showmessage(le al ri);
result:=myexpress(le al ri);
end
else
result:=alltoone(s0);

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=myexpress(edit1.text);
end;

end.

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!