Jump to content

While loop

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by 157.50.15.149 (talk) at 03:34, 9 July 2017 (Pascal: By to change the program as correctly). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

While loop flow diagram

In most computer programming languages, a while loop is a control flow statement that allows code to be executed repeatedly based on a given Boolean condition. The while loop can be thought of as a repeating if statement.

Overview

The while construct consists of a block of code and a condition/expression.[1] The condition/expression is evaluated, and if the condition/expression is true,[1] the code within the block is executed. This repeats until the condition/expression becomes false. Because the while loop checks the condition/expression before the block is executed, the control structure is often also known as a pre-test loop. Compare this with the do while loop, which tests the condition/expression after the loop has executed.

For example, in the C programming language (as well as Java, C#,[2] Objective-C, and C++, which use the same syntax in this case), the code fragment

int x = 0;
while (x < 5) 
{
    printf ("x = %d\n", x);
    x++;
}

first checks whether x is less than 5, which it is, so then the {loop body} is entered, where the printf function is run and x is incremented by 1. After completing all the statements in the loop body, the condition, (x < 5), is checked again, and the loop is executed again, this process repeating until the variable x has the value 5.

Note that it is possible, and in some cases desirable, for the condition to always evaluate to true, creating an infinite loop. When such a loop is created intentionally, there is usually another control structure (such as a break statement) that controls termination of the loop. For example:

while (true) 
{
    //do complicated stuff
    if (someCondition) break;
    //more stuff
}

Equivalent constructs

In the C programming language,

while (condition) 
{
   statements;
}

is equivalent to

if (condition) 
{
   do 
   {
      statements;
   } while (condition);
}

or

while (true) 
{
   if (!condition) break;
   statements;
}

or

   goto TEST;
LOOPSTART:
   statements;
TEST:
   if (condition) goto LOOPSTART;

or

TEST:
   if (!condition) goto LOOPEND;
   statements
   goto TEST;
LOOPEND:

Those last two are not recommended because the use of "goto" statements makes it hard for a programmer to understand the flow of control, and is generally regarded as a last resort.

Also, in C and its descendants, a while loop is a for loop with no initialization or counting expressions, i.e.,

for ( ; condition; )
{
   statements;
}

Demonstrating while loops

These while loops will calculate the factorial of the number 5:

var counter:int = 5;
var factorial:int = 1;

while ( counter > 1 )
{
  factorial *= counter;
  counter--;
}
Printf ("Factorial =%d", factorial);
with Ada.Integer_Text_IO;

procedure 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 (Factorial);
end Factorial;

Basic (Visual Basic)

Dim counter As Integer = 5    ' init variable and set value
Dim factorial As Integer = 1  ' initialize factorial variable

Do While counter > 0
    factorial = factorial * counter
    counter = counter - 1
Loop     ' program goes here, until counter = 0

'Debug.Print factorial         ' Console.WriteLine(factorial) in Visual Basic .NET
counter=5
factorial=1
while [ $counter -gt 0 ]; do
    factorial=$((factorial * counter))
    counter=$((counter - 1))
done

echo $factorial

C or C++

int main(void)
{
    int counter = 5;
    long factorial = 1;
 
    while (counter > 1)
    {
        factorial *= counter--;
    }
    printf("%d", factorial);
    return 0;
}

Script syntax

counter = 5;
factorial = 1;
 
while ( counter > 1 ){
    factorial *= counter--;
}
writeOutput(factorial);

Tag syntax

<cfset counter = 5>
<cfset factorial = 1>
<cfloop condition="counter GT 1">
    <cfset factorial *= counter-->
</cfloop>
<cfoutput>#factorial#</cfoutput>
program FactorialProg
  integer :: counter = 5
  integer :: factorial = 1
  do while (counter > 0)
    factorial = factorial * counter
    counter = counter - 1
  end do
  print *, factorial
end program FactorialProg

The code for the loop is the same for Java, C# and D:

int counter = 5;
long factorial = 1;

while (counter > 1)
{
   factorial *= counter--;
}

For Java the result is printed as follows:

System.out.println(factorial);

The same in C#

System.Console.WriteLine(factorial);

And finally in D

writefln(factorial);
var counter = 5;
var factorial = 1;

while ( counter > 1 )
{
  factorial *= counter--;
}

document.write(factorial);
counter = 5
factorial = 1

while counter > 0 do
  factorial = factorial * counter
  counter = counter - 1
end

print(factorial)
counter = 5;
factorial = 1;

while (counter > 0)
  factorial = factorial * counter;      %Multiply
  counter = counter - 1;                %Decrement
end

factorial
 Block[{counter=5,factorial=1},          (*localize counter and factorial*)
         While[counter>0,                (*While loop*)
                factorial*=counter;      (*Multiply*)
                counter--;               (*Decrement*)
              ];
      factorial
     ]
MODULE Factorial;
IMPORT Out;
VAR
  Counter, Factorial: INTEGER;
BEGIN
  Counter := 5;
  Factorial := 1;
  WHILE Counter > 0 DO
    Factorial := Factorial * Counter;
    DEC(Counter)
  END;
  Out.Int(Factorial,0)
END Factorial.
int $counter = 5;
int $factorial = 1;

int $multiplication;

while ($counter > 0)
{
    $multiplication = ($factorial * $counter);
     
    $counter -= 1;
    
    print ("Counter is: " + $counter + ", multiplication is: " + $multiplication + "\n");
}
program Factorial1;
var
  Counter, Factorial: integer;
begin
  Counter := 5;
  Factorial := 1;
  while Counter > 0 do;;;;
  begin
    Factorial := Factorial * Counter;
    Counter := Counter - 1
  end;
  WriteLn(Factorial)
end.
my $counter   = 5;
my $factorial = 1;

while ( $counter > 0 ) {
    $factorial *= $counter--; # Multiply, then decrement
}

print $factorial;

While loops are frequently used for reading data line by line (as defined by the $/ line separator) from open filehandles:

open IN, "<test.txt";
while ( <IN> ) {
  print;
}
close IN;
$counter = 5;
$factorial = 1;
while($counter > 0) {
  $factorial *= $counter; // Multiply first.
  $counter--; // then decrement.
}
print $factorial;
declare counter   fixed initial(5);
declare factorial fixed initial(1);

do while(counter > 0)
  factorial = factorial * counter;
  counter = counter - 1;
  end;
counter = 5                           # Set the value to 5 
factorial = 1                         # Set the value to 1

while counter > 0:                    # While counter(5) is greater than 0  
    factorial *= counter              # Set new value of factorial to 
                                      # factorial x counter.
    
    counter -= 1                      # Set the new value of counter to
                                      # counter - 1.

print(factorial)                      # Print the value of factorial.

Non-terminating while loop:

while True:
    print("Help! I'm stuck in a loop!")

In Racket, as in other Scheme implementations, a named-let is a popular way to implement loops:

#lang racket
(define counter 5)
(define factorial 1)
(let loop ()
  (when (> counter 0)
    (set! factorial (* factorial counter))
    (set! counter (sub1 counter))
    (loop)))
(displayln factorial)

Using a macro system, implementing a while loop is a trivial exercise (commonly used to introduce macros):

#lang racket
(define-syntax-rule (while test body ...) ; implements a while loop
  (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)

But note that an imperative programming style is often discouraged in Racket (as in Scheme).

# Calculate the factorial of 5
i = 1
factorial = 1
while i < 5
  factorial *= i
  i += 1
end
puts factorial

Contrary to other languages, in Smalltalk a while loop is not a language construct but defined in the class BlockClosure as a method with one parameter, the body as a closure, using self as the condition.

Smalltalk also has a corresponding whileFalse: method.

| count factorial |
count := 5.
factorial := 1.
[ count > 0 ] whileTrue: 
    [ factorial := factorial * count.
    count := count - 1 ].
Transcript show: factorial
var counter = 5                 // Set the value to 5 
var factorial = 1               // Set the value to 1

while counter > 0 {             // While counter(5) is greater than 0  
    factorial *= counter        // Set new value of factorial to factorial x counter.
    counter -= 1                // Set the new value of counter to  counter - 1.
}

print(factorial)                // Print the value of factorial.
set counter 5
set factorial 1

while {$counter > 0} {
  set factorial [expr $factorial * $counter] 
  incr counter -1 
}

puts $factorial
int counter = 5;
int factorial = 1;
while (counter > 1)
   factorial *= counter--;

printf("%d", factorial);
$number = 5
$counter = $number
$factorial = 1
while ($counter) {
    $factorial *= $counter--
}
$factorial

While programming language

The While programming language[3] is a simple programming language constructed from assignments, sequential composition, conditionals and while statements, used in the theoretical analysis of imperative programming language semantics.[4][5]

C := 5;
F := 1;
while (C > 1) do
    F := F * C;
    C := C - 1;

See also

References

  1. ^ a b "The while and do-while Statements (The Java™ Tutorials > Learning the Java Language > Language Basics)". Dosc.oracle.com. Retrieved 2016-10-21. {{cite web}}: Cite has empty unknown parameter: |dead-url= (help)
  2. ^ "while (C# reference)". Msdn.microsoft.com. Retrieved 2016-10-21.
  3. ^ "Chapter 3 : The While programming language" (PDF). Profs.sci.univr.it. Retrieved 2016-10-21.
  4. ^ Flemming Nielson; Hanne R. Nielson; Chris Hankin (1999). Principles of Program Analysis. Springer. ISBN 978-3-540-65410-0. Retrieved 29 May 2013.
  5. ^ Illingworth, Valerie (11 December 1997). Dictionary of Computing. Oxford Paperback Reference (4th ed.). Oxford University Press. ISBN 9780192800466.