Форум программистов, компьютерный форум CyberForum.ru

Функциональный тип через typedef - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Jacen
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 5
28.05.2012, 20:31     Функциональный тип через typedef #1
Приветствую, нужна помощь в решении задачи:

В файле заданы строки из 5-ти чисел:
границы отрезка, точность, номер функции и номер метода.
Номер функции = {1,2,3}, где 1. f(x)=x3-x-9;
2. f(x)=sinx-1;
3. f(x)=x+2.
Номер метода = {1,2}, где 1. хорд;
2. касательных.
На заданном отрезке с заданной точностью вычислить приближенно корень уравнения f(x)=0 для заданной функции заданным методом.
В сущности, задачу я решил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <fstream>
#include <cmath>
#include <iostream>
using namespace std;
 
double func(double x, int nf){
switch (nf){
case 1: 
    return pow(x, 3) - x - 9; 
    break;
case 2: 
    return sin(x)-1;
    break;
case 3: 
    return x+2;
    break;
}}
double dfunc(double x, int nf){
switch (nf){
case 1: 
    return 3*pow(x, 2) - 1; 
    break;
case 2: 
    return cos(x);
    break;
case 3: 
    return 1;
    break;
}}
 
double hord(double infinum, double supremum, double epsilon, int nf)
{
    while (fabs(supremum - infinum) > epsilon)
    {
        infinum = supremum - (supremum - infinum) * func(supremum, nf) / (func(
                supremum, nf) - func(infinum, nf));
        supremum = infinum - (infinum - supremum) * func(infinum, nf) / (func(
                infinum, nf) - func(supremum, nf));
    }
 
    return supremum;
}
double kasat(double x, double eps, int nf) {
 double tmp;
 tmp=x+2*eps;
    while(fabs(x-tmp)>eps) { //Выбран останов |x[n]-x[n+1]|<eps
     tmp=x;
     x=x-func(x, nf)/dfunc(x, nf);
   }
return x;
}
 int main(){
    ifstream fin;
    ofstream fout;
    fin.open("in.txt");
    fout.open("out.txt");
    double l1, l2, tch;
    int nf, nm, a;
    fin>>l1>>l2>>tch>>nf>>nm;
    switch (nm){
    case 1: cout<< hord(l1, l2, tch, nf); 
        break;
    case 2: cout<< kasat(l2-l1, tch, nf);
        break;
    }
    cin>>a;
    return 0;
}
Но вместо switch для выбора функции(алгебраической относительно х) должен использоваться некий функциональный тип, созданный с помощью typedef, и передаваться в функцию(с++) по имени, а не по номеру. Подскажите, как это реализовать!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 20:31     Функциональный тип через typedef
Посмотрите здесь:

C++ Программа через структуру typedef struct
C++ Определение типа через typedef
Решить через тип char C++
C++ Проблема с typedef.... не виден новый тип данных!
тип float и вывод остатка через a % b C++
C++ тип typedef
C++ Как объявить указатель на массив через typedef и как инициализировать такой тип
Определён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.05.2012, 21:41     Функциональный тип через typedef #2
смотрим на ваши кейсы. внутри них везде функции, которые принимают double и возвращают double.
т.е. нам нужны функции с сигнатурой double SomeFunc(double);
указатель на функцию можно считать функциональным типом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// делаем так: тайпдефим указатель на функцию с упомянутой сигнатурой.
typedef double (*Function)(double); // имя нового типа - Function;
 
// Вот тут те самые три функции: напишу одну. остальные по аналогии:
// потом в коде можно будет писать так: Function func1 = &Func1;
double Func1(double x)
{
  return 3*pow(x, 2) - 1;
}
 
// Вот функция, куда передается такой функциональный тип. В коде это все функции,
// куда отдавалась переменная nf
void SuperFunc(Function func)
{
  // bla bla bla calculate x bla bla bla.
  // ну и раз мы определили аргумент для вызова, то переданную функцию func уже можно
  // вызывать:
  double result = func(x);
}
 
int main()
{
   // вот тут мы создаем массив фунциональных объектов и инициализируем его
   // указателями на конкретные функции:
   Function functions[] = {&Func1, &Func2, ... };
 
   // далее запрашиваем режим, по которому выберем нужную функцию из массива:
   int mode = 0; // это будет индекс конкретной функции из массива функций.
   cin << mode;
 
   // Собственно тут вытаскиваем нужную функцию из массива:
   Function func = functions[mode];
 
   // И передаем ее в суперфункцию:
   SuperFunction(func);
}
Jacen
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 5
29.05.2012, 14:18  [ТС]     Функциональный тип через typedef #3
Cпасибо огромное!
Yandex
Объявления
29.05.2012, 14:18     Функциональный тип через typedef
Ответ Создать тему
Опции темы

Текущее время: 12:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru