Как можно заменить цикл for циклом while

1. Сравнение циклов: for vs while
Цикл while можно использовать во всех случаях, когда команду или группу команд нужно выполнить несколько раз. Но из всех случаев один случай стоит выделить особо.
Это случай, когда программист (автор программы) заранее знает, сколько раз должен выполниться его цикл. Обычно это решается введением специальной переменной-счетчика, и каждую итерацию цикла переменная увеличивается (или уменьшается) на 1.
Вроде бы все работает как надо, но не очень удобно. Перед циклом мы задаем стартовое значение переменной-счетчика, затем в условии проверяем, не достигла ли она уже финального значения. А вот меняем ее обычно в самом конце тела цикла.
А если тело цикла большое? Или у нас несколько вложенных циклов? В общем, хотелось бы в таких случаях собрать всю эту информацию о переменной-счетчике в одном месте. Так в Java появился цикл for. Выглядит он тоже не очень сложно:
for (команда1; условие; команда2) { блок команд }
Если у цикла while в круглых скобках было только условие, тут еще добавились две команды, разделенные точкой с запятой.
Все на самом деле проще, чем кажется: компилятор превращает цикл for в обычный цикл while таким образом:
команда1; while (условие) { блок команд команда2; }
Или лучше продемонстрируем на примере: два примера ниже идентичны.
Вариант 1 | Вариант 2 |
---|---|
for (int i = 0; i < 20; i++) { System.out.ln(i); } | int i = 0; while (i < 20) { System.out.ln(i); i++; } |
Мы просто взяли и собрали в одном месте весь код, который касается переменной-счетчика – i.
команда1 в цикле for выполняется только один раз перед самим циклом (это видно на втором примере)
команда2 выполняется столько же раз, сколько и тело цикла, но будет выполняться каждый раз уже после того, как выполнится все тело цикла
2. Где используется цикл for
Цикл for, наверное, самый используемый вариант цикла в Java. Он применяется везде, т.к. это просто более понятная и удобная форма записи цикла while для программистов. Практически любой цикл while можно преобразовать в цикл for.
Примеры:
Цикл while | Цикл for |
---|---|
int i = 3; while (i >= 0) { System.out.ln(i); i–; } | for (int i = 3; i >= 0; i–) { System.out.ln(i); } |
int i = 0; while (i < 3) { System.out.ln(i); i++; } | for (int i = 0; i < 3; i++) { System.out.ln(i); } |
boolean isExit = false; while (!isExit) { String s = console.nextLine(); isExit = s.equals(“exit”); } | for (boolean isExit = false; !isExit; ) { String s = console.nextLine(); isExit = s.equals(“exit”); } |
while (true) System.out.ln(“C”); | for (; true; ) System.out.ln(“C”); |
while (true) { String s = console.nextLine(); if (s.equals(“exit”)) break; } | for (; true; ) { String s = console.nextLine(); if (s.equals(“exit”)) break; } |
Обратите внимание на последний пример. Там пропущены команды работы со счетчиком цикла. Нет счетчика – нет команд.
Java разрешает не писать в цикле for «команду по инициализации счетчика» и «команду по изменению счетчика». И даже выражение-условие цикла можно не писать.
3. Нюансы использования цикла for
Важный момент по использованию цикла for и операторов break и continue.
Оператор break в цикле for работает так же, как и в цикле while – приводит к немедленному завершению цикла. А вот continue приводит к пропуску тела цикла, но не команды2 (которая меняет счетчик цикла).
Давайте еще раз посмотрим, как связаны for и while.
for (команда1; условие; команда2) { блок команд } команда1; while (условие) { блок команд команда2; }
Если в блоке команд цикла for вызвать оператор continue, остаток блока команд будет пропущен, а вот команда2 (которая работает с переменной-счетчиком цикла for) все равно выполнится.
Вернемся к нашему примеру с пропуском чисел, которые делятся на 7.
Этот код зациклится | Этот код будет отлично работать |
---|---|
int i = 1; while (i <= 20) { if ( (i % 7) == 0) continue; System.out.ln(i); i++; } | for (int i = 1; i <= 20; i++) { if ( (i % 7) == 0) continue; System.out.ln(i); } |
Код с использованием цикла while работать не будет – i никогда не превысит 7. А вот код с циклом for отлично будет работать.
4. Сравнение циклов for: Java vs Pascal
В Паскале, кстати, тоже есть цикл For. Он вообще есть практически во всех языках программирования. Только в Паскале он гораздо понятнее. Примеры:
Pascal | Java |
---|---|
For i := 1 to 10 do Begin Writeln(i); End; | for (int i = 1; i <= 10; i++) { System.out.ln(i); } |
For i := 1 to 10 do step 2 Begin Writeln(i); End; | for (int i = 1; i <= 10; i = i + 2) { System.out.ln(i); } |
For i := 10 downto 0 do step 2 Begin Writeln(i); End; | for (int i = 10; i >= 0; i = i – 2) { System.out.ln(i); } |
Источник
Разбираемся, как сократить повторяющийся код в C++ и сэкономить время.
nbsp;4.0 Transitional//EN” “https://www.w3.org/TR/REC-html40/loose.dtd”>
Это шестая часть из серии статей «Глубокое погружение в C++». В прошлый раз мы узнали, как использовать функции и процедуры. Сейчас поговорим о циклах while, do-while и for.
Циклы – это разновидность условных конструкций. Они позволяют выполнять команды несколько раз, если определённое утверждение верно. Например, с помощью циклов можно пять раз вывести на экран какую-нибудь надпись или посчитать сумму всех чисел.
Евгений Кучерявый
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Запись цикла while выглядит так:
Этот код выполняется следующим образом:
- Программа проверяет, верно ли утверждение.
- Выполняются инструкции в теле цикла.
- Программа возвращается к пункту 1.
То есть пока утверждение верно (i < 100), цикл будет повторять одни и те же действия. Цикл, который пять раз выводит сообщение «Hello, World!»:
int i = 0; while(i < 5) { std::cout << “Hello, World! n”; i++; }
Посмотрим на вывод:
Обратите внимание на переменную i – она играет роль счётчика, к которому в каждом шаге цикла прибавляется единица. Это нужно, чтобы инструкции выполнялись только определённое количество раз.
Один шаг цикла называется итерацией, а счётчик – итератором. Поэтому чаще всего для счётчика создаётся переменная i.
Важно! Следите за тем, чтобы выход из цикла был возможен, иначе он будет выполняться бесконечно.
Если внутри цикла складываются числа или что-то выводится, то нагрузка будет минимальной. Если же это какие-то ресурсозатратные вычисления, то выполнение такого цикла может заставить компьютер зависнуть.
Когда нам нужно вмешаться в работу цикла, мы используем операторы break и continue.
Оператор break прерывает выполнение цикла:
int sum = 0; int maxSum = 50; int i = 0; while(i < 100) { sum += i; i++; if(sum >= maxSum) { break; } } std::cout << “i = ” << i << “nsum = ” << sum << “n”;
Этот цикл должен посчитать сумму всех чисел от одного до ста. Но мы указали максимальное значение для переменной sum, поэтому цикл прервётся, как только sum станет больше maxSum.
Компилятор умеет отличать оператор break в конструкции switch от оператора break, который прерывает циклы. Поэтому можно спокойно писать вот такой код:
int action = 0; bool end = false; while(true) { std::cout << “Exit? n1 – Yesn0 – NonAction: “; std::cin >> action; switch(action) { case 1: std::cout << “Good bye!n”; end = true; break; case 0: std::cout << “Try again!n”; } if(end) { break; } }
Вот как это будет работать:
Важно! Оператор break внутри конструкции switch не может прервать цикл.
Иногда нам нужно пропустить одну итерацию и перейти к следующей. Для этого используем оператор continue.
int i = 0; while(i < 100) { i++; if(i % 3 == 0) { continue; } std::cout << ” ” << i; } std::cout << “n”;
Этот цикл выведет все числа от одного до ста, кроме тех, которые делятся на три без остатка.
Цикл do-while похож на while, но он сначала выполняет одну итерацию и только потом проверяет верность утверждения:
while(false) { std::cout << “Hello! n”; } do { std::cout << “Bye! n”; } while(false);
Вот результат:
Если для работы цикла нужен счётчик, то его запись можно сократить с помощью цикла for, записав логику в скобки:
Вот пример такого цикла:
int sum = 0; for(int i = 0; i < 200; i++) { sum += i; } std::cout << “sum = ” << sum << “n”;
В результате мы получим сумму всех чисел от 1 до 200:
Циклы, как и другие конструкции, можно размещать внутри других циклов. Вот, например, как вывести сетку с помощью for:
for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { std::cout << ” + “; } std::cout << “n”; }
Получаем результат:
Важно! Операторы break и continue влияют на тот цикл, в котором они находятся, а не на родительский.
Циклы – одни из самых часто используемых конструкций в программировании. Они нужны при чтении данных из файлов, сортировке, отрисовке графики и так далее. Одно из самых полезных применений циклов связано с массивами, о работе с которыми будет отдельная статья.
Если вы хотите изучить самые востребованные особенности C++ и стать профессиональным программистом, то записывайтесь на наш курс по разработке на C++. Вы не только изучите теорию, но и выполните массу практических заданий, получите по ним обратную связь и сможете избежать тонны ошибок.
Вы пройдёте полный курс по С++ и прикладной курс по Unreal Engine 4. Вы научитесь работать с многопоточностью, использовать инструменты и средства разработки: Git, GCC, GDB. Вам будет проще найти работу программиста в геймдеве.
1409
Источник
Операторы цикла выполняют блок кода заданное число раз, либо до тех пор, пока не выполнится заданное условие.
Циклы особенно удобны, когда нужно выполнять один и тот же код много раз, каждый раз с разным значением.
Часто операторы цикла используются при работе с массивами.
Так, вместо того чтобы писать:
text += cars[0] + “<br>”; text += cars[1] + “<br>”; text += cars[2] + “<br>”; text += cars[3] + “<br>”; text += cars[4] + “<br>”; text += cars[5] + “<br>”;
Можно написать:
var i; for (i = 0; i < cars.length; i++) { text += cars[i] + “<br>”; }
Различные виды операторов цикла
JavaScript поддерживает различные виды циклов:
- for – в цикле выполняет блок кода заданное число раз
- for/in – цикл по свойствам объекта
- while – выполняет блок кода до тех пор, пока заданное условие не будет равно true
- do/while – также выполняет блок кода до тех пор, пока заданное условие не будет равно true
Оператор цикла for
Оператор for это наиболее часто используемый инструмент для создания цикла.
Оператор цикла for имеет следующий синтаксис:
for (выражение 1; выражение 2; выражение 3) {
выполняемый блок кода
}
Выражение 1 выполняется до начала цикла (до начала выполнения блока кода).
Выражение 2 определяет условие продолжения цикла.
Выражение 3 выполняется после каждого прохода цикла.
Пример:
for (i = 0; i < 5; i++) { text += “Число: ” + i + “<br>”; }
Код этого примера можно прочитать следующим образом:
- выражение 1 до начала цикла инициализирует переменную-счетчик (var i = 0).
- выражение 2 определяет условие продолжения цикла (i должно быть меньше 5).
- выражение 3 после каждого прохода цикла увеличивает на 1 счетчик (i++).
Выражение 1
Обычно, выражение 1 используется для инициализации переменной, которая будет использоваться внутри цикла, как правило в качестве счетчика (i = 0).
При этом выражение 1 является необязательным.
Можно в выражении 1 инициализировать несколько переменных (разделяя их запятыми):
for (i = 0, len = cars.length, text = “”; i < len; i++) { text += cars[i] + “<br>”; }
Можно пропустить выражение 1 (и определить все необходимые значения до самого цикла):
var i = 2; var len = cars.length; var text = “”; for (; i < len; i++) { text += cars[i] + “<br>”; }
Выражение 2
Часто выражение 2 используется для вычисления состояния переменной-счетчика.
При этом выражение 2 также является необязательным.
Если выражение 2 возвращает true, то начнется новый цикл. Если оно вернет false, то цикл закончится.
Внимание! Если выражение 2 не определяется, то внутри цикла должен быть задан оператор break. Иначе цикл никогда не закончится, что приведет к краху браузера.
Выражение 3
Обычно, в выражении 3 изменяется значение переменной-счетчика.
При этом выражение 3 также является необязательным.
Выражение 3 может выполнять любые действия, например, уменьшение (i–), увеличение (i = i + 15) и т.д.
Выражение 3 может быть пропущено (например, если вычисления с переменной-счетчиком осуществляются внутри цикла):
var i = 0; var len = cars.length; for (; i < len; ) { text += cars[i] + “<br>”; i++; }
Оператор цикла for/in
Оператор for/in используется для обхода в цикле свойств объекта:
var person = {fname:”Иван”, lname:”Петров”, age:25}; var text = “”; var x; for (x in person) { text += person[x]; }
Оператор цикла while
Оператор while в цикле выполняет блок кода до тех пор, пока заданное условие равно true.
Синтаксис:
while (условие) {
выполняемый блок кода
}
В следующем примере код цикла будет выполняться снова и снова, пока значение переменной (i) будет меньше 10:
while (i < 10) { text += “Число: ” + i; i++; }
Внимание! Если вы забудете увеличить переменную, указанную в условии, то цикл никогда не закончится. Это приведет к краху браузера.
Оператор цикла do/while
Цикл do/while является вариантом цикла while. Этот цикл один раз выполнит блок кода перед проверкой условия завершения и затем будет повторять цикл до тех пор, пока условие не будет равно true.
Синтаксис:
do {
выполняемый блок кода
}
while (условие);
В следующем примере используется оператор цикла do/while. Такой цикл будет всегда выполняться по меньшей мере один раз, даже если условие равно false, потому что блок кода выполняется до проверки условия:
do { text += “Число: ” + i; i++; } while (i < 10);
Не забывайте изменять значение переменной, используемой в условии завершения цикла, иначе цикл никогда не закончится!
For vs While
Если вы внимательно изучили эту главу, то вы, вероятно, заметили, что оператор цикла while практически идентичен оператору цикла for, у которого не используются выражение 1 и выражение 3.
В следующем примере для вывода названий машин из массива cars используется оператор цикла for:
var cars = [“BMW”, “Volvo”, “Saab”, “Ford”]; var i = 0; var text = “”; for (;cars[i];) { text += cars[i] + “<br>”; i++; }
В следующем примере для вывода названий машин из массива cars используется оператор цикла while:
var cars = [“BMW”, “Volvo”, “Saab”, “Ford”]; var i = 0; var text = “”; while (cars[i]) { text += cars[i] + “<br>”; i++; }
Операторы break и continue
Оператор break позволяет “выпрыгнуть” из цикла.
Оператор continue позволяет “перепрыгнуть” через один проход цикла.
Оператор break
В предыдущих главах этого учебника вы уже встречались с оператором break. Он использовался для “выпрыгивания” из оператора условия switch.
Также, оператор break может использоваться и для “выпрыгивания” из цикла.
Оператор break прерывает цикл и передает выполнение коду, следующему после оператора цикла (если есть):
for (i = 0; i < 10; i++) { if (i === 3) { break; } text += “Число: ” + i + “<br>”; }
Оператор continue
Оператор continue прекращает текущий проход цикла, если выполняется заданное условие, и начинает следующую итерацию цикла.
В следующем примере пропускается значение 3:
for (i = 0; i < 10; i++) { if (i === 3) { continue; } text += “Число: ” + i + “<br>”; }
Метки
Чтобы определить метку в JavaScript, вы должны перед выражением указать имя метки с двоеточием:
Операторы break и continue единственные операторы в JavaScript, которые могут “выпрыгивать” из блока кода.
Синтаксис:
break имя_метки;
continue имя_метки;
Оператор continue (с ссылкой на метку или без) единственный способ пропустить один проход цикла.
Оператор break (без ссылки на метку) единственный способ выйти из цикла или условного оператора switch.
Оператор break с ссылкой на метку позволяет выйти из любого блока кода и перейти в конкретное место программы:
var cars = [“BMW”, “Volvo”, “Saab”, “Ford”]; list: { text += cars[0] + “<br>”; text += cars[1] + “<br>”; text += cars[2] + “<br>”; break list; text += cars[3] + “<br>”; text += cars[4] + “<br>”; text += cars[5] + “<br>”; }
Стоит напомнить, что блок кода – это код, расположенный внутри фигурных скобок { и }.
Преобразование типов Вверх Условные операторы If и Switch
Источник