Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2007, 20:05   #1
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
Вопрос Функции

Всем привет!
Введение.
Я делаю прогу для построения графиков функций, использую компонент tchart. График строю таким образом:
for x:=0 to 50 do
chart1.series[0].addxy(x,cos(x));
Вопрос.
Реально вобще саму функцию (cos(x)) поменять на другую во время выполнения программы?
Ну типа чтобы пользователь сам вводил функцию в edit.
Pedro вне форума Ответить с цитированием
Старый 07.11.2007, 21:10   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

для этого нужно сделать условие, что-то вроде этого
Код:
if Edit1.Text = 'sin' then
  for x:=0 to 50 do
    chart1.series[0].addxy(x,sin(x)) 
else
  if Edit1.Text = 'cos' then
    for x:=0 to 50 do
      chart1.series[0].addxy(x,cos(x))
  else
    ShowMessage('неизвестная функция');
а можно выбор функции из списка (ListBox) сделать
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.11.2007, 21:34   #3
GAGARIN-NEW
Познаю мир
Форумчанин Подтвердите свой е-майл
 
Аватар для GAGARIN-NEW
 
Регистрация: 05.10.2007
Сообщений: 387
По умолчанию

а ещё лучше использовать готовый компонент с разпознаванием функций...
---
GAGARIN-NEW вне форума Ответить с цитированием
Старый 08.11.2007, 09:33   #4
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

а что за компонент, и где его взять?
Pedro вне форума Ответить с цитированием
Старый 08.11.2007, 15:39   #5
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Начало:
Код:
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;
AidarBik вне форума Ответить с цитированием
Старый 08.11.2007, 15:39   #6
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Конец:
Код:

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.
AidarBik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции xxxPascalxxx Помощь студентам 2 28.12.2007 18:04
Функции Vinni_puh Microsoft Office Excel 1 20.12.2007 05:51
Функции furian Общие вопросы C/C++ 3 18.12.2007 12:48
Функции binkw32.dll Volkogriz Общие вопросы Delphi 3 16.10.2007 11:46