两个表 1。基本参数表 2。表达式表
表结构如下:
1.基本参数表:base
baseid string 基本参数编码
basename string 基本参数名称
basevalue double 基本参数数值
2.表达式表:exprisstion
expid string 表达式编码
expname string 表达式名称
表中数据如下
base表
baseid basename basevalue
a 长 2
b 宽 12
c ds 43
exprisstion 表
expid expname
fx a*b+2
wx fx*2+a+c*b
tx wx+fx+(c*a)*2我的问题是 如果我输入tx则样得到这样的值
((a*b+2)*2+a+c*b)+(a*b+2)+(c*a)*2
就是最后表达式全部要化成基本参数编码。分不够还可以加,这一提问我发两帖。解决我给200分。
表结构如下:
1.基本参数表:base
baseid string 基本参数编码
basename string 基本参数名称
basevalue double 基本参数数值
2.表达式表:exprisstion
expid string 表达式编码
expname string 表达式名称
表中数据如下
base表
baseid basename basevalue
a 长 2
b 宽 12
c ds 43
exprisstion 表
expid expname
fx a*b+2
wx fx*2+a+c*b
tx wx+fx+(c*a)*2我的问题是 如果我输入tx则样得到这样的值
((a*b+2)*2+a+c*b)+(a*b+2)+(c*a)*2
就是最后表达式全部要化成基本参数编码。分不够还可以加,这一提问我发两帖。解决我给200分。
解决方案 »
- TTreeView节点拖动的问题.
- delphi,如何捕获窗体所有控件发生的事件?
- 用clientdataset控件存数据,出现未missing data provideror data packet是怎麽回事?
- 怎么样才能取消上网自动填入密码
- 为什么老是没人回答我的问题:我有张工资表GZB想将其转换成Excel文件,望高手能够指点指点。(只有最后20分了有分一定补上!)
- 急救!!!
- delphi菜鸟?请教一个dbgrid的小功能????????
- delphi以管理员权限运行的主题问题
- Delphi7 如何给Arcgis下的TMapControl中的图层增加一个点信息
- 大虾们,这到底是什么原因?急!!!!!
- 关于FTP服务器某目录下的文件的显示问题
- 咳,闲着没事,开发个操作系统玩玩!
扫描一边即可。
再将表达式转换为操作符后置,这样就可以去掉括号,有专门的操作符后置算法,记得以前版的程序员高级程序员资料里提到算法,网上可以下载到。
余下的运用查数据表即可。
然后再把fx变成(fx),再查表把fx的值replace进去,不就行了?
可以写一个存储过程来做,比较快
尝试了一下,应该可以function uncode(s:string):string;
begin
将表达式s分割为各个操作数(比如fx,a,b)的列表和操作符(+ -等);
if s能够分为几个操作数
begin
//将操作数字符串依次调用uncode;
返回results:= uncode(操作数1) + 操作符1 + uncode(操作数2) + 操作符2 + ...;
end
else //s 为单操作数比如fx, a..
begin
if 操作数字符串s在baseid中,返回results:= s;
else 在 exprisstion表中查找expid = s 的记录,返回results:= uncode(expname);
endreturn
如果用简单的递归,其实是一个深度优先的递归算法
你也可以将其定义为广义表....
其实这些已经有比较标准的算法,很多数据结构书里都有
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
public
function re(var AStr: String): boolean;
function trans(var AStr: String): boolean;
end;var
Form1: TForm1;implementation{$R *.dfm}function TForm1.re(var AStr: String): boolean;
var
i: Integer;
Str: String;
Exp: String;
begin
Exp := '';
Str := '(' + AStr +')';
AStr := '';
result := false;
for i := 1 to Length(Str) do
begin
if (Str[i] in ['+','-','*','/','(',')']) then
begin
if Exp <> '' then
begin
if trans(Exp) then result := true;
AStr := AStr + Exp;
Exp := '';
end;
AStr := AStr + Str[i];
end
else
Exp := Exp + Str[i];
end;
Delete(AStr,1,1);
Delete(AStr,Length(AStr),1);
end;function TForm1.trans(var AStr: String): boolean;
begin
//请加以修改,Astr 在exprisstion表中出现就替换AStr,不出现返回false;
//为保险起见可以先在exprisstion中查找,找不到就到base表中查找,再找不到就报错
result := true;
if Astr = 'fx' then
AStr := '(a*b+2)'
else
if AStr = 'wx' then
AStr := '(fx*2+a+c*b)'
else
if Astr = 'tx' then
AStr := '(wx+fx+(c*a)*2)'
else
result := false;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
a: String;
begin
a := 'wx';
repeat
until not re(A);
ShowMessage(a);
end;end.