Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТ...docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
695.51 Кб
Скачать

3. Способы передачи параметров внутрь функций

Во всех рассмотренных до сих пор примерах параметры функций

передавались по значению. При вызове из функции "main()" вызываемой

функции передаются копии указанных переменных. Например, в программе

1 функции "area(...)" передаются текущие значения переменных "this_length" и

"this_width". Затем функция "area(...)" сохраняет переданные значения в

собственных локальных переменных, и именно эти переменные участвуют в

последующих вычислениях внутри функции.

3.1 Передача параметров по значению

Функции, принимающие параметры по значению, "безопасны" в том

смысле, что они не могут случайно изменить переменные вызывающей

функции (т.е. у функций нет скрытых побочных эффектов). Большинство

функций проектируются именно таким образом.

Программа 5.2 поясняет, почему важно гарантировать "сохранность"

переменных вызывающей функции. Эта программа должна выводить на

экран факториал и корень из числа, введенного пользователем:

Введите положительное число:

4

Факториал 4! равен 24, а квадратный корень из 4 равен 2.

Для извлечения квадратного корня применяется библиотечная

функция "sqrt(...)". Библиотечной функции для вычисления факториала нет,

поэтому придется написать собственную функцию (вычисляющую для

любого положительного целого числа n значение n!=(1*2*3*...*n)).

#include<iostream.h>

#include<math.h>

int factorial(int number);

// ГЛАВНАЯ ФУНКЦИЯ:

void main()

{

int whole_number;

cout << "Введите положительное число:\n";

cin >> whole_number;

cout << "Факториал " << whole_number << "! равен ";

cout << factorial(whole_number);

cout << ", а квадратный корень из " << whole_number;

cout << " равен " << sqrt(whole_number) << ".\n";

}

// КОНЕЦ ГЛАВНОЙ ФУНКЦИИ

// ФУНКЦИЯ ДЛЯ ВЫЧИСЛЕНИЯ ФАКТОРИАЛА:

int factorial(int number)

{

int product = 1;

for ( ; number > 0 ; number--)

product *= number;

return product;

}

// КОНЕЦ ФУНКЦИИ

Программа 5.2

Если бы функция "factorial(...)" изменяла переменную вызывающей

функции, то программа 5.2 выдавала бы следующий ответ (формально

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

Введите положительное число:

4

Факториал 4! равен 24, а квадратный корень из 0 равен 0.

3.2 Передача параметров по ссылке

Все-таки иногда бывает необходимо, чтобы функция изменила

значение переданного ей параметра. Рассмотрим программу 5.1. С 10-й по

14-ю строку в ней выполняется запрос размеров прямоугольника, а затем

вычисляется его площадь.

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

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

данных от пользователя создадим функцию "get_dimensions". В __________данном

случае необходимо, чтобы эта функция изменяла значения переменных

"this_length" и "this_width" (переданных ей в качестве параметров) – помещала в

них значения, введенные пользователем с клавиатуры. Изменение

параметров функции возможно при передаче параметров по ссылке. У

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

символ "&".

#include<iostream.h>

int area( int length, int width );

void get_dimensions( int& length, int& width );

// ГЛАВНАЯ ФУНКЦИЯ:

void main()

{

int this_length, this_width;

get_dimensions( this_length, this_width );

cout << "Площадь прямоугольника с размерами ";

cout << this_length << "x" << this_width;

cout << " равна " << area( this_length, this_width ) << "\n";

}

// КОНЕЦ ГЛАВНОЙ ФУНКЦИИ

// ФУНКЦИЯ ВВОДА РАЗМЕРОВ ПРЯМОУГОЛЬНИКА:

void get_dimensions( int& length, int& width )

{

cout << "Введите длину: ";

cin >> length;

cout << "Введите ширину: ";

cin >> width;

cout << "\n";

}

// КОНЕЦ ФУНКЦИИ

// ФУНКЦИЯ ВЫЧИСЛЕНИЯ ПЛОЩАДИ:

int area( int length, int width )

{

return length*width;

}

// КОНЕЦ ФУНКЦИИ

Программа 5.3

Функция "get_dimensions" изменяет значения параметров "this_length" и

"this_width", но не возвращает никакого значения (т.е. не является "функцией"

в математическом смысле). Этот факт отражается и в прототипе, и в

определении функции – в качестве возвращаемого значения указан тип

"void" ("пустой" тип).