(A+B+C)/3, 实现上述表达式, 优先顺序为(),/,+。
解决方案 »
- 问一个FastReport很简单的问题
- 用汉字做字符串数组的下标
- 请大家帮我女儿起个名字,参与有分,被使用后,分最多,谢谢各位!
- 有关toolbar的问题?
- ******哪里有《Delphi 串口通信编程》PDF格式的下载?******
- 请大虾看看这个程序段:我想要删除一个键值,可是却删不了,请大家看看,哪里不对?
- 怎么样解决控件重画时的闪烁问题
- advstringgrid 怎么合并单元格以后,再点击合并后的单元格
- 如何实现类似TADOTable中Connection中的效果?
- 在TreeView中,如何屏蔽双击打开树枝。收到就给分,时时关注。
- 做电子宠物的问题
- 用ShellExecute打开文件后,如何再将打开的文件关闭?
begin
Sql.Clear;
Sql.Add(format('(%d + %d + %d)/3',[a,b,c]));
Open;
end;
Sun := Query1.Fields[0].Asinteger;
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, ADODB;type
TForm1 = class(TForm)
dtsCompteMean: TADODataSet;
ADOConnection1: TADOConnection;
srcdtsCompteMean: TDataSource;
Button1: TButton;
dtsQueryMean: TADODataSet;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function ComputeMean(MeanExpr: String): String;
function GetMeanItem(MeanExpr : String; Pos : Integer): Char ;
function GetMeanValue(MeanItem : Char): Double;
public
{ Public declarations }
end;
function IsNumeric(Value : String): Boolean ;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
ComputeMean('(A+B+C)/3');
end;function TForm1.ComputeMean(MeanExpr: String): String;
var
SqlStr, Mean : String;
ItemValue, MeanValue, MeanResult, Addend, Divisor : Double;
MeanItem : Char;
I, MeanExprLen : Integer;
begin
MeanValue := 0;
MeanResult := 0;
MeanExprLen := Length(MeanExpr);
I := 1;
while I < MeanExprLen do
begin
MeanItem := GetMeanItem(MeanExpr, I);
case MeanItem of
'(':
begin
MeanItem := GetMeanItem(MeanExpr, I);
MeanResult := MeanValue;
end;
')':
begin end;
'+':
begin
Inc(I);
MeanItem := GetMeanItem(MeanExpr, I);
Addend := GetMeanValue(MeanItem);
if IsNumeric(FloatToStr(MeanValue)) then
MeanResult := MeanResult + Addend;
end;
'-':
begin end;
'*':
begin end;
'/':
begin
Inc(I);
MeanItem := GetMeanItem(MeanExpr, I);
if not IsNumeric(String(MeanItem)) then
ComputeMean(MeanExpr)
else
Divisor := StrToFloat(String(MeanItem));
if Divisor <> 0 then
MeanResult := MeanResult/Divisor;
end;
else
begin
MeanValue := GetMeanValue(meanitem);
MeanResult := MeanValue;
end;
end;
Inc(I);
Next;
end;
ReSult := FloatToStr(MeanResult);
ShowMessage('结果是: '+ReSult);
end;function TForm1.GetMeanItem(MeanExpr : String; Pos : Integer): Char ;
var
C: Char;
begin
C := Char(MeanExpr[Pos]);
Result := C;
end;function TForm1.GetMeanValue(MeanItem : Char): Double;
var
MeanValue : Double;
SqlStr : string;
begin
with dtsQueryMean do
begin
SqlStr:= 'SELECT * FROM meanitem WHERE meanitem='+''''+MeanItem+'''';
Close;
CommandText := SqlStr;
Open; MeanValue := FieldByName('MeanItemValue').AsFloat;
ReSult := MeanValue;
end;
end;function IsNumeric(Value : String): Boolean ;
var
I : Integer;
C : Char;
begin
for I := 1 to Length(Value) do
begin
C := Char(Value[I]);
If (C in ['0'..'9']) or (C in ['.']) then
begin
if I = Length(Value) then
Result := True;
end
else
begin
Result := False;
Break;
end;
end;
end;end.不过我觉得很别扭,而且很不完整。例如 '+': 部分可不可以用递归的?我想让 '(':
begin
MeanItem := GetMeanItem(MeanExpr, I);
MeanResult := MeanValue;
end;
和
else
begin
MeanValue := GetMeanValue(meanitem);
MeanResult := MeanValue;
end;
的MeanResult := MeanValue;消失! 这样就完美一点健壮一点了吧!?