Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПРОГР.doc
Скачиваний:
33
Добавлен:
29.02.2016
Размер:
1.66 Mб
Скачать

Лабораторная работа № 15

Тема: «Передача функций в качестве параметра функций»

  1. Цель работы

    1. Получение навыков в написании программ с использованием указателей на функции.

    2. Научиться составлять программу вычисления определенного интеграла методам средних прямоугольников и методом трапеций.

  2. Техническое обеспечение

    1. Персональная ЭВМ .

    2. Клавиатура.

    3. Дисплей.

    4. Печатающее устройство.

  3. Программное обеспечение

    1. Операционная система Windows

    2. Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.

  4. Постановка задачи

Вычислить выражение, указанное в конкретном варианте, используя для вычисления интеграла один из указанных в п. 1.2 методов (по указанию преподавателя). Значение интеграла считать с погрешностью .

  1. Содержание отчета

5.1. Тема и цель работы.

5.2. Схема алгоритма решения задачи.

5.3. Текст программы.

5.4. Результаты выполнения программы.

  1. Общие сведения

    1. . Указатели на функции

Чтобы понять, как работают указатели на функции, необходимо понять, как компилируются и вызываются функции в языке С. По мере компиляции функций исходный код преобразуется в объектный и устанавливается точка(адрес) входа. При вызове функции происходит обращение к данной точке входа. Поэтому указатель на функцию может использоваться для вызова функции.

Адрес функции получается при использовании имени функции без каких-либо скобок или аргументов. (Очень похоже на массивы, где адрес получается с использованием имени массива без индексов.) Рассмотрим следующую программу, предназначенную для демонстрации особенностей объявления.

# 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);

Данный оператор устраняет необходимость наличия дополнительной переменной-указателя.

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

    1. Вычисление определенного интеграла

Пусть требуется вычислить значение

с заданной точностью . График функцииf(x) представлен на рисунке 1.

Рисунок 1 – Вычисление интеграла

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]