Циклы типа while end
- 07/20/2015
- Чтение занимает 3 мин
В этой статье
Выполняет последовательность операторов, если заданное условие имеет значение True .Runs a series of statements as long as a given condition is True.
СинтаксисSyntax
While condition
[ statements ]
[ Continue While ]
[ statements ]
[ Exit While ]
[ statements ]
End While
КомпонентыParts
ТерминTerm | ОпределениеDefinition |
---|---|
condition | Обязательный.Required. Выражение Boolean.Boolean expression. Если condition имеет значение Nothing , Visual Basic обрабатывает его как False .If condition is Nothing, Visual Basic treats it as False. |
statements | Необязательный элемент.Optional. Один или несколько следующих инструкций While , которые выполняются каждый раз, condition — True .One or more statements following While, which run every time condition is True. |
Continue While | Необязательный элемент.Optional. Передает управление следующей итерации While блока.Transfers control to the next iteration of the While block. |
Exit While | Необязательный элемент.Optional. Передает управление за пределы While блока.Transfers control out of the While block. |
End While | Обязательный элемент.Required. Завершает определение блока While.Terminates the definition of the While block. |
Используйте While…End While структуру, если необходимо повторить набор инструкций неопределенное количество раз, если условие остается True .Use a While…End While structure when you want to repeat a set of statements an indefinite number of times, as long as a condition remains True. Если вы хотите обеспечить большую гибкость при тестировании условия или результата тестирования, вы можете предпочесть оператору Do… Loop, инструкция.If you want more flexibility with where you test the condition or what result you test it for, you might prefer the Do…Loop Statement. Если нужно повторить инструкции заданное число раз, то для… Обычно лучше подходит следующий оператор.If you want to repeat the statements a set number of times, the For…Next Statement is usually a better choice.
Если condition имеет значение True , все statements выполняется до тех пор, пока End While не будет обнаружен оператор.If condition is True, all of the statements run until the End While statement is encountered. Затем элемент управления возвращается в While инструкцию и condition снова проверяется.Control then returns to the While statement, and condition is again checked. Если condition по-прежнему True , процесс повторяется.If condition is still True, the process is repeated. Если это так False , управление передается оператору, следующему за End While оператором.If it’s False, control passes to the statement that follows the End While statement.
WhileОператор всегда проверяет условие перед началом цикла.The While statement always checks the condition before it starts the loop. Цикл продолжается, пока условие остается True .Looping continues while the condition remains True. Если параметр condition имеет значение False при первом входе в цикл, он не выполняется даже один раз.If condition is False when you first enter the loop, it doesn’t run even once.
conditionОбычно результат сравнения двух значений, но может быть любым выражением, результатом вычисления которого является логическое значение типа данных ( True или False ).The condition usually results from a comparison of two values, but it can be any expression that evaluates to a Boolean Data Type value (True or False). Это выражение может включать в себя значение другого типа данных, например числовой тип, который был преобразован в Boolean .This expression can include a value of another data type, such as a numeric type, that has been converted to Boolean.
Можно вложить While циклы, поместив один цикл в другой.You can nest While loops by placing one loop within another. Можно также вкладывать различные виды управляющих структур друг в друга.You can also nest different kinds of control structures within one another. Дополнительные сведения см. в разделе вложенные структуры управления.For more information, see Nested Control Structures.
Выйти, покаExit While
Оператор Exit While может предоставить другой способ выхода из While цикла.The Exit While statement can provide another way to exit a While loop. Exit While немедленно передает управление оператору, который следует за End While оператором.Exit While immediately transfers control to the statement that follows the End While statement.
Обычно используется Exit While после вычисления некоторого условия (например, в If…Then…Else структуре).You typically use Exit While after some condition is evaluated (for example, in an If…Then…Else structure). Может потребоваться выйти из цикла, если обнаруживается условие, которое делает ненужным или невозможным продолжение итераций, например ошибочное значение или запрос на завершение.You might want to exit a loop if you detect a condition that makes it unnecessary or impossible to continue iterating, such as an erroneous value or a termination request. Можно использовать Exit While при проверке условия, которое может вызвать бесконечный цикл, что является циклом, который может выполнять очень большое или даже бесконечное число раз.You can use Exit While when you test for a condition that could cause an endless loop, which is a loop that could run an extremely large or even infinite number of times. Затем можно использовать Exit While для экранирования цикла.You can then use Exit While to escape the loop.
Любое количество операторов можно разместить Exit While в любом месте While цикла.You can place any number of Exit While statements anywhere in the While loop.
При использовании внутри вложенных While циклов Exit While передает управление за пределы самого внутреннего цикла и в следующий более высокий уровень вложенности.When used within nested While loops, Exit While transfers control out of the innermost loop and into the next higher level of nesting.
Continue WhileОператор немедленно передает управление следующей итерации цикла.The Continue While statement immediately transfers control to the next iteration of the loop. Дополнительные сведения см. в разделе оператор continue.For more information, see Continue Statement.
ПримерExample
В следующем примере операторы в цикле продолжают выполняться до тех пор, пока index переменная не будет больше 10.In the following example, the statements in the loop continue to run until the index variable is greater than 10.
Dim index As Integer = 0
While index <= 10
Debug.Write(index.ToString & ” “)
index += 1
End While
Debug.WriteLine(“”)
‘ Output: 0 1 2 3 4 5 6 7 8 9 10
ПримерExample
В следующем примере показано использование Continue While Exit While операторов и.The following example illustrates the use of the Continue While and Exit While statements.
Dim index As Integer = 0
While index < 100000
index += 1
‘ If index is between 5 and 7, continue
‘ with the next iteration.
If index >= 5 And index <= 8 Then
Continue While
End If
‘ Display the index.
Debug.Write(index.ToString & ” “)
‘ If index is 10, exit the loop.
If index = 10 Then
Exit While
End If
End While
Debug.WriteLine(“”)
‘ Output: 1 2 3 4 9 10
ПримерExample
В следующем примере считываются все строки в текстовом файле.The following example reads all lines in a text file. OpenTextМетод открывает файл и возвращает объект StreamReader , считывающий символы.The OpenText method opens the file and returns a StreamReader that reads the characters. В While условии Peek метод StreamReader определяет, содержит ли файл дополнительные символы.In the While condition, the Peek method of the StreamReader determines whether the file contains additional characters.
Private Sub ShowText(ByVal textFilePath As String)
If System.IO.File.Exists(textFilePath) = False Then
Debug.WriteLine(“File Not Found: ” & textFilePath)
Else
Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath)
While sr.Peek() >= 0
Debug.WriteLine(sr.ReadLine())
End While
sr.Close()
End If
End Sub
См. такжеSee also
- Циклические структурыLoop Structures
- Оператор Do…LoopDo…Loop Statement
- Оператор For…NextFor…Next Statement
- Логический тип данныхBoolean Data Type
- Вложенные структуры управленияNested Control Structures
- Оператор ExitExit Statement
- Оператор ContinueContinue Statement
Источник
Разбираемся, как сократить повторяющийся код в 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!»:
while(i < 5)
{
std::cout << “Hello, World! n”;
i++;
}
Посмотрим на вывод:
Обратите внимание на переменную i — она играет роль счётчика, к которому в каждом шаге цикла прибавляется единица. Это нужно, чтобы инструкции выполнялись только определённое количество раз.
Один шаг цикла называется итерацией, а счётчик — итератором. Поэтому чаще всего для счётчика создаётся переменная i.
Важно! Следите за тем, чтобы выход из цикла был возможен, иначе он будет выполняться бесконечно.
Если внутри цикла складываются числа или что-то выводится, то нагрузка будет минимальной. Если же это какие-то ресурсозатратные вычисления, то выполнение такого цикла может заставить компьютер зависнуть.
Когда нам нужно вмешаться в работу цикла, мы используем операторы break и continue.
Оператор break прерывает выполнение цикла:
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, который прерывает циклы. Поэтому можно спокойно писать вот такой код:
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.
while(i < 100)
{
i++;
if(i % 3 == 0)
{
continue;
}
std::cout << ” ” << i;
}
std::cout << “n”;
Этот цикл выведет все числа от одного до ста, кроме тех, которые делятся на три без остатка.
Цикл do-while похож на while, но он сначала выполняет одну итерацию и только потом проверяет верность утверждения:
{
std::cout << “Hello! n”;
}
do
{
std::cout << “Bye! n”;
}
while(false);
Вот результат:
Если для работы цикла нужен счётчик, то его запись можно сократить с помощью цикла for, записав логику в скобки:
Вот пример такого цикла:
for(int i = 0; i < 200; i++)
{
sum += i;
}
std::cout << “sum = ” << sum << “n”;
В результате мы получим сумму всех чисел от 1 до 200:
Циклы, как и другие конструкции, можно размещать внутри других циклов. Вот, например, как вывести сетку с помощью for:
{
for(int j = 0; j < 10; j++)
{
std::cout << ” + “;
}
std::cout << “n”;
}
Получаем результат:
Важно! Операторы break и continue влияют на тот цикл, в котором они находятся, а не на родительский.
Циклы — одни из самых часто используемых конструкций в программировании. Они нужны при чтении данных из файлов, сортировке, отрисовке графики и так далее. Одно из самых полезных применений циклов связано с массивами, о работе с которыми будет отдельная статья.
Если вы хотите изучить самые востребованные особенности C++ и стать профессиональным программистом, то записывайтесь на наш курс по разработке на C++. Вы не только изучите теорию, но и выполните массу практических заданий, получите по ним обратную связь и сможете избежать тонны ошибок.
Вы пройдёте полный курс по С++ и прикладной курс по Unreal Engine 4. Вы научитесь работать с многопоточностью, использовать инструменты и средства разработки: Git, GCC, GDB. Вам будет проще найти работу программиста в геймдеве.
Источник
Обновл. 24 Сен 2020 |
На этом уроке мы детально рассмотрим цикл while, его конструкцию, особенности и использование.
Цикл while
Цикл while является самым простым из 4-х циклов, которые есть в языке C++. Он очень похож на ветвление if/else:
while (условие)
тело цикла;
Цикл while объявляется с использованием ключевого слова while. В начале цикла обрабатывается условие. Если его значением является true (любое ненулевое значение), то тогда выполняется тело цикла.
Однако, в отличие от оператора if, после завершения выполнения тела цикла, управление возвращается обратно к while и процесс проверки условия повторяется. Если условие опять является true, то тогда тело цикла выполняется еще раз.
Например, следующая программа выводит все числа от 0 до 9:
#include <iostream> int main() { int count = 0; while (count < 10) { std::cout << count << ” “; ++count; } std::cout << “done!”; return 0; } |
Результат выполнения программы:
0 1 2 3 4 5 6 7 8 9 done!
Рассмотрим детально эту программу. Во-первых, инициализируется переменная: int count = 0;. Условие 0 < 10 имеет значение true, поэтому выполняется тело цикла. В первом стейтменте мы выводим 0, а во втором — выполняем инкремент переменной count. Затем управление возвращается к началу цикла while для повторной проверки условия. Условие 1 < 10 имеет значение true, поэтому тело цикла выполняется еще раз. Тело цикла будет повторно выполняться до тех пор, пока переменная count не будет равна 10, только в том случае, когда результат условия 10 < 10 будет false, цикл завершится.
Тело цикла while может и вообще не выполняться, например:
#include <iostream> int main() { int count = 15; while (count < 10) { std::cout << count << ” “; ++count; } std::cout << “done!”; return 0; } |
Условие 15 < 10 сразу принимает значение false, и тело цикла пропускается. Единственное, что выведет эта программа:
done!
Бесконечные циклы
С другой стороны, если условие цикла всегда принимает значение true, то и сам цикл будет выполняться бесконечно. Это называется бесконечным циклом. Например:
#include <iostream> int main() { int count = 0; while (count < 10) // это условие никогда не будет false std::cout << count << ” “; // поэтому эта строка будет выполняться постоянно return 0; // а эта строка никогда не выполнится } |
Поскольку переменная count не увеличивается на единицу в этой программе, то условие count < 10 всегда будет true. Следовательно, цикл никогда не будет завершен, и программа будет постоянно выводить 0 0 0 0 0….
Мы можем преднамеренно объявить бесконечный цикл следующим образом:
while (1) // или while (true) { // Этот цикл будет выполняться бесконечно } |
Единственный способ выйти из бесконечного цикла — использовать операторы return, break, goto, выбросить исключение или воспользоваться функцией exit().
Программы, которые работают до тех пор, пока пользователь не решит остановить их, иногда преднамеренно используют бесконечные циклы вместе с операторами return, break или функцией exit() для завершения цикла. Распространена такая практика в серверных веб-приложениях, которые работают непрерывно и постоянно обслуживают веб-запросы.
Счетчик цикла while
Часто нам нужно будет, чтобы цикл выполнялся определенное количество раз. Для этого обычно используется переменная в виде счетчика цикла. Счетчик цикла — это целочисленная переменная, которая объявляется с единственной целью: считать, сколько раз выполнился цикл. В вышеприведенных примерах переменная count является счетчиком цикла.
Счетчикам цикла часто дают простые имена, такие как i, j или k. Однако в этих именах есть одна серьезная проблема. Если вы захотите узнать, где в вашей программе используется счетчик цикла и воспользуетесь функцией поиска символов i, j или k, то в результате получите половину своей программы, так как i, j или k используются во многих именах. Следовательно, лучше использовать iii, jjj или kkk в качестве имен для счетчиков. Они более уникальны, их значительно проще найти, и они выделяются в коде. А еще лучше использовать «реальные» имена для переменных, например, count или любое другое имя, которое предоставляет контекст использования этой переменной.
Также для счетчиков цикла лучше использовать тип signed int. Использование unsigned int может привести к неожиданным результатам. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> int main() { unsigned int count = 10; // Считаем от 10 к 0 while (count >= 0) { if (count == 0) std::cout << “blastoff!”; else std::cout << count << ” “; –count; } return 0; } |
Взгляните на эту программу еще раз и постарайтесь найти ошибку.
Оказывается, эта программа представляет собой бесконечный цикл. Она начинается с вывода 10 9 8 7 6 5 4 3 2 1 blastoff!, как и предполагалось, но затем «сходит с рельсов» и начинает отсчет с 4294967295. Почему? Потому что условие цикла count >= 0 никогда не будет ложным! Когда count = 0, то и условие 0 >= 0 имеет значение true, выводится blastoff, а затем выполняется декремент переменной count, происходит переполнение и значением переменной становится 4294967295. И так как условие 4294967295 >= 0 является истинным, то программа продолжает свое выполнение. А поскольку счетчик цикла является типа unsigned, то он никогда не сможет быть отрицательным, а так как он никогда не сможет быть отрицательным, то цикл никогда не завершится.
Правило: Всегда используйте тип signed int для счетчиков цикла.
Итерации
Каждое выполнение цикла называется итерацией (или «повтором»).
Поскольку тело цикла обычно является блоком, и поскольку этот блок выполняется по новой с каждым повтором, то любые переменные, объявленные внутри тела цикла, создаются, а затем и уничтожаются по новой. В следующем примере переменная z создается и уничтожается 6 раз:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream> int main() { int count = 1; int result = 0; // переменная result определена здесь, поскольку она нам понадобится позже (вне тела цикла) while (count <= 6) // итераций будет 6 { int z; // z создается здесь по новой с каждой итерацией std::cout << “Enter integer #” << count << ‘:’; std::cin >> z; result += z; // Увеличиваем значение счетчика цикла на единицу ++count; } // z уничтожается здесь по новой с каждой итерацией std::cout << “The sum of all numbers entered is: ” << result; return 0; } |
Для фундаментальных типов переменных это нормально. Для не фундаментальных типов переменных (таких как структуры или классы) это может сказаться на производительности. Следовательно, не фундаментальные типы переменных лучше определять перед циклом.
Обратите внимание, переменная count объявлена вне тела цикла. Это важно и необходимо, поскольку нам нужно, чтобы значение переменной сохранялось на протяжении всех итераций (не уничтожалось по новой с каждым повтором цикла).
Иногда нам может понадобиться выполнить что-то при достижении определенного количества итераций, например, вставить символ новой строки. Это легко осуществить, используя оператор остатка от деления со счетчиком цикла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <iostream> int main() { int count = 1; while (count <= 50) { // Выводим числа до 10 (перед каждым числом добавляем 0) if (count < 10) std::cout << “0” << count << ” “; else std::cout << count << ” “; // выводим остальные числа // Если счетчик цикла делится на 10 без остатка, то тогда вставляем символ новой строки if (count % 10 == 0) std::cout << “n”; // Увеличиваем значение счетчика цикла на единицу ++count; } return 0; } |
Результат выполнения программы:
01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
Вложенные циклы while
Также одни циклы while могут быть вложены внутри других циклов while. В следующем примере внутренний и внешний циклы имеют свои собственные счетчики. Однако, обратите внимание, условие внутреннего цикла использует счетчик внешнего цикла!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> int main() { int outer = 1; while (outer <= 5) { int inner = 1; while (inner <= outer) std::cout << inner++ << ” “; // Вставляем символ новой строки в конце каждого ряда std::cout << “n”; ++outer; } return 0; } |
Результат выполнения программы:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
Тест
Задание №1
Почему в программе, приведенной выше, переменная inner объявлена внутри блока while, а не сразу после объявления переменной outer (вне блока while)?
Ответ №1
Переменная inner объявлена внутри блока while так, чтобы она была восстановлена (и повторно инициализирована значением 1) каждый раз, когда выполняется внешний цикл. Если бы переменная inner была объявлена вне внешнего цикла while, то её значение никогда не было бы сброшено до 1, или нам бы пришлось это сделать самостоятельно с помощью операции присваивания. Кроме того, поскольку переменная inner используется только внутри внешнего цикла while, то имеет смысл объявить её именно там. Помните, что переменные нужно объявлять максимально близко к их первому использованию!
Задание №2
Напишите программу, которая выводит буквы английского алфавита от a до z вместе с кодами из ASCII-таблицы.
Подсказка: Чтобы выводить символы как целые числа — используйте оператор static_cast.
Ответ №2
#include <iostream> int main() { char mychar = ‘a’; while (mychar <= ‘z’) { std::cout << mychar << ” ” << static_cast<int>(mychar) << “n”; ++mychar; } return 0; } |
Задание №3
Измените программу из последнего подраздела «Вложенные циклы» так, чтобы она выводила следующее:
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1
Ответ №3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> int main() { int outer = 5; while (outer >= 1) { int inner = outer; while (inner >= 1) std::cout << inner– << ” “; // Вставляем символ новой строки в конце каждого ряда std::cout << “n”; –outer; } return 0; } |
Задание №4
Теперь сделайте так, чтобы цифры выводились следующим образом (используя программу из предыдущего задания):
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
Подсказка: Разберитесь сначала, как вывести числа следующим образом:
X X X X 1
X X X 2 1
X X 3 2 1
X 4 3 2 1
5 4 3 2 1
Ответ №4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> int main() { // Цикл с 1 до 5 int outer = 1; while (outer <= 5) { // Числа в рядах появляются в порядке убывания, поэтому цикл начинаем с 5 и до 1 int inner = 5; while (inner >= 1) { // Первое число в любом ряде совпадает с номером этого ряда, // поэтому числа должны выводиться только если <= номера ряда (в противном случае, выводится пробел) if (inner <= outer) std::cout << inner << ” “; else std::cout << ” “; // вставляем дополнительные пробелы –inner; } // Этот ряд вывели, переходим к следующему std::cout << “n”; ++outer; } } |
Оценить статью:
Загрузка…
Источник