Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6 - Лекция6_Функции.docx
Скачиваний:
10
Добавлен:
31.03.2015
Размер:
61.69 Кб
Скачать

Тема 5. Функции Зачем нужны функции?

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

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

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

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

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

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

Void say_hello() {

cout << "Hello!" << endl;

cout << "Bonjour!" << endl;

cout << "Привет!" << endl;

}

int main() {

//Вызов функции

say_hello();

return 0;

}

Разберём подробно эту программу. В данном случае функция не принимает никаких аргументов и не возвращает никакого значения: она просто выполняет некоторые действия, точнее, выводит три приветствия. Фактически мы просто назвали группу из трёх команд

cout << "Hello!" << endl;

cout << "Bonjour!" << endl;

cout << "Привет!" << endl;

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

Int main() {

cout << "Hello!" << endl;

cout << "Bonjour!" << endl;

cout << "Привет!" << endl;

return 0;

}

Выполнит те же действия, что и программа

int main() {

say_hello();

return 0;

}

Заметим, что рассмотренная функция say_hello(), работает всегда одинаково. Рассмотрим теперь функцию, которая может работать по-разному от вызова к вызову. Создадим функцию, которая принимает в качестве аргумента целое число n и выводит на экран n звёздочек.

#include <iostream>

using namespace std;

void drawStars(int n) {

for (int i=1; i<=n; i++) {

cout << "*";

}

cout << endl;

}

int main() {

drawStars(10);

drawStars(2);

int x=7;

drawStars(x);

return 0;

}

Следующая функция вычисляет среднее арифметическое трех чисел и возвращает это значение

float average(float x, float y, float z) {

float sum = x+y+z;

return sum/3.0;

}

int main() {

cout << average(1,2,3) << endl;

cout << average(7,5,8) << endl;

cout << average(2,2,2) << endl;

}

Определение функции состоит из нескольких частей:

  • тип возвращаемого значения;

  • название функции;

  • формальные параметры;

  • тело функции;

  • оператор return.

Тип возвращаемого функцией значения

Тип возвращаемого значения может быть любым; в нашем примере – это float:

float average(float x, float y, float z) {

}

Указание возвращаемого типа сообщает программисту, как нужно вызывать функцию:

cout << average(12.5,56.7,66.8);

Можно также использовать запись

float avg = average(12.5,56.7,66.8);

Здесь переменная avg имеет тип float.

Название функции

Название функции – это идентификатор, поэтому оно должно подчиняться определенным правилам: состоять из букв, цифр или знака подчеркивания и начинаться с буквы или со знака подчеркивания. Название функции может быть любым в рамках данных правил, но оно должно точно указывать на ту задачу, которую решает функция. Например, если функция предназначена для сортировки массива, то подходящим названием может быть sort_array или sort, а имена типа fg, f1 или mas никак не связаны данной задачей, поэтому их использование нежелательно.

Название функции указывается при ее определении:

float average(float x, float y, float z) {

}

и при вызове:

cout << average(12.5, 56.7, 66.8);

Формальные и фактические аргументы, вызов функции

После указания имени функции в круглых скобках перечисляются формальные аргументы этой функции:

float average(float x, float y, float z) {

}

Формальные аргументы указывают на то, значения каких типов можно передать в функцию при вызове:

cout << average(12.5, 56.7, 66.8);

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

cout << average(12.5);

cout << average("1.5", 6.7, 6.8);

cout << average();

Тело функции

После указания формальных аргументов в фигурных скобках находится тело функции; здесь идут все операторы, которые должна выполнить функция:

float average(float x, float y, float z) {

float summa = x+y+z;

return summa/3;

}

Оператор return и возвращение значения функции

Для остановки работы функции и возвращения ее значения предназначен оператор return. В зависимости от функции оператор return может присутствовать один или несколько раз, а может и вовсе отсутствовать. Стандартный способ использования оператора return – это указание его в конце функции с целью возвращения ее значения; именно так сделано в нашей функции getAverage:

float average(float x, float y, float z) {

float summa = x+y+z;

return summa/3;

}

Два раза оператор return используется в следующей функции, которая определяет максимум из двух чисел:

int max(int m, int n) {

if (m>n) {

return m;

} else {

return n;

}

}

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