§ 6. Использование основных алгоритмических конструкций для решения задач
Сайт: | Профильное обучение |
Курс: | Информатика. 10 класс (Повышенный уровень) |
Книга: | § 6. Использование основных алгоритмических конструкций для решения задач |
Напечатано:: | Гость |
Дата: | Вторник, 8 Апрель 2025, 14:41 |
6.1. Отладка программ в среде Code::Blocks
В помощь пользователю почти любой среды программирования предоставляются средства, необходимые для отладки программы. Они позволяют тщательно протестировать программу и устранить все ошибки в ней (пример 6.1). Среда Code::Blocks содержит отладчик, который позволяет выполнить программу построчно, просматривать и модифицировать переменные и выражения. Отладчик встроен в интегрированную среду, и поэтому пользователь может редактировать, компилировать и отлаживать программу, не выходя из среды. Ошибки компиляции Ошибки компиляции, или синтаксические ошибки, возникают в том случае, если не описана некоторая переменная, передается неправильное количество параметров функции, пропущена точка с запятой или скобка и т. д. С исправлением ошибок, обнаруженных во время компиляции, сложностей практически не возникает. Компилятор, обнаружив в программе ошибки, завершает работу и выдает информацию об ошибках в окне редактора кода, на вкладке Build log (пример 6.2). Исправив ошибки, обнаруженные таким образом, можно повторить компиляцию программы. Ошибки выполнения Ошибки выполнения, или семантические ошибки, возникают на этапе выполнения при попытке открыть несуществующий файл, делить на нуль и т. д. (пример 6.3). При этом выполнение программы прерывается. Возникновение фатальных ошибок приводит к немедленному прекращению выполнения программы. Логические ошибки Программа может содержать и логические ошибки. Логические ошибки позволяют компилятору выполнить программу, однако результат выполнения будет отличаться от ожидаемого. Наличие таких ошибок определяется с помощью тестирования. Обнаружить ошибку этой группы, не имея никаких отладочных средств, бывает достаточно сложно. Наличие в программе таких ошибок является одной из основных причин возникновения необходимости использования отладчика, входящего в состав интегрированной среды. Отладчик позволяет выполнить программу в диалоговом режиме, наблюдая за изменением значений отдельных переменных или выражений. Имеется возможность остановиться в заданной точке программы и изменить значения некоторых переменных и выражений. Команды отладчика собраны в меню Debug (пример 6.4). Эти же команды продублированы на панели быстрого доступа (пример 6.5). Описание команд отладки, собранных в меню Debug, приведены в Приложении к главе 1. Трассировка — построчное выполнение исходной программы, при котором после выполнения каждой строки можно остановиться и посмотреть результаты. Наличие возможности выполнения исходной программы до строки, на которую указывает курсор, позволяет пропустить трассировку малоинтересных частей программы и сразу перейти в точку начала отладки. Для этих целей можно нажать F4 в строке с курсором. Если эта строка находится после ввода данных, то ввод данных произойдет как обычно, выполнение программы прервется, когда придет очередь выполнения этой строки. Необходимо переключиться из консольного окна в окно кода. Та строка, которая должна выполниться, помечается желтым треугольником Некоторые строки программы могут быть помечены как точки прерывания. Для этого достаточно кликнуть мышью слева от строки программы. В этом месте появится красный круг Когда в процессе выполнения отладки программы (запуск с помощью клавиши F8 или Отладчик интегрированной среды Code::Blocks предоставляет возможность наблюдения за изменением переменных или выражений. Наблюдаемые объекты отображаются в окне наблюдения Watches, отражая изменения в программе при пошаговом выполнении. Для открытия окна Watches можно выполнить команду Debug → Debugging Windows → Watches или выбрать его из списка отладочных окон на панели быстрого доступа (пример 6.8). Для добавления переменной в окно просмотра нужно добавить ее имя в первый столбец окна Watches. |
Пример 6.1. Типы ошибок:
Пример 6.2. Пример ошибки компиляции. Все ошибки выделяются красным цветом. Для каждой ошибки указывается номер строки, в которой обнаружена ошибка, и описание этой ошибки. Серым фоном подсвечивается та из ошибок, которая выделена в программе знаком Двойной щелчок по ошибке в окне Build log покажет ее местоположение в программе. Переходить к просмотру следующей ошибки можно с использованием сочетания клавиш Пример 6.3. Пример ошибки выполнения. Текст программы:
Тестирование: При x = 5 возникает ошибка деления на нуль, и среда выдает сообщение с кодом ошибки: «Process returned −1073741676». Если программа выполнилась успешно, то код ошибки 0: «Process returned 0». При анализе программы компилятор выдает не только ошибки, но и предупреждения (warning) о том, что некоторые записи могут привести к ошибке. Предупреждения выделяются синим цветом. Если в программе выше записать int y = x / (x - x); то при компиляции программы можно увидеть предупреждение: Пример 6.4. Меню Debug: Пример 6.5. Панель быстрого доступа с командами отладки: Пример 6.6. Режим отладки: Пример 6.7. Точки прерывания: Если точка прерывания установлена внутри цикла, то можно определить, сколько итераций цикла будет пропущено, перед тем как программа прервется. Сделать это можно из контекстного меню точки прерывания. Также можно указать логическое выражение, при котором сработает точка прерывания. Пример 6.8. Окно наблюдения за значениями переменных Watches: Окно Watches появляется «висячим», при желании его можно прицепить к окну редактора кода. Для этого нужно переместить окно Watches к окну редактора кода и выбрать место его размещения. В процессе перемещения окна место, куда его можно «прицепить», будет отображаться прямоугольником серого цвета. В окне Watches отображаются текущие значения переменных. Переменная, которая изменилась последней, отображается красным цветом. |
6.2. Использование числовых последовательностей
Числовые последовательности позволяют описывать многие процессы, происходящие в природе и обществе. Для задания элементов числовой последовательности обычно используют один из двух способов: 1. Записывается зависимость значения элемента последовательности от значения номера (пример 6.9). Есть последовательности, которые можно задавать как первым способом, так и вторым (пример 6.11). Последовательности могут строиться из случайных чисел. Пример 6.12. Вывести на экран первые k элементов последовательности заданной формулой Этапы выполнения задания I. Исходные данные: k (количество чисел). II. Результат: k чисел последовательности. III. Алгоритм решения задачи. 1. Ввод числа k. IV. Описание переменных: k – int, n – double. Пример 6.13. Найти первый элемент последовательности, заданной рекуррентно Этапы выполнения задания I. Исходные данные: число b. II. Результат: элемент последовательности, меньший 0.001, и его номер. III. Алгоритм решения задачи. 1. Ввод числа b. |
Подтверждением важности числовых последовательностей является тот факт, что создана целая энциклопедия числовых последовательностей OEIS [1]. Пример 6.9. Формула Пример 6.10. Одной из наиболее известных последовательностей, которую можно описать рекуррентно, является последовательность Фибоначчи: 1, 1, 2, 3, 5, 8, 13… . Несложно заметить, что каждый ее элемент, начиная с третьего, равен сумме двух предыдущих. Это можно записать так: an = an − 1 + an − 2, a1 = 1, a2 =1. Пример 6.11. В последовательности 2, 4, 8, 16,… каждое число является степенью 2, поэтому ее можно задать формулой an = 2n. С другой стороны, каждый элемент последовательности, начиная со второго, в два раза больше предыдущего. Получим формулу an = 2an − 1 (для n > 1, a1 = 2). Пример 6.12. V. Программа:
VI. Тестирование. При вычислении значения a важно помнить, что результатом деления двух целых чисел (в данном случае это числа n и n2 + 1), будет целое число, поэтому необходимо преобразование типа в вещественный до выполнения операции деления. Строку, в которой вычисляется значение a, можно записать и так: double a = static_cast<double>(n) / (n * n + 1); Пример 6.13. V. Программа:
VI. Тестирование. |
6.3. Вычисление значения факториала числа
Факториалом числа n называют последовательное произведение натуральных чисел, не больших n: n! = 1 · 2 · 3 · ... · n. Равенство 0! = 1 обычно принимают в качестве соглашения. Пример 6.14. Написать программу, которая по введенному натуральному значению n получает n!. Этапы выполнения задания. I. Исходные данные: число n. II. Результат: f (значение n!). III. Алгоритм решения задачи. 1. Ввод числа n. n! =(n – 1)! · n. 3. Для вычисления произведения можно воспользоваться циклом for. Начальное значение переменной f равно 1. |
Название факториал происходит от латинского factorialis — действующий, производящий, умножающий. В 1808 г. французский математик Кристиан Крамп предложил компактное обозначение n! (произносится «эн факториа́л»). Факториалы всех чисел составляют последовательность A000142 в OEIS. |
6.4. Нахождение суммы элементов числовой последовательности
Пример 6.15. В секретной лаборатории выводят полезные бактерии. Экспериментально было установлено, что количество бактерий (в млн) завит от номера дня, в который проводится эксперимент, следующим образом: Этапы выполнения задания. I. Исходные данные: m (число дней). II. Результат: s (общее количество бактерий). III. Алгоритм решения задачи. 1. Ввод числа m. IV. Описание переменных: m – int, s, a – double. Пример 6.16. Написать программу для вычисления суммы, имеющей своими слагаемыми элементы последовательности Этапы выполнения задания I. Исходные данные: eps (точность вычислений). II. Результат: переменная s (сумма). III. Алгоритм решения задачи. 1. Ввод числа eps. 2.1. Так как количество слагаемых заранее не известно, то для вычисления суммы воспользуемся циклом do…while. 3. Вывод результата s. IV. Описание переменных: n – int, eps, a, s, d, f – double. |
Пример 6.15. V. Программа:
VI. Тестирование VII. Анализ результата. Для проверки правильности результата можно посчитать значение суммы на калькуляторе: Пример 6.16. V. Программа:
VI. Тестирование VII. Анализ результата. Поскольку факториал является чрезвычайно быстро растущей функцией, то элементы последовательности убывают. Выпишем элементы: Шестой элемент меньше 0.1. Это последнее слагаемое в сумме. Сумма первых шести элементов — ≈9.07. Если eps = 0.01, то к сумме, полученной для eps = 0.1, будут добавляться слагаемые, которые меньше 0.1, которые незначительно изменят значение суммы. Разница в значениях суммы — ≈0.03. Чем меньше точность, тем меньше будут отличаться суммы. |
6.5. Построение таблицы значений функции
Пример 6.17. Вывести на экран таблицу значений функции y = x2sinx. Количество значений вводится. Начальное значение x = –3, значения аргумента выводятся с шагом h = 0.5. Этапы выполнения задания I. Исходные данные: k (количество точек). II. Результат: k значений аргумента и соответствующих им значений функции. III. Алгоритм решения задачи. 1. Ввод числа k. 2.1. Начальное значение аргумента x = –3. Для получения очередного значения аргумента нужно к текущему значению прибавить шаг h. 3. Поскольку количество точек известно, воспользуемся циклом for. IV. Описание переменных: k – int, x, y, h – double. |
Пример 6.17. V. Программа:
VI. Тестирование. |
6.6. Выделение цифр из числа
Пример 6.18. Дано натуральное число n. Сформировать новое число, состоящее из нечетных цифр числа n. Этапы выполнения задания I. Исходные данные: n (число). II. Результат: s (новое число) III. Алгоритм решения задачи. 1. Ввод исходных данных — число n. 4.1. Найти остаток от деления текущего числа на 10 (z — текущая цифра числа). 5. Вывод значения переменной s. Если s = 0, то в числе нет нечетных цифр. IV. Описание переменных: n, s, r, z – int. |
Пример 6.18. V. Программа:
VI. Тестирование. |
6.7. Простейшее моделирование
Пример 6.19. Резервуар наполнен m литрами водного раствора, содержащего s кг сахара. Каждую минуту забирают x литров раствора и добавляют y литров воды. Концентрация поддерживается равномерной посредством помешивания. Сколько сахара будет в растворе через k минут? Этапы выполнения задания I. Исходные данные: числа m, s, x, k. II. Результат: s (новое значение) III. Алгоритм решения задачи. 1. Ввод исходных данных. 3.1. Уменьшаем количество раствора на x. 4. Вывод значения переменной s. Если количество раствора меньше либо равно нулю, то выводим сообщение «сахара не осталось», иначе выводим количество оставшегося сахара. IV. Описание переменных: n, s, r, z — int. |
Пример 6.19. V. Программа:
VI. Тестирование. |
Упражнения
1. Напишите программу для вычисления первых n элементов последовательности Фибоначчи.
1. Для какого максимального значения n программа выдает корректный ответ?
2. Измените программу так, чтобы она выводила значение числа Фибоначчи по введенному номеру.
3. Замените в программе тип int на тип long long. Какое максимальное значения n можно ввести сейчас?
2. Напишите программу, которая будет выводить на экран элементы последовательности трибоначчи — первые элементы последовательности: 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149… . Каждый элемент, начиная с четвертого, равен сумме трех предыдущих: an = an – 1 + an – 2 + an – 3.
1. По заданному n вывести элемент последовательности.
2. Для заданного x вывести элементы последовательности меньшие x.
3. Напишите программу, которая найдет первый отрицательный элемент последовательности sin(tgn)n = 1, 2, ... и его номер.
4. Выполните задания для примера 6.15.
1. Замените в решении задачи цикл for на цикл while или do…while.
2. Ваня решил сократить количество строк в программе и записал цикл следующим образом:
for (int n = 1; n <= m; n++){
double a = n * n * n / (sqrt(n * n * n)- n + 1);
s += a;
}
Почему для m = 2000 Ваня получил в ответе s = nan?
5. Напишите программу, которая найдет сумму первых m элементов последовательности. Число m вводится. Элементы последовательности задаются формулой.
6. Написать программу для вычисления суммы, имеющей своими слагаемыми элементы последовательности . Вычисления производить до тех пор, пока не найдется слагаемое, для которого верно неравенство
. Значение eps вводится (0 < eps < 1 ).
7. Напишите программу, которая найдет произведение из n сомножителей следующего вида. Значение n вводится.
8. Выполните задание для примера 6.17.
- Замените в решении задачи цикл for на цикл while или do…while.
- Получите таблицу значений функции на отрезке [–3; 3]. В качестве условия в цикле можно использовать следующее: x < = 3;
- Добавьте в программу вывод границ вокруг таблицы:
9. Напишите программу, которая построит таблицы значений для следующих функций.
10. Программу из примера 6.18 изменили. Сформулируйте задачу, которая решается с помощью данной программы.
#include<iostream>
using namespace std;
int main()
{
int i, n;
cout << "n = ";
cin >> n;
cout << "i = ";
cin >> i;
int k = 0;
while (n > 0)
{
int z = n % 10; //текущая цифра
k++;
if (k == i){
cout << "v razrjade " << i;
cout << " stoit zifra "<< z << endl;
}
n /= 10; //уменьшение числа в 10 раз
}
if (i > k){
cout << "v chisle "<<k<<" cifr, ";
cout << "v razrjade " << i << " net cifr " << endl;
}
else
cout<<"v chisle "<<k<<" cifr";
return 0;
}
11. Дано натуральное число n. Напишите программу, которая определит, каких цифр в числе больше, четных или нечетных.
12. Дано натуральное число n. Напишите программу, которая выведет номера разрядов, в которых стоят цифры кратные 3, или сообщение, что таких цифр нет.
13. Напишите программу, которая выведет на экран цифру, стоящую на средней позиции числа, если число имеет нечетное количество цифр, или 2 средние для числа с четным количеством цифр.
14. Напишите программу, которая после каждой цифры 1 в числе вставит еще одну единицу. Например, из 51214 → 5112114.
15. Выполните задание для примера 6.19.
1. Для ситуации, когда сахар заканчивается, выведите значение времени, когда это произошло.
2. Измените программу так, чтобы задавалось начальное и конечное количество сахара, а рассчитывалось время, необходимое для такого изменения концентрации.
3. Измените программу так, чтобы по введенному времени и количеству сахара в начале и в конце процесса рассчитывался начальный объем раствора.