Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Указатели на функции




Рассмотрим функцию, которая вычисляет сумму элементов массива:

 

Эта функция принимает массив в качестве аргумента и, передавая в нее разные массивы, мы можем вычислить для них сумму. Массив в данном случае является переменной, а функция суммирования – постоянная. Рассмотрим теперь ситуацию с точностью до наоборот – массив является постоянным, а функция, которая вычисляется от каждого элемента – переменной. Задача заключается в следующем: для одного массива нужно вычислить

Сумму элементов (сумму первых степеней),

Сумму квадратов элементов (сумму вторых степеней)

Сумму кубов элементов (сумму третьих степеней).

 

int result = 0;

for (int i=0; i<N; i++) {

result += f(numbers[i]);

}

 

#define N 7

 

int numbers[N] = {1,2,3,4,5,6,7};

 

int calculate(int (*operation)(int)) {

int result = 0;

for (int i=0; i<N; i++) {

result += (*operation)(numbers[i]);

}

return result;

}

 

int linear(int x) {

return x;

}

 

int square(int x) {

return x*x;

}

 

int cube(int x) {

return x*x*x;

}

 

cout << calculate(linear) << endl;

cout << calculate(square) << endl;

cout << calculate(cube) << endl;

 

 

Рассмотрим функцию, которая принимает два аргумента и возвращает их сумму:

 

int getSum(int a, int b) {

return a+b;

}

 

В этой функции аргументы a и b являются переменными, а операция суммы – постоянная, другими словами, передавая различные аргументы, мы всегда вычисляем именно сумму. Теперь попробуем поменять их местами – зафиксируем значения a и b, а менять будем операцию. Например, если взять a=10 и b=5, то получив аргумент «сложение», функция вернет 15; получив аргумент «умножение», функция вернет 50; аргумент «деление» даст результат 2; аргумент «вычитание» приведет к результату 5. Вопрос заключается в том, как передать в функцию не переменную, а операцию. Сделать это можно при помощи указателей на функции. Давайте определим значения a и b как константы:

 

const int a = 10;

const int b = 5;

затем реализуем четыре функции, которые отвечают за операции сложения, деления, умножения и вычитания:

 

int summarize(int x, int y) {

return x+y;

}

 

int multiply(int x, int y) {

return x*y;

}

 

int divide(int x, int y) {

return x/y;

}

 

int subtract(int x, int y) {

return x-y;

}

 

Пока все понятно, и нет ничего нового. Теперь реализуем функцию, которая принимает один аргумент – операцию. В нашем примере операция – это одна из четырех функций:

 

int getResult(int (*operation)(int,int)) {

return (*operation)(A,B);

}

 

Для вызова этой функции нужно передать название функции, которое является указателем на функцию (аналогично массивам), и функция вернет нам результат этой операции над числами 10 и 5:

 

printf("Сумма=%d\n", getResult(summarize));

printf("Произведение=%d\n",getResult(multiply));

printf("Частное=%d\n", getResult(divide));

printf("Разность=%d\n", getResult(subtract));

 

Рассмотрим следующую задачу. Требуется реализовать меню, содержащее несколько пунктов:

  1. вычислить сумму элементов массива;
  2. вычислить сумму квадратов элементов массива;
  3. вычислить сумму кубов элементов массива;

Поделиться:

Дата добавления: 2015-08-05; просмотров: 53; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты