Что такое функции и зачем они нужны?
При написании больших программ программисты сталкиваются с повторением фрагментов кода, это вполне нормальное явление, но оно мешает поддерживать код в дальнейшем, а также значительно увеличивает количество строк кода, что является не лучшем показателем программиста.
Предположим у нас есть определённый фрагмент кода отвечающий за вычисление факториала.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //нужно для русского языка int faktorial = 1; //задаём первоначальное значение равное единице, так как любое умножение на ноль даёт ноль int chisl = 9; //задаём число, факториал которого будем искать for (int i = 1; i <= chisl; i++) { //цикл начинается с единицы, так как на ноль умножать нельзя faktorial = faktorial * i; //записываем новый результат вычисления в ту же переменную, таким образом постоянно увеличиваем переменную } std::cout << "Факториал числа " << chisl << " равен: " << faktorial << std::endl; //выводим результат на экран system("pause"); return 0; } |
В ходе написания кода нам необходимо вычислять этот самый факториал, предположим, 15 раз. 15 раз прописывать один и тот же код? А как будем вносить правки во фрагмент вычисляющий факториал? Переписывать все 15 фрагментов? Программист — существо ленивое…
Таким образом на свет админский появились функции.
Функции — это блоки содержащие в себе повторяющийся код программы
Рассмотрим всё то же вычисление факториала. Для того, чтобы его вычислить согласно формуле, нам необходимо в переменную задать наше число. У функций существует понятие аргументов и параметров.
Аргументы функции — это переменные, которые передаются в функцию.
Параметры функции — это переменные, которые функция должна принимать.
Для того, чтобы начать писать свои функции, нужно понять их синтаксис.
Для того, чтобы использовать функцию в основном коде, нам необходимо вызывать функцию по её имени.
Сначала прописывается тип функции, потом имя, по которому мы будем её вызывать, в круглых скобках указываются принимаемые параметры, после ставятся фигурные скобки, содержимое внутри которых является телом функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> int faktorial_funtion(int chislo) { //функция int temp_faktoial = 1; //на ноль умножать нельзя for (int i = 1; i <= chislo; i++) { //цикл начинается с единицы, так как на ноль умножать нельзя temp_faktoial = temp_faktoial * i; //записываем новый результат вычисления в ту же переменную, таким образом постоянно увеличиваем переменную } return temp_faktoial; //возвращаем (присваиваем) полученный результат в переменную, для которой мы вызвали функцию } int main() { setlocale(LC_ALL, "Russian"); int chisl = 9; //указываем факториал какого числа нам нужен int faktorial = faktorial_funtion(chisl); //в переменную присваиваем значение факториала, для этого //вызываем нужную функцию и передаём ей аргумент (число, для которого нужен факториал) std::cout << "Факториал числа " << chisl << " равен: " << faktorial << std::endl; //выводим результат на экран system("pause"); return 0; } |
Соберём в кучу: функция это блок ограниченный от остального кода, выполняющий определённую чётко поставленную задачу исходя из полученных аргументов.
После того, как функция выполнила свою задачу (например, посчитала факториал), нам нужно получить результат вычислений. Так как это ограниченный блок, то нам необходимо вернуть значение, то есть вернуть наш результат. Здесь нам помогает return temp_faktorial. Если функция типа не void, то она обязательно должна что-нибудь возвращать.
Функция может возвращать значение, а может и не возвращаться, всё зависит от типа функции. Типы точно такие же, как и у переменных. Если Вы забыли типы языка C++ — вспомните их.
Все ранее нам известные типы позволяют вернуть от функции значение (то есть, получить результат их деятельности, но этот результат нужно присвоить какой-то переменной). Скажем, нам нужно, чтобы функция просто вывела на экран, скажем 50 звёздочек (можно использовать в качестве разделителя при выводе на экран результатов программы), что делать? Возвращать как число или символ — дурацкая затея. Здесь нам поможет тип void, он не имеет диапазона, да и вообще на самом деле это довольно туманная фигура. Если у функции тип void, то она не сможет возвращать значение, а значит с её помощью мы можем организовать вывод на экран чего угодно. В случае, когда нам не нужно делать нечто сложное, аргументы можно не передавать, а функцию оставить без параметров.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> void zvezda_50() { //функция std::cout << '\n'; //делаем отступ сверху for (int i = 0; i < 100; i++) { //циклом организуем вывод сотни звёздочек std::cout << '*'; //выводим одну звезду за один проход } std::cout << '\n'; //по завершению вывода ста звёзд, делаем отступ снизу } int main() { setlocale(LC_ALL, "Russian"); zvezda_50(); //вызываем функцию, которая ничего не возвращает system("pause"); return 0; } |
Теперь, вместо того, чтобы вносить 15 правок в формулу, мы ищем нашу функцию и вносим поправку. Таким образом, везде, где используется вычисление факториала (или любой другой функции), будут внесены необходимые изменения.
Написание фрагментов кода в виде функций называется процедурным подходом программирования.
Таким нехитрым образом мы познакомились с функциями языка C++ 🙂