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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Jacen
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 5
#1

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

28.05.2012, 20:31. Просмотров 1987. Ответов 2
Метки нет (Все метки)

Приветствую, нужна помощь в решении задачи:

В файле заданы строки из 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 и как инициализировать такой тип - C++
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...

тип typedef - C++
можете кинуть какую нибудь программу с преобразованием типа typedef (С++), очень срочно нужно..

Проблема с typedef.... не виден новый тип данных! - C++
Пишу шаблон класса множество, у множеств элементы могут быть разного типа, одно, например, целочисленное, другое - строка. Пользователю...

Определение типа через typedef - C++
То-ли я пересидел, то-ли я просто этого не знаю, но все же. Через typedef определить 1) массив из 7 указателей на целые числа. Как не...

Описание типов через typedef - C++
Возникла проблема с описанием типов в с++. Приведу сразу пример кода: struct t_digit { bool flag; *t_node next; }; ...

Программа через структуру typedef struct - C++
Люди помогите если несложно с программой, задание таково: 1.С клавиатуры вводятся пункты структуры - Студент: Матрикул - номер...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.05.2012, 21:41 #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  [ТС] #3
Cпасибо огромное!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 14:18
Привет! Вот еще темы с ответами:

Указатель на шаблон класса через typedef - C++
Здравствуйте. Возникла следующая проблема: захотел определить указатель на класс с template при помощи typedef, но вываливает ошибку: ...

Определён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? - C++
Определеён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? Или как?

Реализовать через тип данных структура при этом выделить память через new[] - C++
В таблице из 5 строк хранятся данные о товарах: наименование, цена, количество. Определить и вывести наименование товара, цена которого...

Решить через тип char - C++
Дано предложение. Сосчитать все сочетания &lt;&lt;ni&gt;&gt;


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru