Цикл while
Каждый день я встаю в шесть утра и иду на завод к восьми, в семь вечера я уже снова дома, смотрю кино по телевизору, курю с соседом на лестничной клетке и в одиннадцать уже иду спать. Утром вторника повторяется всё то же самое, и в среду, и в четверг, и в пятницу.
Кусок кода повторяющийся, и для таких случаев придумали циклы, один из них — цикл 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?
Цикл 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
.
Пример вывода:
*
**
***
****
*****
******
*******
********
*********
**********