Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ - С-С++методичка и титул.doc
Скачиваний:
12
Добавлен:
08.11.2019
Размер:
789.5 Кб
Скачать

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

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

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

2) массив

d ouble (*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); // вывод значения функции

}

Пример 48.

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

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

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

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

где fb[i] (х) – базисные функции, c[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

Составитель: Л.А. Прокушев 2

Подписано к печати Формат 60х84 1/16. Бумага тип. №3 2

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

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

Базовые элементы языков С/С++ 9

Данные и их типы 10

Константы 10

Переменные 11

Ввод-вывод данных 11

Ввод-вывод данных в стиле С 12

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

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

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

Функция вывода символа: 14

Пример 3. Ввести и вывести символ, а затем определить его коды (10-чный, 8-чный, 16-чный ). 14

Консольный ввод-вывод 15

Функция ввода символа (без отображения): 15

Функция очистки экрана результатов: 16

Ввод-вывод данных в стиле С++ 16

Структура программы С/С++ 23

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

математическая формула: 26

арифметическое выражение: 26

a+b  sin t – 26

2cos t 26

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

Работа с ветвящимися процессами 28

Операторы 28

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

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

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

Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор. 32

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

Действие оператора выбора состоит в следующем: 33

Введите 2 числа х, y : 3 8 35

Работа с циклическими вычислительными процессами 35

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

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

Прерывание цикла 37

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

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

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

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

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

Программа: 44

Работа с массивами 45

Описание массива 46

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

Указатель. 47

Занесение данных в массив 48

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

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

Описание массива типа 53

char string[80]; позволяет описывать и обрабатывать символьные данные, однако тип char[ ] относится к целому типу, поскольку имеет дело с ASCII-кодами символов. 53

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

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

Вызов функции 58

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

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

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

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

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

{ внутренний блок локальная 62

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

В цикле count=1 i=0 63

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

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

Проект программы 65

Внешние ссылки 65

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

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

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

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

Указатель на указатель 72

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

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

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