Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Точность вычисления интеграла + Шаблоны ф-ций  (Прочитано 34094 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dePPman
Гость
« : 11-04-2005 16:43 » 

Здраствуйте!
Есть проблема:надо вычислить интеграл с заданной точностью(пользователь сам вводит точность) по методу Симпсона + еще 3 шаблона ф-ции.
Прогу написал, только для фиксированной точности и ф-ции.

Подскажите как сделать, чтобы пользователь сам вводил точность вычисления + работало для трех разных ф-циий Не понял
И как лучше реализовать графическую оболочку?

//---------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#pragma hdrstop

//---------------------------------------------------------------------------
float integral(float, float, float, float (*)(float));
float f(float);
#pragma argsused
int main(void)
{
   float result;

   result = integral(0, 6, .1, f);
   printf("%f", result);
        putchar('\n');
        getchar();
return 0;
}


float f(float x)
{
   
   return pow(x, 3) * pow(x - 5, 2);
}

float integral(float a, float b, float e, float (*f)(float))
{
   int n = 4, 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);
}

//---------------------------------------------------------------------------

Имя переменной   Тип   Назначение
n   int   Число разбиений отрезка [a, b]
i   int   Счетчик циклов
a   float   Нижний предел интегрирования
b   float   Верхний предел интегрирования
h   float   Шаг разбиения отрезка
e   float   Допустимая относительная ошибка
f   float (*)   Указатель на интегрируемую фун - цию
s_ab   float   Сумма значений фун – ции в точках a и b
s_even   float   Сумма значений фун – ции в нечетных точках
s_odd   float   Сумма значений фун – ции в четных точках
s_res   float   Текущий результат интегрирования
s_pres   float   Предыдущий результат интегрирования

Заранее спасибо!!

« Последнее редактирование: 03-12-2007 18:58 от Алексей1153++ » Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #1 : 27-04-2005 17:04 » 

очень размытый вопрос...
если пишешь под DOS то вводи параметр из командной строки....

а вообще очень много если.... по-конкретнее пожалуйста
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 28-04-2005 01:20 » 

dePPman, и в правду странный вопрос, под винду только сел писать? Созданшь поле ЕДИТ в которое пользователь будет вносить значение точночти, это значение ты будешь загонять в е. Можешь еще сделать, чтобы пользователь заносил значения верхнего и нижнего пределов интегрирования, можешь график построить, дело хозяйское. Можешь сделать как Tuborg сказал, консоль и вперед printf("введите точность");
scanf("%lf"&e);.
Записан

ещё один вопрос ...
dePPman
Гость
« Ответ #3 : 28-04-2005 17:23 » 

nikedeforest, надо под Винду, с точностью и пределами вроде разобрался, а вот с шаблонами нет, пишет ошибку!

//---------------------------------------------------------------------------
double integral(double (*)(double));

double f(double);
int v;
double a,b,x;
#pragma argsused
int main(void)
{
cout<<"1.a/(b*x)"<<' '<<"2.a+(1/(x*a+b))"<<endl;
cout<<"Vvedite variant function= ";
cin>>v;
   double result;

   result = integral( f);
   printf("%f", result);
        putchar('\n');
        getchar();
return 0;
}


double f(double x)/
 {
 double a,b;
   if (v==1) return a/(b*x);
     if (v==2) return a+(1/(x*a+b));(вот здесь ошибка!)

        }

double integral( double (*f)(double))

{       double a;
         cout<<"Vvedite a=";
         cin>>a;
          double b;
         cout<<"Vvedite b=";
         cin>>b;
        double c;
        cout<<"Vvedite Niznii predel integrirovania=";
        cin>>c;
        double d;
        cout<<"Vvedite Verhnii predel integrirovania=";
        cin>>d;
        int n,i;
        cout<<"Vvedite kol-vo shagov=";
        cin>>n;
        double Eps;
        cout<<"Vvedite tochnost vycheslenia=";
        cin>>Eps;
        getchar();
   double summa_ab = f(c) + f(d);
          double h = (d - c) / n;
   double summa_nechet = 0,  summa_chet;
   double summa_tek = 0, summa_pred ;


           
   for (i = 2; i < n; i += 2) {
      summa_nechet += f(c + i * h);
}
   do {
      summa_chet = 0;
      summa_pred = summa_tek;


   for (i = 1; i < n; i += 2) {
         summa_chet += f(c + i * h);
}
summa_tek = h / 3 * (summa_ab + 2 * summa_nechet + 4 * summa_chet);

      if (summa_tek == 0) summa_tek = Eps;
      summa_nechet += summa_chet;
      n *= 2;
      h /= 2;
} while (fabs((summa_pred - summa_tek) / summa_tek) > Eps);

return fabs(summa_tek); }
« Последнее редактирование: 03-12-2007 18:59 от Алексей1153++ » Записан
michaelprog
Гость
« Ответ #4 : 29-04-2005 04:55 » 

