Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ввод функции 
:(
    Опции темы
1nd1Go
Дата 26.5.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Здравствуйте! У меня следующая проблема:
Не знаю как мне сделать ввод функции через Edit, сделал временно через функцию (по коду float f() )
(программа для вычисления определенных интегралов), вот собственно и все, ну и код:


Код

 float Pram(float, float, float (*)(float));
 float Trap(float a, float b, float e, float (*f)(float));
 float Simpson(float a, float b, float e, float (*f)(float));
 float f(float);
 float a,b,fx,h,e,x,tmp;
// float e=0.1;
 int n=50;

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Form1->Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

 Memo1->Clear();

 a=StrToFloat(E_a->Text);
 b=StrToFloat(E_b->Text);
 e=StrToFloat(E->Text);

 h=(b-a)/n;

 Memo1->Lines->Add("Метод прямоугольников:");
 Memo1->Lines->Add(FloatToStr(Pram(a,b,f)));

 Memo1->Lines->Add("Метод трапеций:");
 Memo1->Lines->Add(FloatToStr(Trap(a,b,e,f)));

 Memo1->Lines->Add("Метод Симпсона:");
 Memo1->Lines->Add(FloatToStr(Simpson(a,b,e,f)));

}
//---------------------------------------------------------------------------
float Pram(float a, float b, float (*)(float))
{
 float s,x,rez;
 h = (b-a)/n;
 s=0;
 x=a+h/2;
 do
   {
     s=s+f(x);
     x=x+h;
   }
 while (x>b-h);
 rez=s*h;
 return rez;
}
//--------------------------------------------------------------------------

float Trap(float a, float b, float e, float (*f)(float))
{
 float h,s,s0,s1,sn;
 int i;
 s=1;
 sn=101;
 s0=(f(a)+f(b))/2;
 s1=f((a+b)/2);
 while(fabs(s-sn)>e)
   {
    sn=s;
    h=(b-a)/n;
    for(i=0; i<n/2; i++)
     s1+=f(a+(2*i+1)*h);
    s=h*(s0+s1);
    n*=2;
    }
 return s;
}
//--------------------------------------------------------------------------
float f(float x)
{
 return ((x*x*x)*((x-5)*(x-5)));
// func = exp(x)*(1+sin(x))/(1+cos(x));
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 Memo1->Clear();
}
//---------------------------------------------------------------------------

float Simpson(float a, float b, float e, float (*f)(float))
{
 int i;
 float s_ab = f(a) + f(b);
 float h = (b - a) / n;
 float s_even = 0,  s_odd;
 float s_res = 0, s_pres;

 for (i = 2; i < n; i += 2)
   {
     s_even += f(a + i * h);
   }
 do
   {
    s_odd = 0;
    s_pres = s_res;


    for (i = 1; i < n; i += 2)
      {
        s_odd += f(a + i * h);
      }

    s_res = h / 3 * (s_ab + 2 * s_even + 4 * s_odd);

    if (s_res == 0) s_res = e;
    s_even += s_odd;
    n *= 2;
    h /= 2;
   }
 while (fabs((s_pres - s_res) / s_res) > e);
 return fabs(s_res);
}




PM MAIL   Вверх
Anikmar
Дата 27.5.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Простым способом врядли получится. Вам нужно разобрать синтаксис введенной строки и построить функцию. Методов разбора много, на этом форуме было очень много обсуждений этого, но код разбора этой строки превысит код всей вашей программы.
Так что подумайте, точно вам это надо. Если хочется для повышения квалификации - тогда можно поэкспериментировать, если в рамках задания - сдал-забыл, то не советую.
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 28.5.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Н-да... Еще вчера подумал ответить на вопрос, заданный топикстартером, но решил подождать, что скажут другие (может, что-то новенькое). Ждал зря.  smile Про то, что существуют специально написанные для этой цели классы и компоненты, никто так и не вспомнил...  Уже когда-то на этом форуме писал это, посему повторяю (copy/paste) практически без изменений.

Если нужна теория, то можно почитать это:
(http://algolist.manual.ru) Разбор выражений. Компиляторы и интерпретаторы.
(http://alglib.sources.ru) Работа с формулами.

Если нужна готовая реализация, то можно посмотреть здесь: 
(вариант 1, http://www.rsdn.ru)  Класс TParser. Парсер математических выражений.
(вариант 2, http://rxlib.ru)  Библиотека RXLib 2.75, класс TRxMathParser

Что касается последнего, то...

Код

...
#include <parsing.hpp>
...
TRxMathParser *MathParser=new TRxMathParser();
AnsiString E="(5+7)*Cos(0)";
float f=MathParser->Exec(E);
ShowMessage("Result: "+FloatToStr(f));
delete MathParser;


Вообщем, сначала подключается соответствующий заголовочный файл директивой препроцессора #include, затем объявляется указатель на объект класса TRxMathParser, который впоследствии инициализируется адресом, возвращенным операцией new при динамическом создании объекта данного класса. Класс имеет метод Exec, принимающий параметр типа AnsiString (строка с выражением) и возвращающий результат вычисления(не помню точно) типа float. После использования удаляется операцией delete...

Допустимые операторы:  + , - , * , / , ^, кроме того в выражении могут быть использованы следующие функции: Cos, Sin, Tan, ArcTan, ArcSin, ArcCos, Abs, Exp, Ln, Log, Sqrt, Sqr, Int, Fraq, Trunc, Round, Sign, Not.

Если надо просчитывать значение какой-то функции, то, вероятно, придется формировать строку с фактическим значением параметров, которую в дальнейшем передавать парсеру. 


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.2359 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.