- •Лабораторная работа № 1
- •5.1 Линейная программа
- •Далее создадим файл:
- •Задания1
- •Лабораторная работа № 2
- •7. Варианты задания
- •Лабораторная работа № 3
- •5.2 Оператор if
- •Лабораторная работа № 4
- •Лабораторная работа № 5
- •Задание 2. Циклический вычислительный процесс конечные суммы и произведения
- •Лабораторная работа № 6
- •Лабораторная работа № 7
- •5.1 Одномерный массив
- •5.3 Индексация с помощью указателей
- •Лабораторная работа № 8
- •Лабораторная работа № 9
- •Лабораторная работа № 11
- •Задача 2. Параметры функции
- •Лабораторная работа № 12
- •Лабораторная работа № 13
- •5. Содержание отчета
- •Лабораторная работа № 14
- •5. Содержание отчета
- •Решение уравнения методом деления отрезка пополам (бисекций)
- •Лабораторная работа № 15
- •6.2.1 Метод средних прямоугольников
- •6.2.1 Метод трапеций
- •Лабораторная работа № 10
- •Лабораторная работа № 16
- •5. Содержание отчета
- •Директива #include
- •7. Методические указания
- •8. Варианты заданий.
- •Лабораторная работа № 17
- •Лабораторная работа № 18
- •Лабораторная работа № 19
- •5. Содержание отчета
- •6.1.1 Доступ к элементам структуры
- •6.1.2 Присваивание структур
- •Лабораторная работа № 20
- •Например, формула
- •Задание на программирование
Лабораторная работа № 15
Тема: «Передача функций в качестве параметра функций»
Цель работы
Получение навыков в написании программ с использованием указателей на функции.
Научиться составлять программу вычисления определенного интеграла методам средних прямоугольников и методом трапеций.
Техническое обеспечение
Персональная ЭВМ .
Клавиатура.
Дисплей.
Печатающее устройство.
Программное обеспечение
Операционная система Windows
Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.
Постановка задачи
Вычислить выражение, указанное в конкретном варианте, используя для вычисления интеграла один из указанных в п. 1.2 методов (по указанию преподавателя). Значение интеграла считать с погрешностью .
Содержание отчета
5.1. Тема и цель работы.
5.2. Схема алгоритма решения задачи.
5.3. Текст программы.
5.4. Результаты выполнения программы.
Общие сведения
. Указатели на функции
Чтобы понять, как работают указатели на функции, необходимо понять, как компилируются и вызываются функции в языке С. По мере компиляции функций исходный код преобразуется в объектный и устанавливается точка(адрес) входа. При вызове функции происходит обращение к данной точке входа. Поэтому указатель на функцию может использоваться для вызова функции.
Адрес функции получается при использовании имени функции без каких-либо скобок или аргументов. (Очень похоже на массивы, где адрес получается с использованием имени массива без индексов.) Рассмотрим следующую программу, предназначенную для демонстрации особенностей объявления.
# include <stdio.h>
# include <string.h>
void check (char a, char b, int (*cmp) (const char *, const char *));
int main (void)
{
char s1[80], s2[80];
int(*p) (constchar*,constchar*); /* объявление указателя на функцию */
p=strcmp; /* получение адреса функцииstrcmp*/
gets(s1);
gets(s2);
check(s1, s2, p);
return 0;
}
void check (char a, char b, int (*cmp) (const char *, const char *))
{
printf(“Сравнение строк.\n”);
if (! (*cmp) (a,b)) printf(“Равны”);
elseprintf(“Не равны”);
}
Когда вызывается функция check (), ей передаются два указателя на символы и один указатель на функцию. В функцииcheck ()аргументы объявляются как указатели на символы и указатель на функцию. Следует обратить внимание на способ объявления указателя на функцию. Следует использовать аналогичный метод при объявлении других указателей на функцию, за исключением тех случаев, когда отличается возвращаемый тип или передаваемые параметры. Скобки вокруг*cmpнеобходимы для правильной интерпретации компилятором данного выражения.
При объявлении указателя на функцию можно по-прежнему использовать прототип, как показано в предыдущей программе. Тем не менее в большинстве случаев имена настоящих параметров неизвестны. Поэтому можно оставить имена пустыми или можно использовать любые имена.
Рассмотрим работу функции strcmp ()и функцииcheck (). Оператор
if (! (*cmp) (a,b)) printf(“Равны”);
осуществляет вызов функции, в данном случае strcmp (), с помощьюcmp, который указывает на данную функцию. Вызов происходит с аргументамиaиb. Данный оператор демонстрирует общий ввод использования указателя на функцию для вызова функции, на которую он указывает. Круглые скобки вокруг*cmpнеобходимы вследствие наличия приоритетов.
На самом деле можно напрямую использовать cmp, как показано ниже:
if (! cmp (a,b)) printf(“Равны”);
Данная версия также вызывает функцию, на которую указывает cmp, но она использует нормальный синтаксис. Использование (*cmp) помогает всем, читающим программу, понять, что указатель на функцию используется для вызова функции вместо функции вместо вызова функцииcmp.
Возможно вызвать напрямую функцию check (), используяstrcmp, как показано ниже:
check (s1, s2, strcmp);
Данный оператор устраняет необходимость наличия дополнительной переменной-указателя.
Можно задаться вопросом, почему кто-то хочет написать программу таким способом. В данном примере ничего не достигается, но появляются большие проблемы. Тем не менее иногда бывают моменты, когда выгодно передавать функцию в процедуры или хранить массивы функций.
Вычисление определенного интеграла
Пусть требуется вычислить значение
с заданной точностью . График функцииf(x) представлен на рисунке 1.
Рисунок 1 – Вычисление интеграла