 
        
        - •Тема 5. Функции Зачем нужны функции?
- •Определение и вызов функции
- •Void say_hello() {
- •Int main() {
- •Void printNumbers(int numbers[], int size) {
- •Int summa(int y) {
- •Int summa_version2(int y) {
- •Int summa(int a, int b) {
- •Int main() {
- •Void say_hello() {
- •Int main() {
- •Void say_hello();
- •Int factorial(int n) {
- •Int factorial(int n) {
- •Int factorial(int n) {
- •Int main() {
- •Реализация функций в компактном виде
- •Int indexOf(int element) {
- •Правильное проектирование функций
- •Void initNumbers(int numbers[], int size);
- •Примеры решения задач
- •Void printMark(int mark) {
- •Int main() {
- •Int main() {
- •Int main() {
Примеры решения задач
Задача 1. Создайте процедуру, которая принимает в качестве аргумента оценку и выводит её словесный эквивалент.
Void printMark(int mark) {
switch (mark) {
case 5 : cout << "Отлично\n"; break;
case 4 : cout << "Хорошо\n"; break;
case 3 : cout << "Удовл.\n"; break;
case 2 : cout << "Неуд.\n"; break;
case 1 : cout << "Кол\n"; break;
default : cout << "Нет такой оценки\n";
}
}
Int main() {
printMark(4);
printMark(1);
printMark(13);
return 0;
}
Задача 2. Создайте функцию, которая принимает в качестве аргументов длины двух катетов прямоугольного треугольника и возвращает длину гипотенузы.
float sqr(float x) {
return x*x;
}
float hyp(float catet1, float catet2) {
return sqrt(sqr(catet1) + sqr(catet2));
}
Int main() {
setlocale(LC_ALL, "Russian");
cout << hyp(3,4) << endl;
cout << hyp(3.5,4.2) << endl;
cout << hyp(1.4,10) << endl;
return 0;
}
Задача 3. Два натуральных числа называются взаимно простыми, если единственным общим делителем у них является 1. Напишите функцию, которая принимает два целочисленных аргумента и возвращает true, если они – взаимно простые, и false – иначе.
bool isCoprime(int m, int n) {
int min = m<n ? m : n;
for (int i=2; i<=min; i++) {
if (m%i==0 && n%i==0) {
return false;
}
}
return true;
}
Int main() {
for (int i=1; i<=20; i++) {
if (isCoprime(i,20)) {
cout << i << endl;
}
}
return 0;
}
Задача 4. Создайте рекурсивную и нерекурсивную функцию, которая принимает положительный целочисленный аргумент и возвращает факториал этого числа. Факториал числа N обозначается через N! и равен произведению чисел от 1 до N. По определению также полагается 0!=1.
int factorial(int n) {
return n==0 ? 1 : n*factorial(n-1);
}
int nrec_factorial(int n) {
int result = 1;
for (int i=1; i<=n; i++) {
result *= i;
}
return result;
}
int main() {
cout << factorial(0) << endl;
cout << nrec_factorial(0) << endl;
cout << factorial(3) << endl;
cout << nrec_factorial(3) << endl;
return 0;
}
Задача 5. Создайте функцию, которая принимает в качестве аргумента целое число и возвращает количество цифр в нём.
int n_digits(int n) {
int result = 0;
int t=n;
while (t>0) {
t /= 10;
result++;
}
return result;
}
int main() {
cout << n_digits(2) << endl;
cout << n_digits(23) << endl;
cout << n_digits(999) << endl;
cout << n_digits(1000) << endl;
return 0;
}
КОНТРОЛЬНЫЕ ВОПРОСЫ
- Зачем нужны функции? 
- Что такое аргументы функции? 
- Что такое формальные и фактические аргументы? 
- Чем отличаются глобальные переменные от локальных? 
- Объясните работу оператора return. 
- Чем концептуально отличаются функции от процедур? 
- Что такое рекурсивная функция? Приведите примеры. 
- Что такое прототип функции? Приведите примеры. 
- Что такое заголовочный файл и как с ним работать? 
- Как передавать одномерные и двумерные массивы в качестве аргументов функций? Приведите пример. 
- Правило хорошего стиля при разработке функций заключается в том, что функция должна решать равно одну задачу, и название функции должно отражать суть этой задачи. Приведите примеры функций, которые согласуются и не согласуются с этим правилом. 
