Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

§ 3. Функции с одним результатом. Оператор return

Пример. Ввести последовательность целых чисел, пока не введём 0 (нуль). Для каждого из них найти и вывести сумму составляющих это число десятичных цифр.

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

  1. Какие функции, для каких целей будем составлять? Может быть несколько вариантов ответа на такой вопрос. Для определённости составим функцию для вычисления суммы десятичных цифр одного числа с именем SUMDIG. Эта функция будет вызываться в цикле несколько раз для каждого введённого числа.

  2. Определяем входные и выходные параметры функции, то есть что для неё дано и что функция получает. У нас дано одно (!) целое число, а не массив, и получаем сумму его цифр, то есть тоже одно (!) целое число.

  3. Составляем алгоритм функции SUMDIG и записываем его на языке C++. Для вычисления суммы цифр выделяем их в обратном порядке справа налево, используя получение остатка от деления на 10 (операция %) и целочисленное деление на 10 (операция /). Так как размерность числа может быть любой, то получается цикл с неизвестным количеством повторений. Получение цифр продолжаем, пока не получим при целочисленном делении нуль.

  4. В головной функции в цикле вводим целое число, вызываем SUMDIG и выводим результат.

int SUMDIG(int );

int main()

{ int X=1; cout<< "For exit -- 0\n\n";

while (X)

{ cin>>X;

gotoxy(30, wherey()-1);

cout<<SUMDIG(X)<<endl;

}

return 0; }

int SUMDIG (int num)

{ int s=0, dig;

while (num)

{ dig=num%10;

s+=dig;

num/=10;

} return s;

}

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

В тексте такой функции должен быть оператор вида

return выражение;

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

Особенности return:

  • как частный случай выражения, можно возвращать константу или значение одной переменной;

  • оператор может быть единственным в функции:

float MyFun1 (float x, float y)

{return x+y;

}

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

float MyFun2A (float x, float y)

{ if (x>y) return x+y;

else return x*y;

}

короче, чем

float MyFun2B (float x, float y)

{ float r;

if (x>y) r= x+y;

else r= x*y;

return r;

}

Это же можно реализовать ещё компактнее с помощью тернарной операции:

float MyFun2 (float x, float y)

{ return x>y ? x+y : x*y;

}

  • Оператор return обязателен, если возвращается одно значение, то есть в заголовке тип результата отличен от void.

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

  • в операции присваивания, например sd=SUMDIG(1234);

  • непосредственно в операторе if, не присваивая предварительно значение функции переменной (if (SUMDIG(a)>10)…), где a — переменная целого типа;

  • в операторе while, например, while (SUMDIG(a*a)!=num)

или while (SUMDIG(a*a)-num)… и других операторах;

  • при вызове другой функции в качестве фактического параметра, например, LINE2 (SUMDIG(a), 5, ‘.’); (см. 1.1, пример 2).

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