Looping

Top  Previous  Next

Why loops are used in programming

One of the main reasons for using computers is to save the tedium of many repetitive tasks. One of the main uses of loops in programs is to carrry out such repetitive tasks. A loop will execute one or more lines of code (statements) as many times as you want.
Your choice of loop type depends on how you want to control and terminate the looping.
 
FOR loop

This is the most common loop type. For loops are executed a fixed number of times, determined by a count. They terminate when the count is exhausted. The count (loop) is held in a variable that can be used in the loop. The count can proceed upwards or downwards, but always does so by a value of 1 unit. This count variable can be a number or even an enumeration.
COUNT

Here is a simple example counting up using numeric values in SmartMS:

procedure TForm1.W3Button1Click(Sender: TObject);

var

count : Integer;

begin

For count := 1 to 5 do

ShowMessage(Format('Count is now %d',[count]));

end;

OBS: The ShowMessageFmt routine is useful for displaying information in Delphi.

In SmartMS you should use ShowMessage + Format.

Result is:

Count is now 1

Count is now 2

Count is now 3

Count is now 4

Count is now 5

---------------

mytoggle_plus1See the JS code generated:

function W3Button1Click(Self, Sender$5) {

      var count = 0;

      for(count = 1;count<=5;count++) {

         alert(("Count is now "+count.toString()));

      }

   }

 

 

 

ENUMERATIONS

 

Enumerations (see Enumeration and sets to explore) are very readable ways of assigning values to variables by name. 

They can also be used to control For loops:

 

type

  TWeekDay = (Monday = 1, Tuesday, Wednesday, Thursday, Friday);

 

procedure TForm1.W3Button1Click(Sender: TObject);

var

  weekday: TWeekDay;

  hours: array[TWeekDayof Integer;

begin

  // Set up the hours every day to zero

  for weekDay := Monday to Friday do

    hours[weekDay] := 0;

 

  // Add an hour of overtime to the working hours on Tuesday to Thursday

  for weekDay := Tuesday to Thursday do

    Inc(hours[weekDay]);

end;

Result is:

hours[Monday]   = 0

hours[Tuesday]  = 1

hours[Wednesday]= 1

hours[Thursday] = 1

hours[Friday]   = 0

--------------------
Note the use of the Inc routine to increment the hours.

 

mytoggle_plus1See the JS code generated:

// TWeekDay enumeration

var TWeekDay = { 1:"Monday"2:"Tuesday"3:"Wednesday"4:"Thursday"5:"Friday" };

 

function W3Button1Click(Self, Sender$5) {

      var weekday = 0;

      var hours = [0,0,0,0,0];

      for(weekday = 1;weekday<=5;weekday++) {

         hours[$Idx(weekday,1,5,"")] = 0;

      }

      for(weekday = 2;weekday<=4;weekday++) {

         ++hours[$Idx(weekday,1,5,"")];

      }

   }

 

 

 

CHARACTER LOOP

 

 

We can also use single letters as the count type, because they are also ordinal types:

 

Character for loop using Delphi

Delphi example: count G until A

var
letter : Char;
begin
for letter := 'G' downto 'A' do
  ShowMessage('Letter = '+letter)
end;

Result is:

Letter = G

Letter = F

Letter = E

Letter = D

Letter = C

Letter = B

Letter = A

-----------

 

·Same you can accomplish with SmartMS:

procedure TForm1.W3Button1Click(Sender: TObject);

var

letter : Integer;

begin

for letter := Ord('G') downto Ord('A'do

ShowMessage('Letter = '+chr(letter))

end;

 

The For statements in the examples above have all executed one statement. If you want to execute more than one, you must enclose these in a Begin and End pair.

 

mytoggle_plus1JS code generated:

function W3Button1Click(Self, Sender$5) {

      var letter = 0;

      for(letter = 71;letter>=65;letter--) {

         alert("Letter = "+Chr(letter));

      }

   }

 

 

 

 

REPEAT LOOP

 

 

The Repeat loop type is used for loops where we do not know in advance how many times we will execute. For example, when we keep asking a user for a value until one is provided, or the user aborts. Here, we are more concerned with the loop termination condition.
Repeat loops always execute at least once. At the end, the Until condition is checked, and the loop aborts of condition works out as true.
A simple example using SmartMS.

 

procedure TForm1.W3Button1Click(Sender: TObject);

var

  exit1: Boolean// Our exit condition flag

  i:     Integer;

begin

  i := 1;

  exit1 := False; // do not exit until we are ready

  repeat

    Inc(i); // Increment a count

    if Sqr(i) > 99 then

      exit1 := true; // Exit if the square of our number exceeds 99

  until exit1;       // Shorthand for 'until exit := true'

  WriteLn(i);

end;

Result will be: 10 (upon exit1, i will be 10, since 100 > 99).

Here we exit1 the repeat loop when a Boolean variable is true. Notice that we use a shorthand - just specifying the variable as the condition is sufficient since the variable value is either true or false.

 

mytoggle_plus1The beast generated this JS code:

function W3Button1Click(Self, Sender$5) {

      var exit1 = false;

      var i$3 = 0;

      i$3 = 1;

      exit1 = false;

      do {

         ++i$3;

         if ((i$3*i$3)>99) {

            exit1 = true;

         }

      } while (!exit1);

      WriteLn(i$3);

   }

 

 

 

COMPOUND CONDITIONS with SmartMS

 

 

procedure TForm1.W3Button1Click(Sender: TObject);

var

i : Integer;

begin

i := 1;

repeat

Inc(i); // Increment a count

until (Sqr(i) > 99or (Sqrt(i) > 2.5);

end;

 

Result will be: 7 (since sqrt(7)  > 2.5)

Notice that compound statements require separating brackets. Notice also that Repeat statements can accomodate multiple statements without the need for a begin/end pair. The repeat and until clauses form a natural pairing.
 

mytoggle_plus1SMS generated this JS code:

function W3Button1Click(Self, Sender$5) {

      var i$3 = 0;

      i$3 = 1;

      do {

         ++i$3      } 

      while (!(((i$3*i$3)>99)||(Math.sqrt(i$3)>2.5)));

   }

 

 

 

 

WHILE LOOPS

 

While loops are very similar to Repeat loops except that they have the exit condition at the start. This means that we use them when we wish to avoid loop execution altogether if the condition for exit is satisfied at the start.

 

procedure TForm1.W3Button1Click(Sender: TObject);

var

i : Integer;

begin

i := 1;

while (Sqr(i) <= 99and (Sqrt(i) <= 2.5do

Inc(i); // Increment a count

end;

and the result will be 7 (since sqrt(7) > 2.5)

 

mytoggle_plus1SMS generated this JS code:

function W3Button1Click(Self, Sender$5) {

      var i$3 = 0;

      i$3 = 1;

      while (((i$3*i$3)<=99)&&(Math.sqrt(i$3)<=2.5)) {

         ++i$3      }

   }

 

 

 

Notice that our original Repeat Until condition used OR as the compound condition joiner - we continued until either 

condition was met. With our While condition, we use AND as the joiner - we continue whilst neither condition is met. 

Have a closer look to see why we do this. The difference is that we repeat an action until something or something else 

happens. Whereas we keep doing an action while neither something nor something else have happened.