Ворос: А где здесь шаблоны функций?
Вижу только указатели.

Если это весь код то не удивительно.
double f(double x)
{double a,b; //локальные переменные, не имеющие ничего общего с глобальными a и b.
//Убери эту строчку
   if (v==1) return a/(b*x);//здесь следует проверить, что b*x!=0
     if (v==2) return a+(1/(x*a+b));//а здесь - что (а*x+b)!=0
}

Скорее всего тривиальное деление на нуль
« Последнее редактирование: 29-04-2005 05:00 от michaelprog » Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 29-04-2005 07:59 » 

Нет тут скорее нужно не тоьлко убрать объявление этих переменных, нужно, чтобы они передавались в формальных параметрах, дело в том, что глобальные переменные вообще не используются в этом коде. Т.е. делай так:
Код:
double f(double x, double a, double b)
{
   if (v==1) return a/(b*x);
     if (v==2) return a+(1/(x*a+b));(вот здесь ошибка!)


затем в функции double integral (double (*)(double)) когда будешь вызывать функцию f() добавляй в список параметров переменные a,b. И смело можешь удалять глобальное объявление переменных a,b, т.к. ты их  нигде не используешь, т.е.
Код:
double integral(double (*)(double)); 

double f(double);
int v;
double a,b,x; //удаляй отсюда a,b
#pragma argsused
int main(void)
Саму реализацию алгоритма не проверял, поэтому если это не поможет, значит гд-то еще косяк, но уже в реализации алгоритма.
 Вопрос такой, а нафиг нужно #pragma argsused?
Записан

ещё один вопрос ...
michaelprog
Гость
« Ответ #6 : 03-05-2005 04:04 » 

категорически согласен!
Никогда не любил глобальные переменные. Просто Я лентяй и пошел по пути наименьшего сопротивления.
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-05-2005 11:01 » 

Цитата
Просто Я лентяй
Лень-добродетель программистов Улыбаюсь.
Записан

ещё один вопрос ...
dePPman
Гость
« Ответ #8 : 03-05-2005 11:34 » 

Спасибо всем!!
в общем с консолью у меня получилось, а вот под Винду нет.(граф. оболочка)
Как сделать чтобы пользователь выбрал шаблон, и просто вбил коэфициенты a,b,c?
Можно ли так: label+CheckBox и как это связать с основной частью проги которая считает сам интеграл, и еще я делал под консоль через ф-цию, а как теперь реализовать без нее(просто пишет ошибку что не может вычислить, f(c) и f(d), т.е. ф-цию от какого-либо значения)
Записан
michaelprog
Гость
« Ответ #9 : 03-05-2005 12:30 » 

Уж сколько раз твердили миру,
что ЗДЕСЬ НЕТ  ШАБЛОНОВ...
dePPmanб ты используешь УКАЗАТЕЛИ на функции

для С++Builderэа:
кидаешь на форму RadioGroup, Edit'ы (3 шт.). задаешь им нормальные имена, ну вроде таких
Код:
//где-то в теле класса формы
TRadioGroup* Selector;
TEdit* A;
TEdit* B;
TEdit* C;
Дальше - большее. Для Selector задаешь через инспектора объектов свои матем. функции (см. Lines или Items - не помню точное название)
ОБЯЗАТЕЛЬНО сохрани порядок:
a/(b*x)
a+(1/(x*a+b))
После чего в Selector появится две RadioButton.
Переходишь на закладку Event и задаешь обработчик события OnChanged (или что-то похожее) и в теле функции пишешь приблизительно такой код:
Код:
{v = Selector->Items->ItemIndex;
}

А потом по нажанию какой-нибудь кнопочки (не забудь кинуть на форму) считываешь из эдитов значение, примерно таким макаром
a=StrToIntDef(A->Text,0);
Вызываешь функцию интегрирования и УСЁ

ЗЫ. Советую сделать следующее
Код:
//где-нибудь в глобальной области видимости
//объявляешь новый тип данных func_ptr - указатель на функцию
template double (*func_ptr)(double);

//и определяешь свою функцию
double integral(func_ptr);
Согласись - гигиеничнее и читабельнее
мог бы посоветовать реализовать твою функцию
double f(double x)
через массив указателей и не использовать логику анализа значения v.

ЗЗЫ. прочитал вопрос до конца - отвечаю.
CheckBox не рекомендую, т.к. ты не собираешься считать интеграл сразу от всех функций (CheckBox позволит отметить несколько позиций, а RadioGroup - нет)
« Последнее редактирование: 20-12-2007 20:18 от Алексей1153++ » Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 03-05-2005 19:24 » 

Цитата
Уж сколько раз твердили миру,
что ЗДЕСЬ НЕТ  ШАБЛОНОВ...
dePPmanб ты используешь УКАЗАТЕЛИ на функции
michaelprog, не горячись, я кажется понял, здесь под шаблоном имеется ввиду a/(b*x) и a+(1/(x*a+b)), а не шаблоны из синтаксиса из С++.
Цитата
template double (*func_ptr)(double);
А вот ты, кажется заговорил о шаблонах из С++. А есть ли смысл использовать здесь шаблоны?
Записан

ещё один вопрос ...
michaelprog
Гость
« Ответ #11 : 04-05-2005 04:18 » 

Каюсь, каюсь - очепятка вышла Ага

template double (*func_ptr)(double);
конечно должно быть
Код:
typedef double (*func_ptr)(double);

Еc-но шаблоны функций здесь неуместны, но терминалогия не должна так попираться.
Записан
Alf
Гость
« Ответ #12 : 04-05-2005 06:03 » 

конечно должно быть
Код:
typedef double (*func_ptr)(double);

Должно ли? Эта конструкция действительно компилируется?
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 04-05-2005 15:04 » 

М-да, спорный момент.
Записан

ещё один вопрос ...
Alf
Гость
« Ответ #14 : 04-05-2005 19:53 » 

М-да, спорный момент.

Переопределение встроенного типа double на указатель на функцию? Спорный - это еще мягко сказано.
Записан
michaelprog
Гость
« Ответ #15 : 05-05-2005 05:09 » 

М-да, спорный момент.

Переопределение встроенного типа double на указатель на функцию? Спорный - это еще мягко сказано.

ПРРР...  :?
Притормозите ребята. Специально проверил (не люблю быть ослом).
Уважаемый Alf случаем не перепутал конструкцию:
Код:
typedef double (*func_ptr)(double);
со следующей:
Код:
#define double (*func_ptr)(double);
вот здесь действительно есть чему удивляться Быть такого не может

А предложенная мною конструкция РАБОТАЕТ как минимум в C++Builde 6.0 Отлично.
См. такой код:
Код:
//глобальные
unsigned int v; //гораздо удобнее, чем простой int - позволит убрать дну проверку
                     //см. реализацию функции f(double)
double a,b;
//функции
double f1(double x)
{if(b*x)
    return a/(b*x);
 throw exception();//типа деление на ноль
}
double f1(double x)
{if(x*a+b)
    return a+(1/(x*a+b));
 throw exception();//типа деление на ноль
}

//определение нового типа
typedef double (*func_ptr)(double);

//а теперь маленький трюк - реализуем функцию-диспетчер с использованием простого массива
double f(double x)
{
 staic const func_ptr Functions={&f1, &f2 }
 //теперь
 // Function[0] соответствует a/(b*x)
 // а Function[1] соответствует a+(1/(x*a+b))
                                           
 //проверим диапазон (на всякий)
 if (v<2) //если использовать простой int, то потребуется две проверки, а так - я уверен, что v>=0
    return Functions[v](x);
 else{//неясно какую фнкцию вызывать, поэтому делаешь что-нибудь этакое.
        //напр., выдаешь ошибку или вызываешь функцию оумолчанию
    }
}

Если функций не две а поболее - представлете экономию на проверках? Отлично

ЗЫ. теперь можете кидать в меня камни
« Последнее редактирование: 05-05-2005 05:19 от michaelprog » Записан
Alf
Гость
« Ответ #16 : 05-05-2005 06:34 » 

А предложенная мною конструкция РАБОТАЕТ как минимум в C++Builde 6.0 Отлично.

MS Visual C++ V7.1 оказался привередливее.
Записан
michaelprog
Гость
« Ответ #17 : 05-05-2005 09:07 » 

MS Visual C++ V7.1 оказался привередливее.
Прошу принять мои искренние соболезнования  Так больше нельзя... по пооду
Цитата
Если функций не две а поболее - представлете экономию на проверках?

ЗЫ. полез в стандарт
« Последнее редактирование: 05-05-2005 09:12 от michaelprog » Записан
Alf
Гость
« Ответ #18 : 05-05-2005 09:31 » 

Прошу принять мои искренние соболезнования  Так больше нельзя... по пооду

Ничего, переживем.

Возможно, в виде класса пройдет, ежели вдруг выяснится, что иначе никак.
Записан
dePPman
Гость
« Ответ #19 : 10-05-2005 15:16 » 

nikedeforest,здесь под шаблоном имеется ввиду a/(b*x) и a+(1/(x*a+b)), а не шаблоны из синтаксиса из С++. Вы правы!
Каюсь!
Записан
dePPman
Гость
« Ответ #20 : 10-05-2005 16:37 » 

Не кидайте в меня камнями!
Но я не понял как вызвать ф-цию интегрирования?(в консоле понятно, а вот в граф. нет.Я делаю кнопку , например, "расчет"  и в что в ней писать???)
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned int v;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 TRadioGroup* Selector;
TEdit* A;
TEdit* B;
TEdit* C;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender) ( кнопка расчета)
{
 a=StrToIntDef(a->Text,0);
 b=StrToIntDef(b->Text,0);
 c=StrToIntDef(c->Text,0);

int n=8;
double Eps=0.01;
double summa_ab = f(a) + f(b);
          double h = (b - a) / n;
double summa_nechet = 0,  summa_chet;
double summa_tek = 0, summa_pred ;

for (i = 2; i < n; i += 2) {
summa_nechet += f(a + i * h);
}
do {
summa_chet = 0;
summa_pred = summa_tek;


for (i = 1; i < n; i += 2) {
summa_chet += f(a + i * h);
}
summa_tek = h / 3 * (summa_ab + 2 * summa_nechet + 4 * summa_chet);

if (summa_tek == 0) summa_tek = Eps;
summa_nechet += summa_chet;
n *= 2;
h /= 2;
} while (fabs((summa_pred - summa_tek) / summa_tek) > Eps);

return fabs(summa_tek); }
double result;
result = integral( f);
Edit4->Text=FloatToStr(result);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::SelectorClick(TObject *Sender)
{
 v = Selector->Items->ItemIndex;
}
//---------------------------------------------------------------------------


