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

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" ("пустой" тип).