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

Int factorial(int n) {

int result = 1;

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

result *= i;

}

return result;

}

Заметим теперь, что факториал можно задать двумя формулами: 0!=1 и N!=N*(N-1)! В данном случае значение задается только для минимального N, т.е. для 0, а для остальных значения функция определяется через предыдущее значение N. Например, 6!=6*5! Используя данные соотношения функцию вычисления факториала можно модифицировать:

Int factorial(int n) {

if (n==0) {

return 1;

} else {

return n*factorial(n-1);

}

}

Можно также воспользоваться оператором ?: и сократить размер функции:

Int factorial(int n) {

return n==0 ? 1 : n*factorial(n-1);

}

Обратите внимание на то, что такая реализация не использует цикл, зато она вызывает сама себя: n*factorial(n-1).

Прототипы функций

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

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

Int main() {

cout << average(1.2,3.4,5.6);

}

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

return (x+y+z)/3;

}

Создание заголовочного файла

Мы уже сталкивались с заголовочными файлами, когда подключали библиотеку stdio.h для работы с функциями ввода/вывода или библиотеку stdlib.h для работы с функцией rand() для генерации псевдослучайных чисел. Эти функции были кем-то реализованы, и любой программист может их использовать. Другими словами, функция написана один раз, а использована она может быть использована много раз и в разных программах.

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

  • создать файл с расширением .h;

  • поместить в него необходимые функции;

  • подключить файл в программе;

  • вызвать требующуюся функцию.

Реализация функций в компактном виде

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

Рассмотрим функцию, которая проверяет, является ли число четным:

bool isEven(int n) {

if (n%2==0) {

return true;

} else {

return false;

}

}

Обратите внимание на то, что, если убрать ветку else, то работа функции не изменится, поскольку оператор return останавливает работу функции:

bool isEven(int n) {

if (n%2==0) {

return true;

}

return false;

}

Еще сократить код можно при помощи оператора ?::

bool isEven(int n) {

return n%2==0 ? true : false;

}

Однако оптимальный вариант выглядит так:

bool isEven(int n) {

return n%2 == 0;

}

Посмотрите, какой длинной программа была в начале, и какой компактной она стала в конце!

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

int max(int m, int n) {

if (m>n) {

return m;

} else {

return n;

}

}

Сократить код можно так:

int max(int m,int n) {

return m>n ? m : n;

}

Еще один пример, использующий то, что оператор return прерывает работу функции, – это поиск элемента в массиве. Он может быть реализован так: