![]() |
|
|
#1
|
|||
|
|||
|
Вопрос возможно и нубский, но немогу сделать.
У меня программа, которая считает функцию, но заранее я незнаю, какая именно функция будет использована в программе, тоесть саму функцию я вводю в Edit. Например: Edit1.Text:='(x+1)/2*x'; Как мне сделать, что бы (x+1)/2*x передало допустим в переменную S типа real, и поcтитало значение S. Приведу пример: Я имею на форме Edit1, Edit2 и Label1, ввожу в Edit1 некую функцию y(x), а в Edit2 значение переменной "х". В Label1 мне должно вывести значение функции y(x). |
|
#2
|
||||
|
||||
|
Так просто не сделаешь нужна писать парсер!
Вот готовая: Код:
function Calculate(SMyExpression: string; digits: Byte): string;
// Calculate a simple expression
// Supported are: Real Numbers, parenthesis
var
z: Char;
ipos: Integer;
function StrToReal(chaine: string): Real;
var
r: Real;
Pos: Integer;
begin
Val(chaine, r, Pos);
if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
Result := r;
end;
function RealToStr(inreal: Extended; digits: Byte): string;
var
S: string;
begin
Str(inreal: 0: digits, S);
realToStr := S;
end;
procedure NextChar;
var
s: string;
begin
if ipos > Length(SMyExpression) then
begin
z := #9;
Exit;
end
else
begin
s := Copy(SMyExpression, ipos, 1);
z := s[1];
Inc(ipos);
end;
if z = ' ' then nextchar;
end;
function Expression: Real;
var
w: Real;
function Factor: Real;
var
ws: string;
begin
Nextchar;
if z in ['0'..'9'] then
begin
ws := '';
repeat
ws := ws + z;
nextchar
until not (z in ['0'..'9', '.']);
Factor := StrToReal(ws);
end
else if z = '(' then
begin
Factor := Expression;
nextchar
end
else if z = '+' then Factor := +Factor
else if Z = '-' then Factor := -Factor;
end;
function Term: Real;
var
W: Real;
begin
W := Factor;
while Z in ['*', '/'] do
if z = '*' then w := w * Factor
else
w := w / Factor;
Term := w;
end;
begin
w := term;
while z in ['+', '-'] do
if z = '+' then w := w + term
else
w := w - term;
Expression := w;
end;
begin
ipos := 1;
Result := RealToStr(Expression, digits);
end;Последний раз редактировалось PESTS, 14.05.2009 в 21:29. |
|
#3
|
||||
|
||||
|
showmessage(Calculate('(x+1)/2*x', 3));
|