Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2007, 17:58
f_slayer f_slayer вне форума
Прохожий
 
Регистрация: 19.09.2007
Адрес: Kazakhstan, Karaganda
Сообщения: 3
Репутация: 10
Вопрос как преобразовать строку в функцию?

как преобразовать строку в функцию? Если можно, то и разбор функции?
Ответить с цитированием
  #2  
Старый 02.11.2007, 19:23
Аватар для mav_c
mav_c mav_c вне форума
Активный
 
Регистрация: 26.03.2007
Адрес: Москва
Сообщения: 287
Репутация: 30
По умолчанию

Цитата:
Сообщение от f_slayer
как преобразовать строку в функцию? Если можно, то и разбор функции?
А можно конкретнее.
__________________
---------------------------------------------
Программирование - не профессия, а стиль жизни
Ответить с цитированием
  #3  
Старый 02.11.2007, 19:56
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Может ты имел ввиду перевести строку с мат. выражением в число? Например, из '5+4' поучить 9.
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #4  
Старый 02.11.2007, 21:57
Аватар для Alek P.S.
Alek P.S. Alek P.S. вне форума
Прохожий
 
Регистрация: 01.11.2007
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от f_slayer
как преобразовать строку в функцию? Если можно, то и разбор функции?
если у тебя строка с выражением то надо будет сделать процедуру-анализатор твоей строки (выделяет цифры и знаки операций и выполняет действиыя.
Ответить с цитированием
  #5  
Старый 03.11.2007, 08:27
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Где-то, кажется на этом сайте, находил такой компонент:
Код:
unit MathComponent; 
interface 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,math; 

type 
TMathtype=(mtnil,mtoperator,mtlbracket,mtrbracket,mtoperand); 
type 
TMathOperatortype=(monone,moadd,mosub,modiv,momul,mopow); 
type 
pmathchar = ^Tmathchar; 
TMathChar = record 
  case mathtype: Tmathtype of 
   mtoperand:(data:extended); 
   mtoperator:(op:TMathOperatortype); 
end; 
type 
  TMathControl = class(TComponent) 
  private 
   input,output,stack:array of tmathchar; 
   fmathstring:string; 
   function getresult:extended; 
   function calculate(operand1,operand2,operator:Tmathchar):extended; 
   function getoperator(c:char):TMathOperatortype; 
   function getoperand(mid:integer;var len:integer):extended; 
   procedure processstring; 
   procedure convertinfixtopostfix; 
   function isdigit(c:char):boolean; 
   function isoperator(c:char):boolean; 
   function getprecedence(mop:TMathOperatortype):integer; 
  protected 
  published 
   property MathExpression:string read fmathstring write fmathstring; 
   property MathResult:extended read getresult; 
  end; 
procedure Register; 
implementation 
function Tmathcontrol.calculate(operand1,operand2,operator:Tmathchar):extended; 
begin 
result:=0; 
case operator.op of 
  moadd: 
   result:=operand1.data + operand2.data; 
  mosub: 
   result:=operand1.data - operand2.data; 
  momul: 
   result:=operand1.data * operand2.data; 
  modiv: 
   if (operand1.data<>0) and (operand2.data<>0) then 
    result:=operand1.data / operand2.data 
   else 
    result:=0; 
  mopow: result:=power(operand1.data,operand2.data); 
end; 
end; 
function Tmathcontrol.getresult:extended; 
var 
i:integer; 
tmp1,tmp2,tmp3:tmathchar; 
begin 
convertinfixtopostfix; 
setlength(stack,0); 
for i:=0 to length(output)-1 do 
  begin 
   if output[i].mathtype=mtoperand then 
    begin 
     setlength(stack,length(stack)+1); 
     stack[length(stack)-1]:=output[i]; 
    end 
   else if output[i].mathtype=mtoperator then 
    begin 
      tmp1:=stack[length(stack)-1]; 
      tmp2:=stack[length(stack)-2]; 
      setlength(stack,length(stack)-2); 
      tmp3.mathtype:=mtoperand; 
      tmp3.data:=calculate(tmp2,tmp1,output[i]); 
      setlength(stack,length(stack)+1); 
      stack[length(stack)-1]:=tmp3; 
    end; 
  end; 
result:=stack[0].data; 
setlength(stack,0); 
setlength(input,0); 
setlength(output,0); 
end; 
function Tmathcontrol.getoperator(c:char):TMathOperatortype; 
begin 
result:=monone; 
if c='+' then 
  result:=moadd 
else if c='*' then 
  result:=momul 
else if c='/' then 
  result:=modiv 
else if c='-' then 
  result:=mosub 
else if c='^' then 
  result:=mopow; 
end; 
function Tmathcontrol.getoperand(mid:integer;var len:integer):extended; 
var 
i,j:integer; 
tmpnum:string; 
begin 
j:=1; 
for i:=mid to length(fmathstring)-1 do 
  begin 
   if isdigit(fmathstring[i]) then 
    begin 
     if j<=20 then 
      tmpnum:=tmpnum+fmathstring[i]; 
     j:=j+1; 
    end 
   else 
    break; 
  end; 
result:=strtofloat(tmpnum); 
len:=length(tmpnum); 
end; 
procedure Tmathcontrol.processstring; 
var 
i:integer; 
numlen:integer; 
begin 
i:=0; 
numlen:=0; 
setlength(output,0); 
setlength(input,0); 
setlength(stack,0); 
fmathstring:='('+fmathstring+')'; 
setlength(input,length(fmathstring)); 
while i<=length(fmathstring)-1 do 
  begin 
   if fmathstring[i+1]='(' then 
    begin 
     input[i].mathtype:=mtlbracket; 
     i:=i+1; 
    end 
   else if fmathstring[i+1]=')' then 
    begin 
     input[i].mathtype:=mtrbracket; 
     i:=i+1; 
    end 
   else if isoperator(fmathstring[i+1]) then 
    begin 
     input[i].mathtype:=mtoperator; 
     input[i].op:=getoperator(fmathstring[i+1]); 
     i:=i+1; 
    end 
   else if isdigit(fmathstring[i+1]) then 
    begin 
     input[i].mathtype:=mtoperand; 
     input[i].data:=getoperand(i+1,numlen); 
     i:=i+numlen; 
    end; 
  end; 
end; 

function Tmathcontrol.isoperator(c:char):boolean; 
begin 
result:=false; 
if (c='+') or (c='-') or (c='*') or (c='/') or (c='^') then 
  result:=true; 
end; 
function Tmathcontrol.isdigit(c:char):boolean; 
begin 
result:=false; 
if ((integer(c)> 47) and (integer(c)< 58)) or (c='.') then 
  result:=true; 
end; 
function Tmathcontrol.getprecedence(mop:TMathOperatortype):integer; 
begin 
result:=-1; 
case mop of 
  moadd:result:=1; 
  mosub:result:=1; 
  momul:result:=2; 
  modiv:result:=2; 
  mopow:result:=3; 
end; 
end; 
procedure Tmathcontrol.convertinfixtopostfix; 
var 
i,j,prec:integer; 
begin 
processstring; 
for i:=0 to length(input)-1 do 
  begin 
   if input[i].mathtype=mtoperand then 
    begin 
     setlength(output,length(output)+1); 
     output[length(output)-1]:=input[i]; 
    end 
   else if input[i].mathtype=mtlbracket then 
    begin 
     setlength(stack,length(stack)+1); 
     stack[length(stack)-1]:=input[i]; 
    end 
   else if input[i].mathtype=mtoperator then 
    begin 
     prec:=getprecedence(input[i].op); 
     j:=length(stack)-1; 
     if j>=0 then 
      begin 
       while(getprecedence(stack[j].op)>=prec) and (j>=0) do 
        begin 
         setlength(output,length(output)+1); 
         output[length(output)-1]:=stack[j]; 
         setlength(stack,length(stack)-1); 
         j:=j-1; 
        end; 
       setlength(stack,length(stack)+1); 
       stack[length(stack)-1]:=input[i]; 
      end; 
    end 
   else if input[i].mathtype=mtrbracket then 
    begin 
     j:=length(stack)-1; 
     if j>=0 then 
      begin 
       while(stack[j].mathtype<>mtlbracket) and (j>=0) do 
        begin 
         setlength(output,length(output)+1); 
         output[length(output)-1]:=stack[j]; 
         setlength(stack,length(stack)-1); 
         j:=j-1; 
        end; 
       if j>=0 then 
        setlength(stack,length(stack)-1); 
      end; 
    end; 
  end; 
end; 

procedure Register; 
begin 
  RegisterComponents('Samples', [TMathControl]); 
end; 
end. 
В его свойство MathExpression помещаешь строку, а потом получаешь значение MathResult.
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #6  
Старый 03.11.2007, 22:23
f_slayer f_slayer вне форума
Прохожий
 
Регистрация: 19.09.2007
Адрес: Kazakhstan, Karaganda
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо за помощь
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:23.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025