+ пишет еще ошибку
 [C++ Error] Unit1.cpp(27): E2034 Cannot convert 'int' to 'TEdit *'
[C++ Error] Unit1.cpp(28): E2034 Cannot convert 'int' to 'TEdit *'
[C++ Error] Unit1.cpp(29): E2034 Cannot convert 'int' to 'TEdit *'
[C++ Error] Unit1.cpp(34): E2316 'ItemIndex' is not a member of 'TStrings'

staic const func_ptr Functions={&f1, &f2 } !!!Объясни как это использовать в расчете, выходит незачем использовать V !!!!

double a,b; --- а это в кнопку расчета//функции
double f1(double x)
{if(b*x)
    return a/(b*x);
throw exception();//типа деление на ноль
}
double f1(double x)
{if(x*a+b)
    return a+(1/(x*a+b));
throw exception();//типа деление на ноль
}

//определение нового типа
typedef double (*func_ptr)(double);

//а теперь маленький трюк - реализуем функцию-диспетчер с использованием простого массива
double f(double x)
{
« Последнее редактирование: 03-12-2007 19:00 от Алексей1153++ » Записан
michaelprog
Гость
« Ответ #21 : 11-05-2005 04:50 » 

начнем по-порядку:
1)
Код:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 TRadioGroup* Selector;
TEdit* A;// Это что такое????
TEdit* B;//
TEdit* C;//
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 a=StrToIntDef(a->Text,0); //А теперь сюда
 b=StrToIntDef(b->Text,0);
 c=StrToIntDef(c->Text,0);

