Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 2 (СПбГУТ).doc
Скачиваний:
47
Добавлен:
10.09.2019
Размер:
801.79 Кб
Скачать

1.35.1. Назначение функции

Назначение функций языка Си состоит в следующем:

• Функция является средством структурирования программ.

• Функции применяются для повторного использования кода.

К недостаткам использования функций относятся временные накладные расходы. Это положение характерно для обычных функций. Особенно следует обращать внимание на это, когда функция вызывается в цикле. Для inline функций (см.1.35.6) временные накладные расходы отсутствуют.

Следует различать три программных компонента:

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

• Объявление функции (прототип).

• Вызов функции.

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

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

Определение функции состоит из двух структурных частей: заголовка и тела. Формально это можно представить следующим образом:

Заголовок_функции {// начало тела определения, объявления и инструкции }// конец тела

Заголовок функции определяет ее интерфейс с точкой вызова. Тело содержит алгоритм, реализуемый функцией. Телом функции является блок.

Заголовок функции имеет следующую структуру:

тип имя([определения_формальных_параметров])

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

double f1(…) // Возвращает double

void f2(…) // Ничего не возращает

Второй элемент заголовка имя является именем функции. Целесообразно давать функции имя, «раскрывающее» задачу, которую она решает.

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

Телом любой функции, является блок. В блоке могут встречаться инструкции объявления и выполняемые инструкции. В стандарте C89 в блоке вначале следует располагать инструкции объявления, а затем выполняемые инструкции. В стандарте C99 этого ограничения нет. Это позволяет располагать определение переменной в той точке функции, где она начинает использоваться.

Функция, возвращающая результат, должна содержать инструкцию return, имеющую следующий формат

return выражение;

Инструкция выполняет два действия: вычисляет значение элемента выражение; возвращает управление и вычисленное значение в точку вызова функции.

Для прекращения вычислений в функции, не возвращающей

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

Пример. Вычисление наибольшего значения двух вещественных величин.

Решение. Разработка интерфейса. Выберем для функции имя max2. Входные данные – две переменные: double a и double b. Выходные данные – скалярная величина – максимальное значение двух исходных величин. Результат вычислений можно вернуть с помощью значения, возвращаемого функцией. В результате заголовок функции можно написать в следующем виде: double max2(double a, double b).

Реализация функции. Для реализации функции можно использовать стандартную управляющую структуру – альтернативу, которую можно реализовать с помощью инструкции if else. Для фиксации результата вычислений объявим локальную переменную double max. Программный код функции.

double max2(double a, double b) {

double max; if(a > b) max = a; else max = b; return max;

}