Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование на языке С++. Ч.1. Учебник
.pdf
9. Функции
161
Еще приведем программу, в которой функция, вычисляющая факториал, реализована рекурсивно. (Обратим внимание, что значение факториала может быть вычислено только
для чисел от 0 до 12, если использовать целочисленную пере-
int
или
long
менную типа
.)
long fact(long n)
{
if (n == 0)
return 1;
else
return n*fact(n-1);
}
int main() {
long f;
for (f = 2; f <= 12; f++)
{
cout.width(3);
cout << f;
cout.width(15);
cout << fact(f) << endl;
}
}
Результат приведен на рис. 9.2.
Рис. 9.2. Вычисление факториала рекурсивно

162
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Теперь приведем полный текст программы решения задачи (использован рекурсивный алгоритм вычисления факториала).
long fact(long n)
{
if (n == 0)
return 1;
else
return n * fact(n – 1);
}
int main() {
setlocale(LC_ALL, "Russian");
long f;
// f = 15;
int n, m, S;
n = 6; m = 3;
S = fact(n) / fact(n – m);
cout << "Сочетаний из " << n << " по " << m << " = " <<S << endl;
char q = getchar();
}
Результат:
Сочетаний из 6 по 3 = 120
А если задать значения n и m равными единице, получим
Сочетаний из 1 по 1 = 1
Следующая программа использует функцию для решения квадратного уравнения.
void root2(oat a, oat b, oat c,
oat *x1, oat *x2, bool *l)
{
oat d;
d = b*b – 4*a*c;
if (d >= 0)
{
*x1 = (-b + sqrtf(d)) / (2 * a);

9. Функции
163
*x2 = (-b – sqrtf(d)) / (2 * a); *l = !*l;
}
}
int main()
{
bool q = false;
oat t1 = 0, t2 = 0, u = 0;
oat a, b, c;
a = 1; b = -4; c = 4;
root2(a, b, c, &t1, &t2, &q);
if (q)
{
cout << "x1 = "<< t1 << " x2 = " << t2 << endl;
}
else
cout << "решения нет" << endl;
}
Программа проверена для трех случаев:
1) a = 1, b = –3, c = 2; то ответ: х1 = 2, х2 = 1;
2) a = 1, b = –4, c = 4; то ответ: х1 = 2, х2 = 2;
3) a = 1, b = –5, c = 9; то ответ «решения нет».
Следующий пример – нахождение значения и номера минимального элемента одномерного массива – демонстрирует
использование одномерного массива в качестве параметра
функции:
const int N = 5;
int minArray(int A[], int *minAr, int *lMin )
{
*minAr = A[0]; *lMin = 0;
for (int i = 1; i < N; i++)
{
if (A[i] <= *minAr)
{
*minAr = A[i]; *lMin = i;

164
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
}
}
return 0;
}
int main()
{
int a[5]{ –3, 2, –3, 4, 1 };
int MinAr; int lMin;
minArray(a, &MinAr, &lMin);
cout << "Min " << MinAr << " " << lMin;
char q = getchar();
}
В результате получим
Min –3 2
И в двух последних примерах этого раздела покажем, как
передавать двумерный массив в функцию. В первом определен только один параметр функции – это массив. Но в его
описании указаны дополнительные параметры. На первом
месте там указан тип его элементов. Перед именем массива –
знак &. Он возвращает адрес в памяти, где расположен массив. А далее фиксируются количество строк и столбцов.
// Двумерный массив в функции (1)
void print(int(&a)[3][4])
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
cout << a[i][j] << " ";
cout << endl;
}
}
int main()
{
int A[3][4]

9. Функции
165
{
{1,2,3,4},
{2,3,4,5},
{3,4,5,6}
};
// print(A); // (1)
print(A, 3); // (2)
char q = getchar();
}
Во втором примере у функции определено два параметра.
Первый определяет предаваемый массив и количество столбцов, а второй – количество строк. Тип массива определен
auto
ключевым словом
, что позволяет использовать в качестве
фактического параметра массивы разных типов.
#include <iostream>
using namespace std;
const int n=3;
const int m (4);
// Двухмерный массив в функции (2)
void print(auto (*a)[m], size_t n);
int main()
{
oat A[n][m]
{
{1.1,2.2,3.3,4.4},
{2.2,3.3,4.4,5.5},
{3.3,4.4,5.5,6.6}
};

166
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
print(A, 3); // (2)
char q = getchar();
}
void print(auto (*a)[m], size_t n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cout << a[i][j] << " ";
cout << endl;
}
}
Результат работы этой программы получен с помощью онлайн-компилятора GDB (рис. 9.3). Но при этом компилятор
выводит предупреждение (не критическую ошибку – стандарт С++20). Для версии C++17 такого сообщения нет.
Рис. 9.3. Передача двумерного массива в функцию
Заметим, что в коде программы сначала приведено объявление функции
определение функции
main
Если в
определить массив другого типа, то функцию
, затем идет функция
print
.
main
, и уже затем
print
изменять не придется.
int main() // 2 – int
{
int A[n][m]
{
{1,2,3,4},

9. Функции
{2,3,4,5},
{3,4,5,6}
};
print(A, 3); // (2)
char q = getchar();
}
167

