Программирование >>  Структурное программирование 

1 ... 118 119 120 [ 121 ] 122 123 124 ... 342


int ascending(const int a, const int b) (

return b < a;

int descending(const int a, const int b) {

return b > a;

Рис. 5.26. Программа многоцелевой сортировки, использующая указатели на функции

(часть 2 из 2)

Наша новая программа содержит main и функции bubble, swap, ascending и descending. Функция bubblleSorting принимает указатель на функцию - * либо функцию ascending, либо функцию descending - как аргумент и, кроме того, аргументы вида массива целых чисел и размера этого массива. Программа предлагает пользователю выбрать, в каком порядке должен быть отсортирован массив - возрастающем или убывающем. Если пользователь вводит 1, то в функцию bubble передается указатель на функцию ascending, приводящую к сортировке массива в возрастающем порядке. Если пользователь вводит 2, то в функцию bubble передается указатель на функцию descending, приводящую к сортировке массива в возрастающем порядке. Выходные данные программы представлены на рис. 5.27.

В заголовке функции bubble появляется следующий параметр:

int (*compare) (int, int)

Это сообщает bubble о том, что она должна ждать параметр, являющийся указателем на функцию, которая принимает два целых параметра и возвращает целый результат. Скобки вокруг *compare нужны потому, что * имеет приоритет ниже, чем скобки, в которые заключены параметры функции.

void bubble{int *work, const int size, int {*compare)(int, int)) {

void swap(int *, int *);

for (int pass = 1; pass < size; pass++)

for (int count = 0; count < size - 1; count++)

if ((*compare)(work[count], work[count +1])) swap(Swork[count], Swork[count +1]);

void swap(int *elementlPtr, int *element2Ptr) (

int temp;

temp = *elementlPtr; *elementlPtr = *element2Ptr; *element2Ptr = temp;



Введите 1 для сортировки в воэрастгиощем порядке, Введите 2 для сортировки в убываклцем порядке: 1 Элементы данных в исходном порядке

2 б 4 8 10 12 89 68 45 37 Элементы данных в возрастающем порядке 2 4 б 8 10 12 37 45 68 89

Введите 1 для сортировки в воэрастгиощем порядке, Введите 2 для сортировки в убывгиощем порядке: 2 ttjLA Элементы данных в исходном порядке

2 б 4 8 10 12 89 68 45 37 Элементы данных в убывгиощем порядке 89 68 45 37 12 10 8 б 4 2

Рис. 5.27. Выходные данные программы пузырьковой сортировки на рис. 5.26

Если бы мы не включили скобки, объявление имело бы вид

int *compare(int, int)

что объявляло бы функцию, которая принимает два целых как параметры и возвращает указатель на целое.

Соответствующий параметр в прототипе функции bubble имеет вид

int (*) (int, int)

Заметим, что в прототип включены только типы, но для целей документирования можно включить и имена, которые компилятор будет игнорировать.

Функция, переданная bubble, вызывается в операторе if следующим образом

if ((*compare)(work[count], work[count+1]))

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

Вызов функции можно было бы выполнить и без разыменования указателя, как в выражении:

if ((compare)(work[count], work[count+1]))

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

Типичным применением указателей на функцию являются так называемые системы, управляемые меню. Пользователю предлагается выбрать позицию меню (например, от 1 до 5). Каждая позиция обслуживается своей определенной функцией. Указатели на каждую функцию хранятся в массиве указателей на функции. Выбор пользователя используется как индекс массива, а указатель в массиве используется для вызова функции.



Программа на рис. 5.28 представляет обобщающий пример механизма объявления и использования массива указателей на функции. Определены три функции - functionl, function2 и functions - каждая из которых принимает целый аргумент и ничего не возвращает. Указатели на эти три функции хранятся в массиве f, который объявлен следующим образом

void (*f[3]) (int) = (functionl, function2, functions);

-asi-

Демонстрация массива указателей на функции. #include <iostream.h>

void functionl(int); void function2(int); void functions(int);

main() {

void (*f[S]) (int) = {functionl, function2, functions}; int choice;

cout << Введите число между О и 2, 3 - окончание: ; cin >> choice;

while (choice >= О && choice < 3) { (*f[choice]) (choice);

cout Введите число между О и 2, 3 - окончание: ; cin >> choice;

cout << Вы ввели 3 для окончания << endl; return 0;

void functionl(int a)

cout << Вы ввели a , поэтому была вызвана функция 1 endl endl;

void function2{int b)

cout << Вы ввели b , endl endl;

void functions{int c)

поэтому была вызвана функция 2

cout << Вы ввели << с << , поэтому была вызвана функция 3 << endl endl;

Рис. 5.28. Демонарация массива указателей на функции (чааь 1 из 2)



1 ... 118 119 120 [ 121 ] 122 123 124 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика