Массивы указателей на функции

Как и обычные переменные, указатели на функции могут объединяться в массивы указателей. Например, интерпретируем описание массива указателей на функции:

1) объект с этим именем есть

2) массив

double (*fp[ ]) ();

3) указателей

4) на функции, которые

5) возвращают значение типа double.

Для инициализации массива указателей на функции можно использовать имена как стандартных функций, так и разработанных пользователем, например:

double f0 (double x) {return x;} /* описание функций */

double f1 (double x) {return (x * x);} /* пользователя */

Инициализация массива указателей на функции именами функции (указателями-константами):

double (*fp[]) () = { f0, f1, sin};

Доступ к элементам массива fp выполняется как к обычным элементам массива, например:

x=0.5; /* значение аргумента */

for (i=0; i<3; i++) /* цикл по функциям */

{

fx = fp[i] (x); /* вызов функции через массив указателей */

printf (“fx=%f\n”,fx); /* вывод значения функции */

}

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

В программе вычисления значений вариантов аппроксимирующей функции используется массив указателей double (*fb [kb]) () на функции

аппроксимации вида

fap = c[0] * fb[0](x) + c[1] * fb[1](x) + c[2] * fb[2](x),

где fb[i] () – базисные функции.

Для выбора базисных функций из набора испытуемых функций используется функция int select_fb(int).

Программа:

#include <math.h>

#include <stdio.h>

#define kv 2 /* количество вариантов испытаний */

#define kb 3 /* количество базисных функций */

double f0 (double x) { return x; } /* описания испытуемых */

double f1 (double x) { return (x * x); } /* функций */

double f2 (double x) { return 1.0/x; }

double f3 (double x) { return sin(x); }

double f4 (double x) { return cos(x); }

double f5 (double x) { return exp(x); }

/* Объявление массива указателей на испытуемые функции с инициализацией: */

double (*fptr[]) () = { f0, f1, f2, f3, f4, f5 };

int select_fb (int number); /* прототип функции выбора базисной функции */

void main() /* главная функция */

{ double (*fb[kb]) (); /* объявление массива указателей на базисные функции */

double c [] = {1.6, 2.8, 3}; /* массив коэффициентов аппроксимации */

double fap, x; /* рабочие переменные */

int var, i; /* параметры циклов */

clrscr(); /* очистка экрана */

printf (“Выберите 3 базисных функций из возможных:\n”

“0) x 1) x * x 2) 1/x 3) sin(x) 4) cos(x) 5) exp(x)\n”);

for (var=0; var<kv; var++) /* цикл вариантов испытуемых функций */

{ printf (“\nВариант %d\n”, var+1);

for (i=0; i<kb; i++) /* цикл по базисным функциям */

fb[i] = fptr[select_fb(i)]; /* выбор и закрепление указателя функции за базисной функцией */

printf (“Введите отличный от нуля x (аргумент функции): ”);

scanf (“%lf”, &x);

/* Использование массива базисных функций: */

fap = 0;

for (i=0; i<kb; i++) /* цикл вычисления аппроксимирующей функции */

fap += c[i] * fb[i](x);

printf (“Значение аппроксимирующей функции fap= %-7.2f\n”, fap);

}

getch(); /* задержка экрана результатов */

}

/* Функция выбора испытуемой базисной функции из заданного набора: */

int select_fb (int number)

{ int sel = –1; /* начальное значение переменной выбора */

while (sel<0 || sel>5) /* проверка выхода номера за допустимые пределы */

{ printf (“Укажите номер %d-й базисной функции (от 0 до 5): ”,
number+1);

scanf (“%d”, &sel); /* ввод номера базисной функции */

}

return sel; /* возврат номера выбранной функции */

}

Результаты программы:

Выберите 3 базисных функции из возможных:

0) x 1) x * x 2) 1/x 3) sin(x) 4) cos(x) 5) exp(x)

Вариант 1

Укажите номер 1-й базисной функции (от 0 до 5): 0

