+1-2+3计算出表达式的值
在Edit1.text的字符串值中有以三种情况:
(1) +1-2+3
(2) -1-2+3
(3) 1-2+3
要求计算出表达式的值,看有没有好的算法,我给100分。
问题点数:100、回复次数:10Top
1 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2005-01-19 17:54:58 得分 0
去我的Blog看
http://blog.csdn.net/ly_liuyang
http://lysoft.7u7.netTop
2 楼zzbomb(麽麽茶)回复于 2005-01-19 17:56:44 得分 0
case LeftStr(S, 1) of
Top
3 楼kiboisme(蓝色光芒)(www.1284.net/)(软件开发机器人for delphi)回复于 2005-01-19 17:58:23 得分 0
用LY的方法不错。
也可以
'Select '+Edit1.text + ' as AValue';
AduQuery.Open;
........
:)))))Top
4 楼pilicat(Delphi迷)回复于 2005-01-19 18:00:55 得分 20
使用TScriptControl控件吧,这是一个ActiveX近件,需要你自己安装。
它在ActiveX对象列表中叫Microsoft Script Control
安装后,在窗体上放一个控件,然后,像这样写代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
//初始化引擎语言为Javascript
ScriptControl1.Language:='Javascript';
//计算表达式的值,其中,Edit1中有表达式
//该控件还可以实现更复杂的计算,试试吧!
ShowMessage(ScriptControl1.Eval(Edit1.Text));
end;
大量电脑书籍下载:
http://www.netyi.net/in.asp?id=ForMoreU
Top
5 楼meiqingsong(阿飛)回复于 2005-01-19 18:58:03 得分 30
1.ScriptControl
uses
ComObj
.....
function Eval(expStr: string): string;
var
js: OleVariant;
begin
js := CreateOleObject('ScriptControl');
js.Language := 'JavaScript';
Result := js.Eval(expStr);
js := Unassigned;
end;
Eval('((123+112)*12+21*(4562-60))*3/7 + 50')=41776.5714285714
2. 用数据库, select
3.
uses
Math,Sysutils;
procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);
function Calc(mText: string): string;
implementation
procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);
var
L, R: Integer;
I: Integer;
B: Boolean;
begin
nLStr := '';
nCStr := '';
nRStr := '';
B := True;
L := 0;
R := 0;
for I := 1 to Length(mText) do
if B then begin
if mText[I] = '(' then
Inc(L)
else if mText[I] = ')' then
Inc(R);
if L = 0 then
nLStr := nLStr + mText[I]
else if L > R then
nCStr := nCStr + mText[I]
else B := False;
end else nRStr := nRStr + mText[I];
Delete(nCStr, 1, 1);
end; { Bracket }
function Calc(mText: string): string;
var
vText: string;
function fCalc(mText: string): string;
var
vLStr, vCStr, vRStr: string;
I, J, K, L: Integer;
begin
L := Length(mText);
if Pos('(', mText) > 0 then begin
Bracket(mText, vLStr, vCStr, vRStr);
Result := Calc(vLStr + fCalc(vCStr) + vRStr);
end else if (Pos('+', mText) > 0) or (Pos('-', mText) > 0) then begin
I := Pos('+', mText);
J := Pos('-', mText);
if I = 0 then I := L;
if J = 0 then J := L;
K := Min(I, J);
vLStr := Copy(mText, 1, Pred(K));
vRStr := Copy(mText, Succ(K), L);
if vLStr = '' then vLStr := '0';
if vRStr = '' then vRStr := '0';
if I = K then
Result := FloatToStr(StrToFloat(fCalc(vLStr)) + StrToFloat(fCalc(vRStr)))
else Result := FloatToStr(StrToFloat(fCalc(vLStr)) - StrToFloat(fCalc(vRStr)))
end else if (Pos('*', mText) > 0) or (Pos('/', mText) > 0) then begin
I := Pos('*', mText);
J := Pos('/', mText);
if I = 0 then I := L;
if J = 0 then J := L;
K := Min(I, J);
vLStr := Copy(mText, 1, Pred(K));
vRStr := Copy(mText, Succ(K), L);
if vLStr = '' then vLStr := '0';
if vRStr = '' then vRStr := '0';
if I = K then
Result := FloatToStr(StrToFloat(fCalc(vLStr)) * StrToFloat(fCalc(vRStr)))
else Result := FloatToStr(StrToFloat(fCalc(vLStr)) / StrToFloat(fCalc(vRStr)))
end else if Pos('_', mText) = 1 then
Result := FloatToStr(-StrToFloat(fCalc(Copy(mText, 2, L))))
else Result := FloatToStr(StrToFloat(mText));
end;
var
I, L: Integer;
begin
vText := '';
L := Length(mText);
for I := 1 to L do
if (mText[I] = '-') and (I < L) and (not (mText[Succ(I)] in ['+', '-', '(', ')'])) then
if (I = 1) or ((I > 1) and (mText[Pred(I)] in ['*', '/'])) then
vText := vText + '_'
else if (I > 1) and (mText[Pred(I)] in ['+', '-']) then
vText := vText + '+_'
else vText := vText + mText[I]
else vText := vText + mText[I];
Result := fCalc(vText);
end; { Calc }
end.Top
6 楼wozhuchuanwei(一个组件编写者,就一定是一个更优秀的Delphi开发者)回复于 2005-01-19 20:15:50 得分 0
对头
都说了哈
Top
7 楼Jute(东方明珠)回复于 2005-01-20 10:49:54 得分 0
有哪位再给我算法的Top
8 楼songyanbin(孤叶)回复于 2005-01-20 11:10:30 得分 50
uses ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
vScriptControl: OleVariant;
begin
vScriptControl := CreateOleObject('MSScriptControl.ScriptControl');
vScriptControl.Language := 'VBScript';
Caption := vScriptControl.Eval('1-2+3');
end;
Top
9 楼songyanbin(孤叶)回复于 2005-01-20 11:14:02 得分 0
为了 meiqingsong(阿飛) 的第3个算法 此贴 收藏Top
10 楼xmchw(xmchw)回复于 2005-01-20 11:32:31 得分 0
upTop




