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

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

本文简介:选择自 e271828 的 blog

我经过思考,自已做了一个表达式求值的函数,与标准算法不同,这是我闭门造车而成的,目的在于求简单。我这个函数有两个bug,我目前已懒得改,当然是可以改的,一个是小数点0.999999999。。。。。未自动消除为1,二是本来乘法与除法是同级的,我这是成了乘法高级过除法。时间匆忙,来不及多说,让读者看了再说吧。另辟溪径也许有利于开拓新思路吧。我的邮箱是myvbvc@tom.com

interface

uses
  windows, messages, sysutils, variants, classes, graphics, controls, forms,
  dialogs, stdctrls,strutils, spin;

type
  tform1 = class(tform)
    edit1: tedit;
    edit2: tedit;
    button1: tbutton;
    button2: tbutton;
    spinedit1: tspinedit;
    procedure button1click(sender: tobject);
    procedure button2click(sender: tobject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  form1: tform1;

implementation

{$r *.dfm}
function   nospace(s:string):string;
begin
result:= stringreplace(s,' ','',[rfreplaceall]);
end;
function   is123(c:char):boolean;
begin
if  c  in ['0'..'9','.']
then  result:=true
else   result:=false;

end;
function isminus(s:string;i:integer):boolean ;
var
t:integer;
begin

 for t:=i-1 downto 1  do
 begin
   if s[t]=')'  then
   begin
   result:=false;
   break;
   end;
   if (s[t]='(') and (s[t+1]='-') then
   begin
    result:=true;
    break;
   end;
   if (not is123(s[t])) and ( not ((s[t]='-') and(s[t-1]='(')))  then
   begin
   result:=false;
   break;
   end;
 end;
end;

function firstj(s:string):integer ;
var
i,l:integer;
begin
result:=0;
 l:=length(s);
 for i:=1  to l  do
 begin
   if (s[i]=')')  and (not isminus(s,i))  then
   begin
   result:=i;
   break;
   end;

 end;
end;
function firstc(s:string;firstj:integer):integer ;
var
t:integer;
begin
 for t:=firstj downto 1  do
 begin
   if (s[t]='(') and (s[t+1]<>'-') then
   begin
    result:=t;
    break;
   end;

 end;
end;
function firstsign(s:string):integer ;
var
i:integer;
begin
result:=0;
  for  i:=1  to length(s) do
    if  s[i]  in ['+','-','*','/']  then
    begin
    result:=i;
    exit;
    end;
end;
function firstsignex(s:string;sigh:char):integer ;
var
i:integer;
begin
result:=0;
  for  i:=1  to length(s) do
    if  s[i]=sigh  then
    begin
    result:=i;
    exit;
    end;
end;
function firstminussignex(s:string):integer ;
var
i:integer;
begin
result:=0;
  for  i:=1  to length(s) do
    if  (s[i]='-') and (s[i-1]<>'(')  then
    begin
    result:=i;
    exit;
    end;
end;
function secondsign(s:string):integer ;
var
i,j:integer;
begin
  j:=firstsign(s);

  for i:=j+1  to length(s) do
    if  s[i]  in ['+','-','*','/']  then
    begin
    result:=i;
    exit;
    end;
  result:=length(s);
end;
function secondsignex(s:string;sigh:char):integer ;
var
i,j:integer;
begin
  j:=firstsignex(s,sigh);

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

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

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

go top