Функции и процедуры
Функции в программировании совсем незначительно отличаются от функций в математике. И там, и там нам нужен аргумент и возращаемое значение. Но не всё так просто.
Также существуют процедуры - блоки кода, не возращающие никакого значения, также могут не принимать аргументы.
Общий вид функции таков:
Процедуры
Процедуры в языке C++ имеют тип void. Создадим процедуру, печатающую приветствие:
Вызываем данную процедуру в главной функции main:
Теперь создадим процедуру, которая будет печатать приветствие заданное число раз.
n - аргумент данной процедуры.
В функции main вызываем процедуру и указываем в скобках параметры:
Таким образом, процедура hello печатает приветствии на экран 5 раз.
Функции
Функция, в отличие от процедуры, должна иметь тип возвращаемого значения. Например, нам потребовалась функция возведения в квадрат:
Здесь int - это тип возвращаемого значения, а return - это сам возврат.
В функции main:
Данный код возвел 13 в квадрат.
Также можем придумать что-то интересное:
Аргументы функции
В качестве аргумента мы можем использовать значение по умолчанию:
Данная функция вычисляет энергию по известному закону: \(E = mc^2\).
В качестве аргументов функции иогут выступать любые типы данных, в том числе и определенные пользователем.
- Перадача массива в функцию. Допустим, что перед нами поставили задачу: написать функцию, которая примет массив как аргумент и вернет среднее арифметическое его элементов. Чтобы передать массив в функцию, нужно передать указатель на первый элемент массива и размер самого массива. Вот так реализуется наша функция:
Рекурсия
Важным понятием в программировании является рекурсия. Рекурсия - это когда функция вызывает сама себя. Классическим примером рекурсии является факториал, когда значение умножениется на значение функции, уменьшенное на единицу, и так до 1. В данном случае 1 - базовый случай рекурсии. Базовый случай - это значение, которое должно остановить рекурсию. Если базовый случай отсутствует, мы получим бесконечную рекурсию.
Вычисление факториала:
Встроенные в язык функции
Вы наверняка уже встречались с функциями, встроенными в C++. Рассмотрим самые полезные и важные:
Рандом
rand() - это функция псевдослучайных чисел. Почему псевдослучайных? Потому, что при каждом запуске она будет генерировать одни и те же значения. Для того, чтобы пользоваться рандомом, подключаем библиотеку
Заполним массив псевдослучайными числами при помощи rand():
Как можем заметить, при каждом запуске числа не меняются. Что же делать?
Выход есть! Используем высококачественный генератор случайных чисел - mt19937 rndm. Этот генератор основан на вихре Марсенна. Чтобы его использовать нам нужно зерно генерации. В качестве зерна можем использовать время, для этого подключаем
Теперь уже больше походит на генерацию случайных чисел!
Стиль программирования и функции
Кака правило, оформление кода выше (когда функция пишется сразу после прототипа) подходит для маленьких проектов. Однако на практике такой подход не применяется. В больших проектах сначала пишется прототип функции - объявление функции без тела:
Уже после главной функции мы пишем полную функцию с телом:
Таким образом весь наш файл main.cpp выглядит следующим образом:
В дальнейшем, когда мы будем пробовать писать собственные классы, мы будем все объявления хранить в заголовочном файле, а определения в другом файле. Таким образом, наш проект будет состоять из трех файлов: Header.h, Definition.cpp и main.cpp.
Стиль программирования, является не требованием, а пожеланием, потому что чистый, структурированный код улучшает его понимание другими людьми, и способствует более продуктивной работе. Поэтому в сообществе программистов были приняты некоторые соглашения касательно правил написания кода.