Как и обычные переменные, указатели на функции могут объединяться в массивы указателей. Например, интерпретируем описание массива указателей на функции:
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