转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
一个新算法的表达式求值的函数         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1686 更新时间:2009/4/23 18:35:48

我经过思考,自已做了一个表达式求值的函数,与标准算法不同,这是我闭门造车而成的,目的在于求简单。我这个函数有两个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));
       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:

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台