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

10

ФУНКЦИИ В С++

Описание функции. Создание функции. Вызов функции.

Все С++ - функции имеют общий формат:

тип_возвращаемого_значения имя (список_параметров)

{

. . . // Тело функции

}

// Описание в списке параметров

float myfunc(float a, float b, int с)

{ float k;

if (a < b)

k = b;

else

k = a;

return k*с;

}

Рассмотрим простой пример, который содержит две функции: main() и myfunc()

/* Эта программа содержит две функции: main() и myfunc() */

#include <iostream>

float myfunc(float a, float b, int с);

// Прототип функции myfunc()

int main()

{std::

cout << "В функции main().\n";

float a = 2.5;

float b = 3.6;

int c = 2;

float s;

s = myfunc(a,b,c); // Вызываем функцию myfunc()

cout << "Снова в функции main().\n";

return 0; }

// Определение функции myfunc().

float myfunc(float a, float b, int с)

{

float k;

if (a < b)

k = b;

else

k = a;

return k*с;

}

Программа работает следующим образом:

  1. Вызывается функция main() и выполняется ее первая сout-инструкция.

  2. Объявляются и инициализируются переменные a, b, c и объявляется переменная s.

  3. Из функции main() вызыва­ется функция myfunc() и ей передаются переменные a, b, c в качестве аргументов.

  4. Функция myfunc() выполняет свои инструкции, а возвращаемое из функции значение присваивается переменной s.

  5. Затем после выхода из функции передается управ­ление назад функции main(): той строке кода, которая расположена не­посредственно за вызовом функции.

  6. Наконец, функция main() выполняет свою вторую cout-инструкцию, которая завершает всю программу.

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

В этой программе инструкция float myfunc (float a, float b, int с); — прототип функции myfunc().

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

В C++ функции, не возвращающие значений, объяв­ляются с использованием ключевого слова void.

Использование аргументов

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

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

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

void box(int length, int width, int height)

{

cout << "Объем параллелепипеда равен" << length*width*height << "\n";

}

В общем случае при каждом вызове функции box будет вычислен объем параллелепипеда путем умножения значений, переданных ее параметрам leng­th, width и height.

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

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

box(7,20,4);

box (50,3,2};

Каждый из аргументов копируется в соответствующий параметр. Так, при первом вызове функции box() число 7 копируется в параметр length, 20 –в параметр width, a 4 — в параметр height.

Использование функции box демонстрируется в следующей программе .

//Программа демонстрации использования функции box

#include <iostream>

void box(int length, int width, int height);// Прототип

//функции box

Int main()

{

box(7, 20, 4); // Передача аргументов функции box

box (50, 3, 2);

box (8, 6, 9);

return 0;

}

// Вычисление объема параллелепипеда.

void box(int length, int width, int height) /*Параметры принимают значения аргумен­тов, переданных функции box*/

{

cout << "Объем параллелепипеда равен "

<< length * width * height << "\n"; }

При выполнении программа генерирует такие результаты.

Объем параллелепипеда равен 560

Объем параллелепипеда равен 300

Объем параллелепипеда равен 432

Примечание.

Термин аргумент относится к значению, которое ис­пользуется при вызове функции.

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

Использование инструкции return

Инструкция return имеет две формы применения:

  • первая позволяет возвра­щать значение

  • вторая — нет

Версия инструкции return, которая не возвращает значение

Если тип значения, возвращаемого функцией, определяет­ся ключевым словом void (т.е. функция не возвращает значения вообще), то для выхода из функции достаточно использовать такую форму инструкции return:

return;

При обнаружении инструкции return управление программой немедленно передается инициатору ее вызова. Любой код в функции, расположенный за ин­струкцией return, игнорируется.

Рассмотрим пример.

// Использование инструкции return

#include <iostream>

void f() ;

Int main() {

cout << "До вызова функции.\n";

f();

cout << "После вызова функции.\n";

return 0; }

// Определение void-функции, которая использует инструкцию return.

void f()

{

cout << "В функции f().\n";

return; // Немедленное возвращение к инициатору вызова

// без выполнения следующей cout-инструкции

cout <<"Этот текст не будет отображен. \n";

}

Вот как выглядят результаты выполнения этой программы.

До вызова функции.

В функции f().

После вызова функции.

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

float myfunc(float a, float b, int с)

{

if (a < b)

return b*c;

else

return a*с;

}

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

Версия инструкции return, которая возвращает значение

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

return значение;

Эту форму инструкции return нельзя использовать с void-функци­ями.

Важно!!! Функция, которая возвращает значение, должна определить тип этого значе­ния. Тип возвращаемого значения должен быть совместимым с типом данных, используемых в инструкции return. В противном случае неминуема ошибка во время компиляции программы. Функция может возвращать данные любого до­пустимого в C++ типа, за исключением массива.!!!

Чтобы проиллюстрировать процесс возврата функцией значений, перепишем уже известную функцию box. В этой версии функция box возвращает объем параллелепипеда: переменной answer, расположен­ной с левой стороны, присваивается значение, возвращаемое функцией.

// Возврат значения.

#include <iostream>

int box(int length, int width, int height); // Функция

// возвращает объем параллелепипеда.