Функции
Когда программа растёт, один длинный 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 считает сумму массива | функция считает сумму, среднее, максимум и печатает отчёт |
Практика
- Напишите процедуру
hello, которая выводитHello. - Напишите функцию
add, которая возвращает сумму двух чисел. - Напишите функцию
max, которая возвращает большее из двух чисел. - Напишите функцию
total, которая считает сумму массива. - Разделите длинный
mainна две подпрограммы.
Проверьте себя
- Почему
mainтоже функция? - Чем процедура
voidотличается от функции с результатом? - Что такое параметр?
- Что делает
return? - Почему функцию нужно объявить до вызова?
- Почему вместе с массивом передают размер?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
| Термин | Значение |
|---|---|
| подпрограмма | учебное общее слово для отдельного блока с именем |
| функция | подпрограмма C++ с типом результата |
| процедура | учебное название функции void без результата |
| параметр | входное значение функции |
| вызов | запуск функции по имени |
return | возврат результата или завершение функции |
Связанные темы
- Циклы — повторение внутри функции.
- Массивы — передача набора значений.
- Классы — функции внутри класса называют методами.
Источники
- C++ Working Draft. Functions: https://eel.is/c++draft/dcl.fct
- Microsoft Learn. Functions: https://learn.microsoft.com/en-us/cpp/cpp/functions-cpp