В большинстве языков программирования цикл while — это оператор потока управления , который позволяет многократно выполнять код на основе заданного логического условия. Цикл while можно рассматривать как повторяющийся оператор if .
Конструкция while состоит из блока кода и условия/выражения. [1] Условие/выражение оценивается, и если условие/выражение истинно , [1] выполняется весь код в блоке. Это повторяется до тех пор, пока условие/выражение не станет ложным . Поскольку цикл while проверяет условие/выражение до выполнения блока, управляющую структуру часто также называют циклом предварительного тестирования . Сравните это с циклом do while , который проверяет условие/выражение после выполнения цикла.
Например, в языках C , Java , C# , [2] Objective-C и C++ (которые в данном случае используют тот же синтаксис ) фрагмент кода
int x = 0 ; пока ( x < 5 ) { printf ( "x = %d \n " , x ); x ++ ; }
сначала проверяется, меньше ли x 5 (что так и есть), затем вводится {тело цикла}, где запускается функция printf , а x увеличивается на 1. После завершения всех операторов в теле цикла снова проверяется условие (x < 5), и цикл выполняется снова, этот процесс повторяется до тех пор, пока переменная x не примет значение 5.
Возможно, а в некоторых случаях и желательно, чтобы условие всегда оценивалось как истинное, создавая бесконечный цикл . Когда такой цикл создается намеренно, обычно есть другая структура управления (например, оператор break ), которая управляет завершением цикла. Например:
while ( true ) { // делаем сложные вещи if ( someCondition ) break ; // еще что-нибудь }
Эти циклы while вычисляют факториал числа 5:
var counter : int = 5 ; var factorial : int = 1 ; пока ( счетчик > 1 ) { факториал *= счетчик ; счетчик --; } Printf ( "Факториал = %d" , факториал );
с Ada.Integer_Text_IO ;процедура Factorial is Counter : Integer := 5 ; Factorial : Integer := 1 ; begin while Counter > 0 loop Factorial := Factorial * Counter ; Counter := Counter - 1 ; end loop ; Ada.Integer_Text_IO.Put ( Факториал ) ; end Факториал ;
счетчик ← 5 факториал ← 1 : Пока счетчик > 0 факториал × ← счетчик счетчик - ← 1 : EndWhile ⎕ ← факториал
или просто
! 5
счетчик := 5 факториал := 1Пока счетчик > 0 факториал *= счетчик --MsgBox % факториал
счетчик = 5 ' Счетчик = 5 факториал = 1 ' начальное значение переменной "факториал" Пока счетчик > 0 факториал = факториал * счетчик счетчик = счетчик - 1 TextWindow.WriteLine ( counter ) EndWhile
Dim counter As Integer = 5 ' инициализация переменной и установка значения Dim factorial As Integer = 1 ' инициализация переменной factorial Do While counter > 0 factorial = factorial * counter counter = counter - 1 Loop ' программа выполняется здесь, пока counter = 0 'Debug.Print factorial' Console.WriteLine(factorial) в Visual Basic .NET
счетчик = 5 факториал = 1 пока [ $counter -gt 0 ] ; сделать факториал = $(( факториал * счетчик )) счетчик = $(( счетчик - 1 )) сделано эхо $факториал
int main () { int count = 5 ; int factorial = 1 ; пока ( количество > 1 ) факториал *= количество -- ; printf ( "%d" , факториал ); }
счетчик = 5 ; факториал = 1 ;пока ( счетчик > 1 ) { факториал *= счетчик -- ; }writeOutput ( факториал );
<cfset counter = 5 > <cfset factorial = 1 > <cfloop condition = "counter GT 1" > <cfset factorial *= counter -- > </cfloop> <cfoutput> # factorial # </cfoutput>
программа FactorialProg целое число :: счетчик = 5 целое число :: факториал = 1 do while ( counter > 0 ) факториал = факториал * counter counter = counter - 1 end do распечатать * , факториал конец программы FactorialProg
В Go нет оператора while , но он выполняет функцию оператора for при пропуске некоторых элементов оператора for .
счетчик , факториал := 5 , 1 для счетчика > 1 { счетчик , факториал = счетчик - 1 , факториал * счетчик }
Код цикла одинаков для Java, C# и D:
int счетчик = 5 ; int факториал = 1 ; пока ( счетчик > 1 ) факториал *= счетчик -- ;
пусть счетчик = 5 ; пусть факториал = 1 ; пока ( счетчик > 1 ) факториал *= счетчик -- ; console.log ( факториал ) ;
счетчик = 5 факториал = 1пока счетчик > 0 делать факториал = факториал * счетчик счетчик = счетчик - 1 конецпечать ( факториал )
счетчик = 5 ; факториал = 1 ; while ( counter > 0 ) factorial = factorial * counter ; %Умножить counter = counter - 1 ; %Уменьшить end факториал
Блок [{ counter = 5 , factorial = 1 }, (*локализовать counter и factorial*) While [ counter > 0 , (*цикл While*) factorial *= counter ; (*Умножение*) counter -- ; (*Уменьшение*) ]; факториал ]
MODULE Factorial ; IMPORT Out ; VAR Counter , Factorial : INTEGER ; BEGIN Counter := 5 ; Factorial := 1 ; WHILE Счетчик > 0 DO Факториал := Факториал * Счетчик ; DEC ( Счетчик ) END ; Out.Int ( Факториал , 0 ) END Факториал .
int $counter = 5 ; int $factorial = 1 ; int $умножение ; пока ( $counter > 0 ) { $умножение = $факториал * $counter ; $counter -= 1 ; print ( "Счетчик равен: " + $counter + ", умножение равно: " + $multiplication + "\n" ); }
var counter = 5 # Установить значение счетчика на 5 factorial = 1 # Установить значение факториала на 1 while counter > 0 : # Пока counter больше 0 factorial *= counter # Устанавливаем новое значение factorial для counter. dec counter # Устанавливаем counter равным counter - 1. эхо- факториал
Незавершающийся цикл while:
while true : echo "Помогите! Я застрял в цикле!"
В Pascal есть две формы цикла while, while и repeat . While повторяет один оператор (если он не заключен в блок begin-end) до тех пор, пока условие истинно. Оператор repeat многократно выполняет блок из одного или нескольких операторов через оператор until и продолжает повторяться, если условие не ложно. Основное различие между ними заключается в том, что цикл while может выполняться ноль раз, если условие изначально ложно, а цикл repeat-until всегда выполняется хотя бы один раз.
программа Факториал1 ; вар Fv : целое число ; процедура факт ( счетчик : целое число ) ; var Факториал : целое число ; начать Факториал := 1 ; while Counter > 0 do begin Факториал := Факториал * Счетчик ; Счетчик := Счетчик - 1 end ; WriteLn ( Факториал ) конец ; begin Write ( 'Введите число, чтобы вернуть его факториал: ' ) ; readln ( fv ) ; repeat fact ( fv ) ; Write ( 'Введите другое число, чтобы вернуть его факториал (или 0 для выхода): ' ) ; until fv = 0 ; end .
мой $counter = 5 ; мой $factorial = 1 ; while ( $counter > 0 ) { $factorial *= $counter -- ; # Умножить, затем уменьшить } распечатать $факториал ;
Циклы While часто используются для построчного чтения данных (в соответствии с $/
разделителем строк) из открытых файловых дескрипторов:
открыть IN , "<test.txt" ; в то время как ( <IN> ) { печать ; } закрыть В ;
$счетчик = 5 ; $факториал = 1 ;while ( $counter > 0 ) { $factorial *= $counter -- ; // Умножаем, затем уменьшаем. }echo $факториал ;
объявить счетчик фиксированным начальным ( 5 ) ;
объявить факториал фиксированным начальным ( 1 ) ;do while ( counter > 0 ) факториал = факториал * counter ; counter = counter - 1 ; end ;
counter = 5 # Установите значение 5 factorial = 1 # Установите значение 1while counter > 0 : # Пока counter(5) больше 0 factorial *= counter # Устанавливаем новое значение factorial для counter. counter -= 1 # Устанавливаем counter на counter - 1.print ( factorial ) # Вывести значение факториала.
Незавершающийся цикл while:
while True : print ( "Помогите! Я застрял в цикле!" )
В Racket, как и в других реализациях Scheme , именованный let является популярным способом реализации циклов:
#lang racket ( define counter 5 ) ( define factorial 1 ) ( let loop () ( when ( > counter 0 ) ( set! factorial ( * factorial counter )) ( set! counter ( sub1 counter )) ( loop ))) ( displayln factorial )
Используя макросистему, реализация цикла while является тривиальным упражнением (обычно используемым для знакомства с макросами):
#lang racket ( define-syntax-rule ( while test body ... ) ; реализует цикл while ( let loop () ( when test body ... ( loop )))) ( define counter 5 ) ( define factorial 1 ) ( while ( > counter 0 ) ( set! factorial ( * factorial counter )) ( set! counter ( sub1 counter ))) ( displayln factorial )
Однако императивный стиль программирования часто не приветствуется в Scheme и Racket.
# Вычислить факториал числа 5 i = 1 факториал = 1 пока i <= 5 факториал *= i i += 1 конец ставит факториал
fn main () { пусть счетчик mut = 5 ; пусть факториал mut = 1 ; пока счетчик > 1 { факториал *= счетчик ; счетчик -= 1 ; } println! ( "{}" , факториал ); }
В отличие от других языков, в Smalltalk цикл while не является языковой конструкцией , а определяется в классе BlockClosure
как метод с одним параметром, телом в качестве замыкания , использующим self в качестве условия.
В Smalltalk также есть соответствующий метод whileFalse:.
| count factorial | count := 5 . factorial := 1 .
[ count > 0 ] whileTrue: [ factorial := factorial * count . count := count - 1 ] . Транскрипт show: factorial
var counter = 5 // Устанавливаем начальное значение счетчика равным 5 var factorial = 1 // Устанавливаем начальное значение факториала равным 1while counter > 0 { // Пока counter(5) больше 0 factorial *= counter // Устанавливаем новое значение factorial равным factorial x counter. counter -= 1 // Устанавливаем новое значение counter равным counter - 1. }print ( factorial ) // Вывести значение факториала.
установить счетчик 5 установить факториал 1 в то время как { $counter > 0 } { set factorial [expr $factorial * $counter ] incr counter - 1 } помещает $факториал
int счетчик = 5 ; int факториал = 1 ; пока ( счетчик > 1 ) факториал *= счетчик -- ; printf ( "%d" , факториал );
$счетчик = 5 $факториал = 1пока ( $counter ) { $factorial *= $counter -- }$факториал
While [3] — это простой язык программирования, построенный на присваиваниях, последовательной композиции, условных операторах и операторах while, используемый в теоретическом анализе семантики императивного языка программирования . [4] [5]
С := 5 ; Ф := 1 ;пока ( C > 1 ) делать F := F * C ; C := C - 1 ;