Циклы: while и do while - Язык программирования C++ для спортивного программирования
Циклы: while и do while
Циклы: while и do while
Введение: общая идея while и do while
Циклы используются, когда мы хотим повторить одно и то же действие много раз. В прошлой лекции мы использовали цикл for, который очень удобен, когда мы уже знаем, с чего должен начинаться счётчик, когда он должен остановиться и как он должен меняться.
Цикл while полезен, когда повторение зависит от условия. Мы повторяем тело, пока условие истинно. Это особенно полезно, когда мы заранее не знаем, сколько будет повторений.
Есть также цикл do while. Он похож на while, но с одним важным отличием: do while сначала выполняет тело, а условие проверяет уже после этого. Поэтому тело всегда выполняется хотя бы один раз.
Основная идея: как работает while
Общий вид цикла while такой:
Здесь есть две важные части:
<условие> решает, должен ли цикл продолжаться.
<тело> — это код, который мы хотим повторять.
Цикл работает в таком порядке:
Самая важная деталь: while проверяет условие до выполнения тела. Если условие ложно с самого начала, тело не выполнится ни разу.
Выведем числа от 1 до 10 с помощью while:
Вот что означает каждая часть:
До цикла мы задаём i=1.
Условие — это .
i≤10
Тело выводит текущее значение i.
Внутри тела мы меняем i с помощью i=i+1.
Цикл идёт так:
Обратите внимание: 11 не выводится. Условие проверяется до выполнения тела.
Как цикл `while` проверяет, выводит и обновляет
C++
код · C++строка 1
1int i = 1;
2
3while (i <= 10) {
4 cout << i << ' ';
5 i = i + 1;
6}
Задаём начальное значение
L1
До цикла мы создаём i и задаём его первое значение.
инв
Цикл `while` проверяет условие перед каждым выполнением тела.
Коробка переменных
Словарь
currentPart
начало до цикла
i
1
condition
не проверено
lastPrinted
пока ничего
outputSoFar
пусто
currentPartначало до циклаi⤳1conditionне провереноlastPrintedпока ничегоoutputSoFarпусто
iterations0
L1
01 / 32
У цикла while нет специального места для шага. Мы должны написать шаг сами внутри тела. Если мы забудем i=i+1, то i останется равным 1, условие i≤10 всегда будет истинным, и цикл никогда не остановится.
Мы также можем прыгать через 2. Например, чтобы вывести нечётные числа от 1 до 10:
Это выведет: 13579
Теперь после каждого повторения i становится больше на 2. Цикл проходит по значениям 1,3,5,7,9, затем i становится равным 11, и условие i≤10 становится ложным.
Как цикл `while` прыгает через 2
C++
код · C++строка 1
1int i = 1;
2
3while (i <= 10) {
4 cout << i << ' ';
5 i = i + 2;
6}
Задаём начальное значение
L1
До цикла мы создаём i и задаём его первое значение.
инв
Цикл `while` проверяет условие перед каждым выполнением тела.
Коробка переменных
Словарь
currentPart
начало до цикла
i
1
condition
не проверено
lastPrinted
пока ничего
outputSoFar
пусто
currentPartначало до циклаi⤳1conditionне провереноlastPrintedпока ничегоoutputSoFarпусто
iterations0
L1
01 / 17
Цикл while может идти и в обратную сторону:
Это выведет: 10987654321
Значит, с while мы всё контролируем сами: начальное значение до цикла, условие в заголовке цикла и шаг внутри тела.
Основная идея: как работает do while
Общий вид цикла do while такой:
Здесь снова есть две важные части:
<тело> — это код, который выполняется первым.
<условие> проверяется после того, как тело закончилось.
Цикл работает в таком порядке:
Главное отличие простое: do while всегда выполняет тело хотя бы один раз.
Выведем числа от 1 до 10 с помощью do while:
Результат тот же: 12345678910
Но порядок другой. Сначала мы выводим i, затем увеличиваем его, и только после этого проверяем, верно ли i≤10.
Как `do while` выполняет тело до проверки условия
C++
код · C++строка 1
1int i = 1;
2
3do {
4 cout << i << ' ';
5 i = i + 1;
6} while (i <= 10);
Задаём начальное значение
L1
До цикла мы создаём i и присваиваем ему 1.
инв
Тело всегда выполняется хотя бы один раз до первой проверки условия.
Коробка переменных
Словарь
currentPart
начало до цикла
i
1
condition
не проверено
lastPrinted
пока ничего
outputSoFar
пусто
currentPartначало до циклаi⤳1conditionне провереноlastPrintedпока ничегоoutputSoFarпусто
iterations0
L1
01 / 31
Примеры
Пример 1: вывести числа от 1 до n с помощью while
Дано одно целое число n. Выведите все числа от 1 до n.
Пример:
Разбор и решение
Нам нужна переменная i, которая начинается с 1. Пока i≤n, мы выводим i, а затем увеличиваем её на 1.
Алгоритм:
Реализация:
Пример 2: сумма чисел от 1 до n с помощью while
Дано одно целое число n. Найдите сумму всех чисел от 1 до n.
Пример:
Потому что 1+2+3+4+5=15.
Разбор и решение
Мы храним переменную sum, в которой лежит накопленный ответ. В начале sum=0. Затем мы проходим по всем значениям i от 1 до n и добавляем каждое i к sum.
Алгоритм:
Реализация:
Мы используем longlong для sum, потому что при больших n ответ может стать очень большим.
Пример 3: читать числа до 0
Дано несколько целых чисел. Последнее число равно 0. Выведите сумму всех чисел до 0.
Пример:
Потому что 4+7+2=13.
Разбор и решение
Здесь мы не знаем, сколько чисел будет дано до 0. Именно поэтому while подходит здесь естественнее, чем for.
Сначала мы читаем одно число x. Пока x=0, мы добавляем его к sum и читаем следующее число. Когда x=0, цикл останавливается.
Алгоритм:
Реализация:
Пример 4: посчитать количество цифр с помощью do while
Дано одно целое число n, где n≥0. Выведите, сколько в нём цифр.
Пример:
При n=0 ответ должен быть равен 1.
Разбор и решение
Каждый раз, когда мы делим n на 10, мы убираем его последнюю цифру. Мы считаем, сколько раз это можно сделать, пока n не станет равным 0.
Число 0 — это и есть причина, по которой здесь полезен do while. Если бы мы использовали обычный while с условием n>0, то при n=0 тело не выполнилось бы ни разу. Но у 0 всё равно одна цифра, поэтому нам нужно, чтобы тело выполнилось хотя бы один раз.
Алгоритм:
Подсчёт цифр с помощью `do while`
C++
код · C++строка 1
1int n = 507;
2int cnt = 0;
3
4do {
5 cnt = cnt + 1;
6 n = n / 10;
7} while (n > 0);
Начальное значение n
L1
Мы начинаем с данного числа.
инв
Тело цикла должно выполниться хотя бы один раз, даже когда n = 0.
Коробка переменных
Словарь
currentPart
начало
n
507
cnt
0
condition
не проверено
currentPartначалоn⤳507cnt0conditionне проверено
iterations0
L1
01 / 11
Реализация:
Пример 5: вывести числа от n до 1 с помощью while
Дано одно целое число n. Выведите числа от n до 1.
Пример:
Разбор и решение
Теперь переменная цикла идёт вниз. Мы начинаем с i=n, продолжаем, пока i≥1, и уменьшаем i на 1 после каждого повторения.
Алгоритм:
Реализация:
1. Проверить условие.
2. Если условие ложно, остановить цикл.
3. Если условие истинно, выполнить тело.
4. Вернуться к пункту 1.
while(<условие>){<тело>}
int i = 1;while(i <= 10){ cout << i << ' '; i = i + 1;}
i = 1 -> условие истинно -> вывести 1 -> i становится 2
i = 2 -> условие истинно -> вывести 2 -> i становится 3
i = 3 -> условие истинно -> вывести 3 -> i становится 4
...
i = 10 -> условие истинно -> вывести 10 -> i становится 11
i = 11 -> условие ложно -> стоп
1. Выполнить тело.
2. Проверить условие.
3. Если условие истинно, выполнить тело ещё раз.
4. Если условие ложно, остановить цикл.
Ввод:
5
Вывод:
1 2 3 4 5
1. Прочитать n.
2. Положить i = 1.
3. Пока i <= n:
1. Вывести i.
2. Увеличить i на 1.
Ввод:
5
Вывод:
15
1. Прочитать n.
2. Положить sum = 0.
3. Положить i = 1.
4. Пока i <= n:
1. Добавить i к sum.
2. Увеличить i на 1.
5. Вывести sum.
Ввод:
4 7 2 0
Вывод:
13
1. Положить sum = 0.
2. Прочитать x.
3. Пока x != 0:
1. Добавить x к sum.
2. Прочитать следующее x.
4. Вывести sum.
Ввод:
507
Вывод:
3
1. Прочитать n.
2. Положить cnt = 0.
3. Выполнять:
1. Увеличить cnt на 1.
2. Убрать последнюю цифру из n.
4. Продолжать, пока n > 0.
5. Вывести cnt.
Ввод:
5
Вывод:
5 4 3 2 1
1. Прочитать n.
2. Положить i = n.
3. Пока i >= 1:
1. Вывести i.
2. Уменьшить i на 1.
int i = 1;while(i <= 10){ cout << i << ' '; i = i + 2;}
int i = 10;while(i >= 1){ cout << i << ' '; i = i - 1;}
do{<тело>} while(<условие>);
int i = 1;do{ cout << i << ' '; i = i + 1;} while(i <= 10);
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; int i = 1; while(i <= n){ cout << i << ' '; i = i + 1;} return 0;}
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; long long sum = 0; int i = 1; while(i <= n){ sum = sum + i; i = i + 1;} cout << sum << '\n'; return 0;}
#include <bits/stdc++.h>using namespace std;int main(){ long long sum = 0; int x; cin >> x; while(x != 0){ sum = sum + x; cin >> x;} cout << sum << '\n'; return 0;}
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; int cnt = 0; do{ cnt = cnt + 1; n = n / 10;} while(n > 0); cout << cnt << '\n'; return 0;}
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; int i = n; while(i >= 1){ cout << i << ' '; i = i - 1;} return 0;}