Задание 1
Задание предназначено для приобретения навыков реализации программ разветвляющейся структуры.
1. На плоскости расположена окружность радиусом r с
центром в начале координат. Ввести заданные координаты
точки и определить, лежит ли она на окружности. Решить задачу при r = 2 для точек с координатами (0, 2), (1,5; 0,7), (1,
1), (3, 0).
Указание. Считать, что точка с координатами (х, у) ле-
жит на окружности радиусом r, если |х
2. Для заданных a и b получить с = max(a, b), если а > 0
или с = min(a, b), если а ≤ 0.
3. Для заданных a, b, c вычислить z = max(min(a, b), c).
4. Определить средний рост девочек и мальчиков одного
класса. В классе учится n учеников.
5. В компьютер вводятся по очереди координаты n точек.
Определить, сколько из них попадет в круг радиусом r с центром в точке (a, b).
6. В компьютер вводятся по очереди координаты n точек.
Определить, сколько из них попадет в кольцо с внутренним
радиусом r
7. В соревнованиях по бегу принимают участие n спортсменов. Вводя по очереди результаты участников, определить, сколько из них выполнили заданный норматив.
8. В компьютер вводятся координаты n точек, лежащих
на плоскости. После ввода координат каждой точки выводить номер квадранта, в котором она находится. Определить
количество точек, лежащих по отдельности в 1-м и 3-м квадрантах.
9. В компьютер вводятся координаты n точек, лежащих
на плоскости. Напечатать номер точки, ближайшей к началу координат, и величину расстояния от нее до начала координат.
и внешним r2.
1
2
+ у2 – r2| ≤ 10–3.

Задания длясамостоятельного выполнения
169
10. В группе учится n студентов. Каждый получил на экзаменах по 4 оценки. Подсчитать число студентов, не имеющих «2» и «3».
11. В группе учится n студентов. Каждый сдал 4 экзамена. Подсчитать число неуспевающих студентов и средний балл
группы.
Решить задачи 3–11 для случая, когда количество данных
заранее (до начала выполнения программы) неизвестно. В программе необходимо обеспечить прекращение ввода, как только входной поток иссякнет.
Задание 2
Задание предназначено для приобретения навыков реализации программ циклической структуры.
1. Вычислить s = 2 + 5 + 8 + ... + 35.
2. Вычислить s = 1 + 1/2 + 1/3 + 1/4 + ... + 1/10.
3. Вычислить s = 2/3 + 4/5 + 6/7 + ... + 112/113.
2
4. Вычислить s = cosx + (cos
8
+ (cos9x) / x
.
x) / x + (cos3x) / x2 + ... +
5. Вычислить сумму квадратов 10 членов арифметической
прогрессии
2
+ (p + h)2 + ... + (p + 9h)2.
s = p
2
6. Получить таблицу функции y(x) = 0,5x
– 7x при из-
менении x от –4 до 4 с шагом 0,5.
7. Вычислить значение факториала числа 6 (6! = 1 ⋅ 2 ×
× 3 ⋅ ... ⋅ 6).
8. Вычислить s = 1! + 2! + ... + 6!
1
9. Вычислить s = (–1)
6
/ 6!
× 5
⋅ 51 / 1! + (–1)2 ⋅ 52 / 2! + ... + (–1)6 ×
10. Возвести число 3 в 7-ю степень, не используя опера-
цию возведения в степень.
11. Напечатать заданную последовательность чисел:
а) 1 2 3 4 5 6,
б) 5 5 5 5 5 5.

170
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
12. Вычислить при заданном x сумму s = 1 + 1/x + 1/x2 +
10
+ ... + 1/x
.
13. Напечатать 8 первых членов последовательности, образованной по следующему правилу: первые два числа равны 1; каждое последующее (начиная с третьего) образуется
путем суммирования двух предыдущих. (Такая последовательность называется числами Фибоначчи.)
14. Вычислить 5-й член последовательности, образованной дробями 1/1, 2/1, 3/2, …, т.е. числитель (знаменатель)
следующего члена последовательности получается сложением числителей (знаменателей) двух предыдущих членов.
15. По древней легенде мудрец, который изобрел шахматы, потребовал от персидского шаха такое количество пшеницы, чтобы ей можно было покрыть шахматную доску, положив на первую клетку одно зерно, на вторую – 2, на третью – 4
и т.д., т.е. помещая на каждую следующую клетку в два раза
больше зерен, чем на предыдущую. Какое количество зерна
может покрыть доску? (Считать, что в одном грамме 15 зерен.) С какой точностью получен результат?
16. Считая, что Земля – идеальная сфера с радиусом R ≈
≈ 6350 км, определить расстояние до линии горизонта с высоты 1, 2, …, 10 км.
17. Одноклеточная амеба каждые 3 часа делится на 2 клетки. Определить, сколько клеток будет через 3, 6, 9, …, 24 часа,
если первоначально в замкнутом объеме находилось 10 клеток.
2
18. Вычислить сумму s = cosx + (cos
2+
... Суммирование прекратить, когда очередной член сум-
/ n
x) / 22 + ... + (cosnx) /
мы по модулю будет меньше e = 0,0001.
19. Определить наибольшее значение сомножителя n, для
которого произведение р = 1 ⋅ 4 ⋅ 7 ⋅ ... ⋅ n не превышает L =
= 30 000.
2
20. Вычислить s = 1 + x
+ x4 + ... + x2n (|x| < 1). Вычисле-
ния прекратить, когда очередной член суммы будет меньше
e = 0,0001.
21. Определить частное и остаток от деления двух целых
чисел N и M, используя операцию вычитания.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