// и т.д.
}
Это что такое у тебя в конструкторе формы??? Я понимаю, если ты решил динамически создавать компоненты, но в твоей задаче этого не требуется. Все это должно быть в самой форме
Код:
//---------------------------------------------------------------------------
class TForm1(TComponent* Owner)  : TForm(Owner)
{
TRadioGroup* Selector;
TEdit* A;
TEdit* B;
TEdit* C;
// и т.д.
}
Более того, указанный код должен сгенерировать Builder, когда ты конструируешь форму.

Обрати внимание на то, что в функции обработки нажатия кнопки Button2Click(TObject *Sender) ты используешь a->Text должно быть А->Text - отсюда три первые ошибки

2) смотрим далее
void __fastcall TForm1::SelectorClick(TObject *Sender)
{v = Selector->Items->ItemIndex;
}
На память не поню, но попробуй так: v = Selector->ItemIndex;

3)что значит
staic const func_ptr Functions={&f1, &f2 } !!!Объясни как это использовать в расчете, выходит незачем использовать V !!!!
если не понял, то не нужно использовать.
А работает это следующим образом. Ты создашь массив указателей на функции, которые вычисляют значение, в данном случае при вызове Functions[0](x) вызывается функция f1(x)? вычисляющая a/(b*x);
Идем дальше, функция SelectorClick(TObject *Sender) обеспечивает автоматическое запоминание типа функции, которая подлежит интегрированию, при переключении на другую RadioButton в Selector.
Теперь при нажании на Button2 вызывается Button2Click, которая в свою очередь integral( f), та вызывает f(x), в недрах которой и происзодит самое интересное. Поскольку мы уже знаем значение v достаточно проиндексиовать массив указателей на функции. Сравни:
Код:
return Function[v](x);
и следующее
Код:
if(v==0) return a/(b*x);
if(v==1) return a+(1/(x*a+b));
Обрати внимание, что V, a, b - глобальные данные, в противном случае их необходимо передвать в качетсве аргументов функций. при увеличении числа вариантов ункций для интегрирования в первом случае нпейдется дописать сами функции и увеличить массив, а логика вызова не изменится (число проверок во время выполнения не увеличится), а во втором случае число проверок возрастет пропорционально числу добавленных функций.

