циклы C++
программированиелекция
что было
оглавление
оглавление
Сравнение while, do while и for, трассировка суммы от 1 до n и разбор ошибок границы и остановки.
У цикла должны быть начальное состояние, условие, тело и изменение. Граница определяет набор итераций, а изменение должно приближать условие к ложному.
while, do while и for
while сначала проверяет условие и может не выполниться ни разу. do while проверяет после тела и выполняется хотя бы раз. for собирает инициализацию, условие и шаг в заголовке.
цикл | проверка | минимум итераций | когда удобен |
|---|---|---|---|
while | до тела | 0 | число повторений заранее неизвестно |
do while | после тела | 1 | тело обязано сработать хотя бы раз |
for | до тела | 0 | есть счётчик и понятный шаг |
четыре части цикла
Изменение должно вести к остановке.
описание схемы словами
Цикл состоит из начального состояния, проверки, тела и изменения параметра, после которого проверка повторяется.
трассировка суммы 1..n
Для n=4 цикл должен добавить 1, 2, 3 и 4. Таблица фиксирует состояние после каждой итерации и показывает, вошла ли верхняя граница.
итерация | i | sum до | sum после |
|---|---|---|---|
1 | 1 | 0 | 1 |
2 | 2 | 1 | 3 |
3 | 3 | 3 | 6 |
4 | 4 | 6 | 10 |
Самодостаточная сумма 1..n
#include <iostream>
int main() {
int n{};
if (!(std::cin >> n) || n < 1) {
std::cerr << "n must be positive\n";
return 1;
}
long long sum = 0;
for (long long i = 1; i <= n; ++i) {
sum += i;
}
std::cout << sum << "\n";
return 0;
}
проверка n=4
условие: Найти сумму 1..4.
ход решения
sum=0
после i=1: 1
после i=2: 3
после i=3: 6
после i=4: 10
ответ: 10
проверка: По формуле .
ошибки границы и остановки
Ошибка off-by-one (ошибка на единицу) возникает, когда цикл захватывает на одно значение больше или меньше. Для суммы 1..n условие i<n потеряет n; нужно i<=n.
бесконечный цикл
В while (i <= n) { sum += i; } переменная i не меняется. Если условие истинно при входе, оно никогда не станет ложным.
n | зачем | ожидаемое |
|---|---|---|
0 | ниже допустимой границы | ошибка ввода |
1 | минимальное допустимое | 1 |
2 | две итерации | 3 |
4 | обычный случай | 10 |
что запомнить
while и for могут дать ноль итераций; do while — минимум одну.
У цикла есть начало, условие, тело и изменение.
Операторы < и <= задают разные наборы итераций.
Если условие не приближается к ложному, цикл может стать бесконечным.
самопроверка
Почему do while не всегда подходит для проверки ввода?
Какие i получатся при i<n и n=4?
Почему цикл без ++i не завершится?
Как трассировка обнаруживает off-by-one?
источники
материал занятия: Циклы C++ — /materials/lectures/cpp-loops.pdf
редакционная сверка: cppreference: while loop — https://en.cppreference.com/w/cpp/language/while.html
редакционная сверка: cppreference: do-while loop — https://en.cppreference.com/w/cpp/language/do.html
редакционная сверка: cppreference: for loop — https://en.cppreference.com/w/cpp/language/for.html
что сделать
Измените пример так, чтобы он считал сумму чётных чисел от 2 до n; проверьте n=1, 2 и 6.
благодарность
Евгения Прохорова (1-45), Никита Козлов (1-48) и Иван Лашманов (1-48)