Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Си++ Занятие 8.doc
Скачиваний:
3
Добавлен:
17.11.2019
Размер:
97.79 Кб
Скачать

13

Занятие 8 Функции

С увеличением объема программы становится невозможным удерживать в памяти все детали. Естественным способом борьбы со сложностью любой задачи является ее разбиение на части. Для обеспечения действенного контроля над алгоритмом и текстом программы в теории программирования введено понятие «подпрограмма».

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

Сначала подпрограммы использовались как средство оптимизации программ для уменьшения занимаемой памяти, но в настоящее время данное свойство подпрограммы стало вспомогательным, уступив место другому – структуризации программы.

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

В языках программирования высокого уровня используется два типа подпрограмм – процедуры и функции.

Функция – это подпрограмма специального вида, которая выполняет следующие функции:

- получает параметры,

- выполняет инструкции, согласно заложенному алгоритму,

- может возвращать результат в вызывающую программу.

Процедура – это любая подпрограмма, которая не является функцией.

Далее мы будем говорить только о функциях, т.к. в отличие от других языков программирования в С нет деления на подпрограммы и функции, здесь вся программа строится только из функций.

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

Самое общее определение функции таково – это совокупность объявлений и операторов, обычно предназначенная для решения определенной задачи.

Подводя итоги сказанного можно отметить, что использование функций дает много положительного:

- функции позволяют избежать дублирования кода в одной программе. Кроме того, несколько программ могут совместно использовать код функции,

- программы легче читаются, т.к. детали работы «скрыты» внутри функции,

- программы приобретают структуру, и это облегчает работу над текстом при программировании и отладке в процессе разработки и в дальнейшем при внесении изменений в программу.

  1. Объявление и определение функций

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

Функция – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.

Любая программа на С++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно. Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.

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

[класс] тип имя ([список_параметров]) [throw (исключения)]

{ тело функции}

Рассмотрим составные части определения.

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

extern – глобальная видимость во всех модулях программы (по умолчанию),

static – видимость только в пределах модуля, в котором определена функция.

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

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

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

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

Наиболее часто встречающееся определение функции выглядит т.о.:

тип имя_функции (тип имя_параметра_1, тип имя_параметра_2, …)

{тело функции};

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

Пример 1. Функция находит максимальное значение из двух целых чисел а и b и возвращает его в точку вызова.

// определение функции max

int max (int a, int b) // a, b – формальные параметры

{ int r; //тело функции

if (a>=b) r=a; else r=b;

return (r); // возврат результата

}

// основная программа

void main()

{int x, y, big;

printf(“\n x=”); scanf(“%d”, &x);

printf(“\n y=”); scanf(“%d”, &y);

big = max(x, y); //вызов функции max, х, у – фактические параметры

printf(“big = %d \n”, big);

}

Функция max(…) имеет два формальных параметра типа int – a и b и возвращаемое значение типа int. При вызове функции ей передаются фактические параметры (х и у), в теле функции определена локальная переменная r для хранения и возврата результата. После выполнения функции результат находится справа от знака = в выражении big = max(x, y), на месте выражения max(x, y), поэтому говорят, что результат передан в точку вызова.

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

Функцию можно определить как встроенную с помощью модификатора inline, который рекомендует компилятору вместо обращения к функции помещать ее код непосредственно в каждую точку вызова. Модификатор inline ставится перед типом функции. Он применяется для коротких функций, чтобы снизить накладные расходы на вызов (сохранение и восстановление регистров, передача управления). Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности. Использование inline –функций может увеличить объем выполняемой программы. Определение функций должно предшествовать ее вызовам, иначе вместо inline – расширения компилятор сгенерирует обычный вызов.

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