ЫЗ. рекомендую давать осмысленные названия компонентам, например, вместо Button2 - IntegrateButton. Помимо того, то это рациональ, это поможет разобраться в собственном коде по прошествии времени.
Записан
dePPman
Гость
« Ответ #22 : 14-05-2005 08:42 » 

Не могли бы помочь, уже надо сдавать прогу в ближайшее время, и еще препод не может помочь! Жаль
Пользуясь вашими советами, переделал программу, но все равно выдает ошибки:

[C++ Error] Unit1.cpp(21): E2141 Declaration syntax error
[C++ Error] Unit1.cpp(36): E2141 Declaration syntax error
[C++ Error] Unit1.cpp(106): E2451 Undefined symbol 'f1'
[C++ Error] Unit1.cpp(109): E2451 Undefined symbol 'f2'

Код:

//---------------------------------------------------------------------------
#include <exception>
#include <vcl.h>
#include <Math.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
unsigned int v;
double a,b;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
double f1(double x)
{if(b*x)
    return a/(b*x);
throw exception();
}
double f2(double x)
{if(x*a+b)
    return a+(1/(x*a+b));
throw exception();
}

typedef double (*func_ptr)(double);

double f(double x)
{
staic const func_ptr Functions={&f1, &f2 } }
if (v<2) /
    return Functions[v](x);
if(v>2) { Label7->Caption="Neiasno kakuy function vysyvat!";

    }
 }
