Skip to content

Цикл 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 loop

Цикл 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.

Пример вывода:

*
**
***
****
*****
******
*******
********
*********
**********
22 февр. 2025 г.
andron13