如何进行字符型表达式与数值的转换(100分)

  • 主题发起人 主题发起人 xiaozhuan
  • 开始时间 开始时间
X

xiaozhuan

Unregistered / Unconfirmed
GUEST, unregistred user!
如何进行字符型表达式与数值的转换?
例如:字符串型的表达式(1+2+3)*10/2.5用一个控件进行语法合法性检查,
如果符合四则运算法则,将结果转化成数值型,该怎么办?
请大虾给予解答!
 
try
StrToFloat(表达式计算)
....
Except
on EConvertError
ShowMessage(''''');
end;
 
1.自己照相关算法写代码(很多数据结构书上有)
2.找表达式计算控件(深度历险有)
 
这个东西我已经用过了,但它只能把字符串转化成数值而不能先把字符串表达式转化成
数值型表达式并计算出结果.
 
StrToFloat不能转换表达式的,只有找专门控件,不想自己写的话。
 
我一直使用TMathParser控件。很好用。正好符合你的要求。
要否?
 
不肪自己写一个练练手。
 
我原来贴过一篇简单的,找一找,
大概是,先转化为 后缀表达式, 然后计算。
 
不要什么都用控件吧?
 
自己写,挺简单的,用二叉树将其转换为后缀表达式即可.
或者用模拟堆栈的方法,进行检查.
 
To Beta:
>>用二叉树将其转换为后缀表达式
哎呀这种东东可没学过,能详细讲一讲吗?俺也学学。
只知道后缀表达式比较好计算。
或者告诉我哪里有讲这种东东的。网址?书籍?
谢谢!
 
我给你一个简单的例子吧。给我发信, SuperMMX@263.net
 
逆波兰表达式的实现其实很容易,也有现成的,找一下就可以
 
如果您是需要解析数学运算式,请到http://www.nease.net/~bozhi/去,
那里有一个ExPrev控件能解决问题。
 
to all:
我这几天发信不太好:直接贴这里吧, 不长:
做的是 console.

{Expression.dpr}

program Expression;
uses
SysUtils;

var
Input: string;

function Translate(s: string): string;
var
Stack: array of char;
i, Top: Integer;
temp: string;
begin
SetLength(Stack, Length(s));
i := 1;
Top := 0;
temp := '';
while i <= Length(s) do
begin
case s of
'0'..'9':
begin
while (i <= Length(s)) and (s in ['0'..'9', '.']) do
begin
temp := temp + s;
Inc(i);
end;
temp := temp + ' ';
Dec(i);
end;
'+', '-':
begin
while (Top > 0) and (Stack[Top - 1] <> '(') do
begin
temp := temp + Stack[Top - 1];
Dec(Top);
end;
Stack[Top] := s;
Inc(Top);
end;
'*', '/':
begin
if (Top > 0) and ((Stack[Top - 1] = '*') or (Stack[Top - 1] = '/'))
then
begin
temp := temp + Stack[Top - 1];
Dec(Top);
end;
Stack[Top] := s;
Inc(Top);
end;
'(':
begin
Stack[Top] := s;
Inc(Top);
end;
')':
begin
while (Stack[Top - 1] <> '(') and (Top > 0) do
begin
temp := temp + Stack[Top - 1];
Dec(Top);
end;
if Top = 0 then
begin
temp := '''('' expected!';
Top := 0;
Break;
end;
Dec(Top);
end;
end;
Inc(i);
end;
while (Top > 0) do
begin
if Stack[Top - 1] = '(' then
begin
temp := ''')'' expected1';
Break;
end;
Temp := Temp + Stack[Top - 1];
Dec(Top);
end;
Result := temp;
end;

procedure Caculate(s: string);
var
Stack: array of real;
i, Top: Integer;
Info, temp: string;
HasDot: boolean;
begin
SetLength(stack, Length(s));
i := 1;
Top := -1;
Info := '';
while i <= Length(s) do
begin
case s of
'+', '-', '/', '*':
begin
if Top = 0 then
begin
Info := 'Operant Expected!';
break;
end;
case s of
'+': Stack[Top - 1] := Stack[Top - 1] + Stack[Top];
'-': Stack[Top - 1] := Stack[Top - 1] - Stack[Top];
'*': Stack[Top - 1] := Stack[Top - 1] * Stack[Top];
'/': Stack[Top - 1] := Stack[Top - 1] / Stack[Top];
end;
Dec(Top);
end;
'0'..'9':
begin
temp := '';
HasDot := False;
while (i <= Length(s)) and (s in ['0'..'9', '.']) do
begin
temp := temp + s;
if s = '.' then
if not HasDot then
HasDot := True
else
begin
Info := 'Number Invalidate!';
Break;
end;
Inc(i);
end;
Inc(Top);
if HasDot then
Stack[Top] := StrToFloat(temp)
else
Stack[Top] := StrToInt(temp);
Dec(i);
end;
end;
Inc(i);
end;
if Top > 0 then
Info := 'Opcode Expected!';
Writeln(Format('%f', [Stack[Top]]));
end;

begin
writeln('Please input the expression:');
readln(Input);
Caculate(Translate(Input));
readln;
end.
 
接受答案了.
 
后退
顶部