double integral(double a, double b, double c, double d, int n, double Eps, double (*f)(double)) {

{  int i;
double summa_ab = f(c) + f(d);
          double h = (d - c) / n;
double summa_nechet = 0,  summa_chet;
double summa_tek = 0, summa_pred ;


for (i = 2; i < n; i += 2) {
summa_nechet += f(c + i * h);
}
do {
summa_chet = 0;
summa_pred = summa_tek;


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

summa_tek = h / 3 * (summa_ab + 2 * summa_nechet + 4 * summa_chet);


if (summa_tek == 0) summa_tek = Eps;
summa_nechet += summa_chet;
n *= 2;
h /= 2;
} while (fabs((summa_pred - summa_tek) / summa_tek) > Eps);

return fabs(summa_tek);
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::IntegrateButtonClick(TObject *Sender)
{
 double a,b,c,d,Eps,n,result;

  Label7->Caption="";

  try
  {

 a=StrToFloat(A->Text);
 b=StrToIntDef(B->Text);
 c=StrToIntDef(C->Text);
 d=StrToIntDef(D->Text);
 Eps=StrToIntDef(EPS->Text);
 n=StrToIntDef(N->Text);
  }
  catch(...)
  {
    Label7->Caption="Nevernii format vvedennih chisel!";
    Abort();
  }
if (v==1)
result=integral(a=StrToFloat(A->Text), b=StrToIntDef(B->Text), c=StrToIntDef(C->Text),d=StrToIntDef(D->Text),Eps=StrToIntDef(EPS->Text),n=StrToIntDef(N->Text),f1);
result1->Text=FloatToStr(result);
if (v==2)
result=integral(a=StrToFloat(A->Text), b=StrToIntDef(B->Text), c=StrToIntDef(C->Text),d=StrToIntDef(D->Text),Eps=StrToIntDef(EPS->Text),n=StrToIntDef(N->Text),f2);
result1->Text=FloatToStr(result);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SelectorClick(TObject *Sender)
{
 v = Selector->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewClick(TObject *Sender)
{
 Label7->Caption="";
  A->Clear();
  B->Clear();
  C->Clear();
  D->Clear();
  EPS->Clear();
  N->Clear();
  result1->Clear();
}
//---------------------------------------------------------------------------

Заранее спасибо!!
« Последнее редактирование: 03-12-2007 19:01 от Алексей1153++ » Записан
dePPman
Гость
« Ответ #23 : 14-05-2005 13:09 » 

Ошибки:

Код:
double f1(double x)
{if(b*x) -->[C++ Error] Unit1.cpp(21): E2141 Declaration syntax error
    return a/(b*x);
throw exception();
}
double f2(double x)
{if(x*a+b)
    return a+(1/(x*a+b));
throw exception();


double f(double x){-->[C++ Error] Unit1.cpp(36): E2141 Declaration syntax error
staic const func_ptr Functions={&f1, &f2 } }
if (v<2)    return Functions[v](x);



result=integral(a=StrToFloat(A->Text), b=StrToIntDef(B->Text), c=StrToIntDef(C->Text),d=StrToIntDef(D->Text),Eps=StrToIntDef(EPS->Text),n=StrToIntDef(N->Text),f1); -->[C++ Error] Unit1.cpp(106): E2451 Undefined symbol 'f1'


И варнинги:
[C++ Warning] Unit1.cpp(111): W8004 'n' is assigned a value that is never used
[C++ Warning] Unit1.cpp(111): W8004 'Eps' is assigned a value that is never used
[C++ Warning] Unit1.cpp(111): W8004 'd' is assigned a value that is never used
[C++ Warning] Unit1.cpp(111): W8004 'c' is assigned a value that is never used
[C++ Warning] Unit1.cpp(111): W8004 'b' is assigned a value that is never used
[C++ Warning] Unit1.cpp(111): W8004 'a' is assigned a value that is never used


« Последнее редактирование: 03-12-2007 19:02 от Алексей1153++ » Записан
michaelprog
Гость
« Ответ #24 : 14-05-2005 20:12 » 

сначала хотел расписать ошибки здесь, но понял, что это слишком...  Вот такой я вот
лови проект (Builder6) - прикрепляю ZIP. если у тебя ранняя версия, то посмотри мои исходники и исправь свои.
постарался максимально близко сымитировать твой проект.
обрати снимание на комментарии.

ЫЗ. проект точно компилится и считает(т.е. интегрирует), за точность алгоритма отвечаешь сам.

* Integral.zip (6.99 Кб - загружено 1217 раз.)
Записан
dePPman
Гость
« Ответ #25 : 17-05-2005 20:01 » 

michaelprog, очень благодарен ВАМ!!(не ожидал!!)Улыбаюсь))))))))))))))))))))))

Записан
michaelprog
Гость
« Ответ #26 : 18-05-2005 04:07 » 

незачто, тем более, что это заняло не больше получаса...
Записан
WBTRAP
Гость
« Ответ #27 : 17-05-2006 16:25 » new

Спасибо!!! Улыбаюсь За архивчик. Правда он немного не сразу скачался. Здесь была моя ладья...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines