Каждый день я встаю в шесть утра и иду на завод к восьми, в семь вечера я уже снова дома, смотрю кино по телевизору, курю с соседом на лестничной клетке и в одиннадцать уже иду спать. Утром вторника повторяется всё то же самое, и в среду, и в четверг, и в пятницу.
Кусок кода повторяющийся, и для таких случаев придумали циклы, один из них — цикл while. Условно, с понедельника по пятницу выполняется следующий алгоритм действий: подъём, работа, телевизор, спать. Пример:
void main() {
int weekDays = 7;
int i = 1;
while (i < weekDays) {
print("------------");
print("Новый день");
print("Я встаю в шесть утра");
print("Иду на завод к восьми");
print("Я уже дома");
print("Смотрю кино по телевизору");
print("Курю с соседом на лестничной клетке");
print("Иду спать");
print("День подошёл к концу");
print("------------");
i++;
}
}По-английски это называется "while loop". Loop - это петля. Цикл while - это петля, которая работает пока условие истинно.

Цикл while используется в Dart для повторения блока кода до тех пор, пока указанное логическое условие истинно. Это удобно, когда количество итераций заранее неизвестно.
Так в учебниках стоит, я сам ничего не придумываю. Давайте представим, что у нас магазин с товарами, например с лимонадом. И все товары надо поднять в цене на 10%. Набить новую цену. И если я полуёу задание от шефа, то оно может звуёать так: "Подними цену на 10% на все товары, пока не закончатся". Вот тут и пригодится цикл while. Пока есть куда набивать цену - набивай.
void main() {
double price = 100.0; // Исходная цена товара
int count = 5; // Количество товаров
while (count > 0) {
price *= 1.1; // Увеличиваем цену на 10%
print('Новая цена товара: \$price');
count--; // Уменьшаем количество товаров
}
}
while (условие) {
// Код, который выполняется, пока условие истинно
}Рассмотрим простой пример, где цикл while выводит числа от 1 до 5:
void main() {
int number = 1;
while (number <= 5) {
print('Число: \$number');
number++;
}
}Вывод:
Число: 1
Число: 2
Число: 3
Число: 4
Число: 5
Важно, чтобы в теле цикла изменялась переменная, влияющая на условие выхода. Иначе можно получить бесконечный цикл, который никогда не завершится:
void main() {
int counter = 0;
while (counter < 5) {
print('Эта программа зациклилась!');
// Отсутствует counter++, цикл никогда не завершится
}
}Этот код создаст бесконечный вывод строки "Эта программа зациклилась!", потому что значение counter никогда не изменяется.
Цикл while можно досрочно прервать с помощью break:
void main() {
int number = 1;
while (number <= 10) {
print('Число: \$number');
if (number == 5) {
print('Останавливаем цикл');
break;
}
number++;
}
}Вывод:
Число: 1
Число: 2
Число: 3
Число: 4
Число: 5
Останавливаем цикл
Чтобы пропустить текущую итерацию и перейти к следующей, используйте continue:
void main() {
int number = 0;
while (number < 5) {
number++;
if (number == 3) {
print('Пропускаем 3');
continue;
}
print('Число: \$number');
}
}Вывод:
Число: 1
Число: 2
Пропускаем 3
Число: 4
Число: 5
Здесь, когда number == 3, выполняется continue, и строка print('Число: \$number') не исполняется для этой итерации.
Цикл while подходит для ситуаций, когда:
Распродажа
void main() {
int stock = 10; // Количество лимонадов в магазине
while (stock > 0) {
print('Продаем лимонад! Осталось: $stock');
stock--; // Уменьшаем количество на 1
}
print('Лимонад закончился!');
}Мы можем использовать несколько циклов подряд:
void main() {
int a = 0;
int i = 0;
while (i < 10) {
a++;
i++;
}
i = 0;
while (i < 20) {
a++;
i++;
}
print(a);
// print(i);
}При этом операции над переменной a будут проходить в каждом цикле, потому что a принадлежит к области видимости всего метода. А вот попытка вывести на консоль i приведёт к ошибке. Переменная i, в данном случае, объявлялась только в циклах, и за пределами самого цикла не видна. Именно поэтому мы и смогли декларировать эту переменную дважды. Потому что в самом методе её как бы и нет.
Мы можем экранировать переменные просто скобками:
void main() {
int a = 0;
{
int b = 7;
a = a + b;
}
print(a);
// print(b); // Ошибка: b определена внутри блока и недоступна здесь.
}В данном примере попытка “распечатать” b приведёт к ошибке. Декларация переменной произошла в экранированном участке кода. Но операции с a программа запомнит, потому что программа декларировала a, и закрытый участок кода для а — просто часть программы.
Цикл while – это удобный инструмент для повторения операций в Dart, пока выполняется заданное условие. При его использовании важно следить за корректным изменением переменной-условия, чтобы избежать бесконечных циклов. В следующей статье мы разберем do-while, который похож на while, но выполняет хотя бы одну итерацию перед проверкой условия.
1️⃣ Определите результат вывода
Проанализируйте следующий код и попробуйте угадать, что будет выведено в консоль. Сколько раз будет выведено сообщение на экран?
int i = 3;
while (i < 10) {
print(i);
i++;
}2️⃣ Повторение числа
Даны два целых числа A и B, где B > 0.
Напишите код, который выведет число A ровно B раз.
repeatNumber(5, 3) → "5\n5\n5"
repeatNumber(10, 2) → "10\n10"
3️⃣ Числа в порядке возрастания
Даны числа A = 5 и B = 17.
Выведите все числа от A до B включительно в порядке возрастания.
printNumbersInRange(5, 17) → "5 6 7 8 9 10 11 12 13 14 15 16 17"
4️⃣ Квадрат числа через сложение
Распечатайте квадрат числа n, используя только сложение (без умножения).
printSquare(4) → 16
printSquare(5) → 25
5️⃣ Квадраты чисел от A до B
Распечатайте квадраты всех чисел от A до B, используя только сложение.
printSquaresInRange(2, 5) → "4 9 16 25"
6️⃣ Нарисуйте треугольник
Выведите треугольник из звёздочек *, используя только цикл while.
Пример вывода:
*
**
***
****
*****
******
*******
********
*********
**********