Delphi:一个新算法的表达式求值的函数
来源:优易学  2011-9-18 16:03:24   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  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.

上一页  [1] [2] [3] [4] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训