Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кардаш. 1 курс, 1 семестр, заочка, 28 вариант. Контрольная.doc
Скачиваний:
2
Добавлен:
01.04.2014
Размер:
126.98 Кб
Скачать

Министерство образования Республики Беларусь

Учреждение образования

Белорусский государственный университет

информатики и радиоэлектроники

Контрольная работа

по курсу: «Информатика»

Выполнила: студентка 1 курса гр. 001501

Хвесько Юлия Александровна

Проверил: преподаватель

Кардаш Сергей Николаевич

Минск, 2010 г.

Содержание:

  1. Теоретическая часть…...……………………...…… 3 стр.

    1. Указатели на функции. Массивы указателей на функции. Указатель на функцию в качестве аргумента другой функции ….…………..……3 стр.

    2. Открытие и закрытие файлов ……..…………9 стр.

  2. Практическая часть………………......……….…12 стр.

    1. Постановка задачи…………………..………12 стр.

    2. Текст программы……………………...………13 стр.

    3. Руководство пользователя………….…..……15 стр.

  3. Список литературы…………………………….…..16 стр.

  1. Теоретическая часть

    1. Указатели на функции. Массивы указателей на функции. Указатель на функцию в качестве аргумента другой функции.

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

int (*fl)( );

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

int *fl( ); //это не указатель на функцию.

означало бы, что fl – функция, возвращающая указатель на целое значение. После объявления указателя на функцию в программе можно использовать операторы вида:

y=(*fl)(…); либо y=fl(…);

Указатель на функцию – это такой тип переменной, которой можно присваивать адрес точки входа в функцию, т.е. адрес первой исполняемой команды. Эта переменная в дальнейшем может использоваться для вызова функции вместо ее имени. Определение указателя на функцию имеет следующий общий вид:

тип_результата (*имя_указателя_на функцию)(список типов параметров):

Например:

double (*fd) (int, int);

/*fd – указатель на функцию, возвращающую результат типа double и принимающую два параметра типа int.*/

int (*find)(int, float*);

/*find – указатель на функцию. Функция возвращает результат типа int и принимает два параметра: число типа int и указатель на число типа float.*/

char*(*comp)(const char*s1, const char*s2);

/*comp – указатель на функцию, возвращающую результат указатель на char и принимающую в качестве параметров два указателя на char.*/

При определении указателя на функцию разрешается одновременно с указанием типа параметров задавать и их имена.

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

int f3(int);

int f5(int);

int f7(int);

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

int (*fst)(int);

Тогда оператор fst=f3; присвоит указателю fst адрес входа в функцию f3, fst=f5; адрес входа в функцию f5, соответственно fst=f7; - адрес входа в функцию f7. После этого вызвать любую из функций (f3, f5, f7) можно любым оператором, записанным ниже.

f3(a); // обращение к функции, используя ее имя.

(*fst)(a); //вызов функции через указатель.

fst(a); // вызов функции также через указатель.

Последний вариант также правильный, т.к. f3, fst это адреса входа в функцию. Однако, вызов (*fst) (a) явно показывает, что используется указатель на функцию, а не вызывается функция с именем fst, если видеть только один оператор fst(a).

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

Для иллюстрации рассмотрим простой пример. Пусть требуется вычислить следующие выражения:

y=4*4*4+7*7*7 и y=3*3*3*3*3+9*9*9*9*9.

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

#include<stdio.h>

#include<conio.h>

int f3( int x) // возведение числа в третью степень

{

return x*x*x;

}

int f5( int x) // возведение числа в пятую степень

{

int x2=x*x;

return x2*x2*x;

}