Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции за I семестр конспект Гуревича для C++ B....doc
Скачиваний:
11
Добавлен:
21.11.2018
Размер:
1.3 Mб
Скачать

13.1. Сущность и предназначение функций.

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

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

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

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

Разделение программы на максимально обособленные части (подпрограммы) является довольно сложной задачей, которая должна решаться на этапе проектирования программы.

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

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

"Основная часть" программы в языке Си также считается функцией - функцией main (основная, главная), с которой и начинается выполнение программы. Функциями являются и обработчики событий (например, Button1Click) в оконных приложениях. Таким образом, любая программа на языке Cи состоит из функций.

13.2. Определение и вызов функции.

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

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

{

код функции

return выражение;

}

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

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

имя_функции (список аргументов);

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

Пример:

Функция, определяющей наименьшее значение из двух целочисленных переменных:

int Min (int x, int y)

{

return x<y ? x : y;

}

Вызов такой функции может иметь вид:

int a,b,c;

...

a=Min(b,c);

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

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

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

Заметим, что в списке параметров перед каждым параметром нужно непосредственно указывать его тип - нельзя, например, писать (double x, y), а нужно писать (double x, double y).

Функция может не иметь параметров, но круглые скобки необходимы в любом случае (и в определении, и в вызове). Если у функции отсутствует список параметров, то при декларации такой функции можно (для наглядности) в круглых скобках указать тип void ("пустой"). Например, main(void){ ... }.

Тип результата определяет тип выражения, значение которого возвращается в точку вызова функции при помощи оператора возврата return выражение; Выражение, указанное в операторе return, преобразуется к типу_результата, указанному в заголовке функции, и передается в точку вызова. Чтобы в точке вызова использовать полученное значение результата, этот вызов должен находиться в составе какого-либо оператора (например, оператора присваивания, либо любого другого, аналогично использованию стандартных функций языка Си).

Тип возвращаемого функцией значения может быть любым базовым типом, а также указателем на массив или функцию (см. тему "Указатели"). Если функция не должна возвращать значение, указывается тип void ("пустой"). В данном случае оператор return можно не ставить. Из функции, которая не описана как void, необходимо возвращать значение, используя оператор return. Если тип функции не указан, то по умолчанию устанавливается тип int.

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

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

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

Заметим, что вызов функции называют также обращением к функции. Иногда параметры функции называют формальными параметрами, а аргументы - фактическими параметрами.

Задача 1. Вычислить выражение

#include<iostream.h>

#include<conio.h>

double fact(int m) { // Хотя факториал - целое число,

double f=1; int i; // используем тип double, т.к.

for (i=1; i<=m; i++) f*=i; // результат может выйти за пределы

return f; // диапазона типа int

}

void main(){

int N,K; double D;

cout<<"Vvedite N,K :";

cin>>N>>K;

D=fact(N)+fact(K)+fact(N+K);

cout<<D<<endl;

getch();

}

Задача 2. Вычислить синус, косинус, тангенс и котангенс введенного числа. Каждое вычисленное значение выводить в отдельной строке, а перед ним - строку из звездочек.

#include<iostream.h>

#include<conio.h>

#include<math.h>

void st(void){ cout<<"\n***********************************\n "; }

void main(){

double x;

cout<<"Vvedite x :";

cin>>x;

st();

cout<<"sin="<<sin(x);

st();

cout<<"cos="<<cos(x);

st();

cout<<"tg="<<tan(x);

st();

cout<<"ctg="<<1/tan(x)<<endl;

getch();

}

Результат работы программы (подчеркнуто число, введенное человеком):

Vvedite x :

3

***********************************

sin=0.14112

***********************************

cos=-0.989992

***********************************

tg=-0.142547

***********************************

ctg=-7.015253