Перейти к основному содержимому

Функции

Данные входят в подпрограмму, внутри выполняются команды, наружу выходит результат

Когда программа растёт, один длинный main становится трудно читать. Повторяющиеся действия выносят в отдельные подпрограммы. Это помогает дать действию имя и проверять его отдельно.

Коротко

В школьной речи часто говорят «подпрограмма». В C++ обычно говорят «функция». Процедурой удобно называть функцию с типом void, которая выполняет действие, но не возвращает значение.

main тоже функция

int main() {
return 0;
}

main — главная функция программы. Она возвращает целое число. Значение 0 обычно означает успешное завершение.

Процедура void

Процедура выполняет действие и ничего не возвращает.

#include <iostream>
using namespace std;

void hello() {
cout << "Hello" << endl;
}

int main() {
hello();
hello();
return 0;
}

Вывод:

Hello
Hello

Строка hello(); вызывает подпрограмму.

Функция с результатом

#include <iostream>
using namespace std;

int add(int a, int b) {
int sum = 0;
sum = a + b;
return sum;
}

int main() {
int x = 0;
x = add(3, 4);
cout << x << endl;
return 0;
}

Функция add получает два числа и возвращает результат через return.

Параметры

Параметры — это входные данные функции.

#include <iostream>
using namespace std;

void print(int x) {
cout << x << endl;
}

int main() {
print(10);
print(20);
return 0;
}

При каждом вызове параметр x получает новое значение.

Объявление до вызова

Компилятор должен узнать о функции до её вызова. Можно написать функцию выше main, как в прошлых примерах. А можно дать объявление заранее:

#include <iostream>
using namespace std;

int add(int a, int b);

int main() {
cout << add(2, 5) << endl;
return 0;
}

int add(int a, int b) {
return a + b;
}

Первая строка int add(int a, int b); обещает, что такая функция будет дальше.

Функция и массив

После уроков про массивы и циклы можно передать массив в функцию. Размер передаём отдельно.

#include <iostream>
using namespace std;

int total(int a[], int n) {
int sum = 0;
int i = 0;

for (i = 0; i < n; i++) {
sum = sum + a[i];
}

return sum;
}

int main() {
int a[3] = {10, 20, 30};
cout << total(a, 3) << endl;
return 0;
}

Функция не узнаёт размер массива сама. Поэтому рядом с массивом передают n.

Простое правило проектирования

Одна функция должна делать одно понятное действие:

ХорошоСлишком много в одной функции
add считает суммуread_check_print_save делает всё сразу
print выводит числофункция одновременно вводит, считает и меняет режим
total считает сумму массивафункция считает сумму, среднее, максимум и печатает отчёт

Практика

  1. Напишите процедуру hello, которая выводит Hello.
  2. Напишите функцию add, которая возвращает сумму двух чисел.
  3. Напишите функцию max, которая возвращает большее из двух чисел.
  4. Напишите функцию total, которая считает сумму массива.
  5. Разделите длинный main на две подпрограммы.

Проверьте себя

  1. Почему main тоже функция?
  2. Чем процедура void отличается от функции с результатом?
  3. Что такое параметр?
  4. Что делает return?
  5. Почему функцию нужно объявить до вызова?
  6. Почему вместе с массивом передают размер?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

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

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

ТерминЗначение
подпрограммаучебное общее слово для отдельного блока с именем
функцияподпрограмма C++ с типом результата
процедураучебное название функции void без результата
параметрвходное значение функции
вызовзапуск функции по имени
returnвозврат результата или завершение функции

Связанные темы

  • Циклы — повторение внутри функции.
  • Массивы — передача набора значений.
  • Классы — функции внутри класса называют методами.

Источники