网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.2个不错的通配符比较函数.
.设计模式、用Delphi描述-->Visit.
.Delphi字符串函数大全.
.Delphi数据库编程教程(二).
.防止全局hook入侵Delphi版,2000.
.lua头文件翻译之lauxlib.
.DELPHI中OPENGL程序设计.
.如何从MySQL数据库表中检索数据.
.Delphi中用ICMP探测远程主机是否.
.温和的关闭连接.
.古都Delphi.
.防止全局hook入侵Delphi版,2000.
.如何将几个DBGRID里的内容导入同.
.DLL文件在Delphi的创建及调用.
.让ReportBuilder彻底支持Oracle.
.如何在托盘图标实现漂亮的菜单.
.用delphi制作抖动窗体.
.Delphi中实现界面与业务逻辑的分.
.隐藏我的电脑中驱动器.
.netmessagebuffersend示例.

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

发表日期:2006-2-4


 

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

上一篇:制作QQ消息炸弹 人气:5498
下一篇:C++Builder/Delphi中透明Panel及透明窗口的实现方法 人气:4655
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