Укажите номер 2-й базисной функции (от 0 до 5): 1

Укажите номер 3-й базисной функции (от 0 до 5): 2

Введите отличный от нуля x (аргумент функции): 1

Значение аппроксимирующей функции fap=6.00

Вариант 2

Укажите номер 1-й базисной функции (от 0 до 5): 5

Укажите номер 2-й базисной функции (от 0 до 5): 0

Укажите номер 3-й базисной функции (от 0 до 5): 1

Введите отличный от нуля x (аргумент функции): 1

Значение аппроксимирующей функции fap=7.72

Библиографический список

1. Прокушев Л.А. Сравнительное изучение языков Си и Паскаль: Учебно-справочное пособие. С-Пб.: СПбГААП, 1997. 152 с.

2. Касаткин А.И., Вальвачев А.Н. От Turbo C к Borland C++: Справочное пособие. Минск: Вышэйшая школа, 1992. 240 с.

3. Березин Б.И., Березин С.Б. Начальный курс С и С++. М.: Диалог-МИФИ, 2000. 288 с.

ОГЛАВЛЕНИЕ

Общие методические указания........................................................ 1

Алгоритмизация вычислительных процессов......................... 1

Средства программирования вычислительных процессов 4

Базовые элементы языка Си......................................................................... 4

Данные и их типы........................................................................................... 5

Константы................................................................................................... 5

Переменные................................................................................................... 6

Ввод-вывод данных....................................................................................... 6

Форматированный ввод............................................................................... 7

Форматированный вывод............................................................................ 8

Неформатированный ввод-вывод................................................................ 9

Консольный ввод-вывод.............................................................................. 10

Структура Си-программы................................................................................

Директивы препроцессора......................................................................... 12

Выражения и операции.............................................................................. 12

Логические выражения и операции........................................................... 14

РАБОТА С ВЕТВЯЩИМИСЯ процессАМИ............................................. 16

Операторы..................................................................................................... 16

Оператор присваивания............................................................................ 16

Условный оператор (if).............................................................................. 17

Операторы передачи управления.............................................................. 20

Пустой оператор....................................................................................... 20

Оператор выбора (switch).......................................................................... 21

РАБОТА С циклическиМИ ПроцессАМИ........................................... 24

Циклы с фиксированным числом повторений......................................... 24

Оператор цикла с предусловием (while).................................................... 24

Прерывание цикла....................................................................................... 25

Циклы с неизвестным числом повторений............................................... 27

Вычисление рекуррентных последовательностей..................................... 27

Оператор цикла с постусловием (do)........................................................ 28

Вложенные циклы и организация диалога в программе........................... 29

Оператор цикла с параметром (for)........................................................ 30

Работа с Массивами............................................................................. 34

Описание массива....................................................................................... 34

Доступ к элементам массива..................................................................... 35

Указатель...................................................................................................... 35

Занесение данных в массив....................................................................... 36

Многомерные массивы............................................................................... 37

Символьные массивы.................................................................................. 39

Работа с функциями.............................................................................. 42

Определение функции.................................................................................. 43

Вызов функции............................................................................................. 44

Передача параметров функции................................................................... 45

Передача данных по значению................................................................... 45

Передача данных по адресу........................................................................ 46

Прототип (шаблон) функции.................................................................... 47

Блочная структура программы................................................................... 48

Внешние описания переменных................................................................... 51

Многомодульные программы..................................................................... 51

Проект программы.................................................................................... 51

Внешние ссылки........................................................................................... 52

Создание проекта программы................................................................... 54

Работа с указателями........................................................................... 55

Объявления объектов со сложными описателями.................................. 55

Массивы указателей................................................................................... 56

Указатель на указатель............................................................................. 59

Указатель на функцию............................................................................... 60

Использование указателя на функцию как аргумента.............................. 62

Массивы указателей на функции............................................................... 63

Библиографический список………………………………………………………..64


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: