Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

18. Функции

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

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

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

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

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

3. Если подпрограмма может потребоваться в дальнейшем.

18.1. Определение функции в языке с

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

Формат определения функции:

[тип_возвращаемого_значения] имя_функции (список_параметров) {

описание данных

операторы

[return выражение;]

}

Рассмотрим, например, функцию, которая вычисляет сумму двух целых чисел:

int sum(int a, int b) {

int s;

s = a+b;

return s;

}

Сначала указан тип значения, которое функция возвращает, – int. Затем после пробела следует имя функции – идентификатор, составленный по тем же правилам, что и для имен переменных. Имя функции должно отражать то, что функция делает! После имени функции в круглых скобках перечислены формальные параметры функции с указанием их типов. В нашей функции это a типа int и b типа int.

После круглых скобок со списком формальных параметров в фигурных скобках следует блок с операторами функции.

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

Обратить внимание! Нельзя ставить точку с запятой после main(). Нельзя опускать круглые скобки после main. Это касается всех функций!

Обратить внимание! В языке С запрещено определять одну функцию внутри другой (в теле другой функции).

18.2. Возвращение значений из функции

Поле [тип_возвращаемого_значения] задает тип возвращаемого функцией значения. Если оно отстутствует, считается, что функция возвращает значение типа int. Если тип возвращаемого значения задан как void, считается, что функция не возвращает никакого значения (это по сути своей процедура).

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

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

Задача. Написать функцию для нахождения минимума из двух целых чисел.

int min(int a, int b) {   int m;

if (a < b) m = a; // m = a;

else m = b; // if (b < a) m = b;   return m; }

Задача. Написать функцию для определения, есть ли в массиве заданное число (1 – есть, 0 – нет).

int find(int m[10], int k) {   int i, p = 0;

for (i=0; i<10; i++)

if (m[i] == k) {

p = 1;

break;

}   return p; }

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

int min(int a, int b) {   if (a < b) return a;   return b; }

int find(int m[10], int k) {   int i;

for (i=0; i<10; i++)

if (m[i] == k) return 1;   return 0; }

В операторе return можно записывать выражения. Тогда вернется результат вычисления выражения:

int sum(int a, int b) {   return a+b; }

int min(int a, int b) {   return a<b ? a : b; }

После слова return можно ничего не записывать. В этом случае вызвавшей функции никакого значения не передается (тип возвращаемого значения void).

void f() {   ...   return; // можно опустить }

Если с помощью return ничего не возвращается, его писать не обязательно.

Управление передается вызвавшей функции и при выходе «по концу» (последняя закрывающая фигурная скобка).

Но бывают ситуации, когда оператор return без значения полезен.

Задача. Поменять знак у элементов массива до первого 0. Если 0 нет, то во всем массиве.

void negative(int m[5]) {

int i;

for (i=0; i<5 && m[i]!=0; i++)

m[i] = -m[i];

return; // можно опустить

}

void negative(int m[5]) {

int i;

for (i=0; i<5; i++) {

if (m[i] == 0) return; // if (!m[i]) return;

m[i] = -m[i];

}

return; // можно опустить

}

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

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

По стандарту языка С функция main() возвращает значение типа int, поэтому правильнее будет писать так:

int main(){

...

return 0;

}

Функция main() – главная в программе. Она возвращает значение тому, кто главнее ее, т. е. запустившей ее ОС.

В то же время использовать void main(){} также можно.