Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование на языке С++. Ч.1. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
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, используя операцию вычитания.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]