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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 e271828 的 blog

       exit;
     end;
     if  t=1  then  result:=strtofloat(leftstr(s,i-1));
   end;
end;


end;
function rightnum(s:string;i:integer):double  ;
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:=strtofloat(copy(s,i+2,t-i-2));
  exit;
  end;
end
else
begin
   for t:=i+1 to l do
   begin
     if  not is123(s[t])  then
     begin
       result:=strtofloat(copy(s,i+1,t-i-1));
       exit;
     end;
     if  t=l  then  result:=strtofloat(rightstr(s,l-i));
   end;
end;
end;
/////////////////////////////////
function leftsigh(s:string;i:integer):integer  ;
var
t,l:integer;
begin
l:=length(s);
if s[i-1]=')'  then
begin
  for t:=i-1 downto 1 do
  if  s[t]='('  then
  begin
  result:=t;
  exit;
  end;
end
else
begin
   for t:=i-1 downto 1 do
   begin
     if  not is123(s[t])  then
     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+')';

本文关键:一个表达式求值的函数,pascal,lijunyu
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top