Loop Construct

Control flow constructs

 

•      Control Flow constructs seen so far

–   sequential flow

–   two-way or multi-way branching flow

 

•      These constructs are not enough!

 

Sum of Square roots

•      Problem: Compute sum of square roots of numbers from 1 to 5

•      One solution:

           program sum_sqroot

           implicit none

           real :: sum,sum1,sum2,sum3,sum4

           sum1 = sqrt(1.0)

           sum2 = sum1 + sqrt(2.0)

           sum3 = sum2 + sqrt(3.0)

           sum4 = sum3 + sqrt(4.0)

           sum = sum4 + sqrt(5.0)

            print *, sum

           end program

Summing Square roots

•      What are the problems with this solution?

 

•      No need for so many sum variables; use instead

                       

                             sum = sum + sqrt(..)

 

•      what if 10, 20 or 100 numbers to be added?

–   code repetition possible but undesirable

 

•      what if an unknown numbers (given as input) to be added?

–   code repetition not possible at all

 Looping

•      Loop constructs are designed to solve the above problems

 

•      Loop constructs enable execution of same piece of code a specified number of time

 

•      Two kinds of loop constructs:

–   Controlled loop

–   Uncontrolled loop

 

•      The above problem can be solved using controlled loop

Example

     Program sum_sqrt
implicit none

    real :: x,sum

sum = 0.0
!initialization needed.  why? see the loop

!looping construct
do i = 1,5 !loop body executed five times

          x = real(i)
     sum = sum + sqrt(x) !each time i incremented by 1

    end do
print *, sum
end program

Controlled Loop Construct

•       General form:

     do var = init, fin, inc

                 loop_body

     end do

 

•        var, called control variable, must be integer

•        init,fin,inc are integer expressions

•        inc must be non-zero, can be negative and default value is 1

•        loop_body must not modify value of var

 Iteration

•      loop_body is executed repeatedly

•      each execution is called an iteration

•      initially, var = init

•      after every iteration inc is added to var

•      loop is terminated when value of var exceeds fin (or smaller than fin)

•      Loop body is executed a fixed number of times

•      number of iterations may depend on values of variables

Controlled Loop

•      number of iterations (for +ve inc)

            iter-count = (fin-init+inc)/inc

•      iter-count is computed when the do statement is first encountered

 

•      if  iter-count <= 0 , loop is not executed

 

•      if iter-count > 0, loop_body is executed, iter-count is decremented by 1 and var is incremented in every iteration

 

•      loop terminates finally when iter-count <= 0, i.e., the control flows to the statement immediately following the loop statement

Controlled Loop

•      iter-count is computed when the do statement is first encountered

•      Its value depends upon the values at that point

•      values of init, fin, inc should not be changed inside the loop

•      var is incremented by the value of inc in every iteration

•      It is assigned the value init when do is first encountered

Cycle and Exit statements

•      loop_body can contain two special statements

 

•      Cycle

–   It terminates the current iteration and the next iteration is started, if there is one

 

•      Exit

 

–   This terminates the loop moving the control to the statement following the loop

Example

•      Read a line of characters,

•      Count the number of e occurring in the line

•      Replace every a by #

•      Lines of length 80 or ended by $ sign

program e_count

    character(len=80) :: line
integer :: counter,index
read *, line
index=1
counter = 0
do index = 1, 80
     if (line(index:index) = = "$
“) exit  !exit the loop if end of line 

          if (line(index:index) == "e“) then
         counter = counter +1
         cycle   !skip the rest of the loop
     endif
     if (line(index:index) == "a
“) then
        line(index:index) = "#"
     endif
end do
print *, counter, line


Uncontrolled Loop

•      The controlled loop is a simple loop computation

 

•      The loop body executed for a number of times that is fixed a priori or at least prior to the execution of the do statement

 

•      Many times

–   repeat a computation till certain condition holds

–   No upper bound on the number of iterations exists

 

•      More general loops are required for describing these

 

•      Uncontrolled loops are meant for this

Another Example

•      Similar to the earlier problem

•       there is no upper bound on the length of the line

•       all lines should be terminated by $

       index =0

       do !uncontrolled loop

           index = index +1
       if (line(index:index) == "$
“) exit

           if (line(index:index) == "e" ) then
           counter = counter +1
           cycle
       endif

           if (line(index:index) == "a" ) then
           line(index:index) = "#"
       endif

       end do


Uncontrolled loop

•      Controlled loop does many things implicitly

–    control variable updation, exit condition checking

•      In uncontrolled version, these have to be done explicitly

•      Termination is guaranteed in the controlled one

•      Termination need to be ensured in the uncontrolled one

•      explicit inclusion of exit statements is required

•      In e_count1, for termination of the loop, the end of line condition is required

•      In e_count, the loop terminates automatically after reading at most 80 characters

•      Controlled loop is safe but less general

General Form

         do

            loop_body

          end do

 

•      Any number of exit statements can occur in the loop_body

 

•      At least one required

 

•      Possibility of non termination, in any case

Loops

•      Loop is an important construct

•      Most programs will involve loops

•      Loops encode potentially unbounded computations

•      Mastering loops is important

•      Loops cause non termination, a most common programming error

•      Correct programs should be terminating

•      Every loop is associated with a condition called loop invariants

•      Loop invariant holds at the beginning of every iteration

Nested Loops

•       Like many other constructs loops can also be nested

       do

               statement1
           do
               statement2
           end do
           statement3

        end do

•       Note that `inner do' ends before the `outer do‘

•       Exit and cycle in statement2 refers to the inner loop

•       Exit and cycle in statement1 and statement3 refer to the outer loop

 Labeling loops

•      For ease of understanding loops can be labeled:
  outer: do
      statement1
      inner: do
                  statement2
                end do inner
      statement3

   end do outer

•      exit and cycle statements can name the loop
   exit outer, cycle outer

 

•      unnamed statements refer to the innermost enclosing loops

Labeling control constructs

•      Like loops all other constructs can be labeled

•      Examples:

   cond1: if (test1) then
                  statement
           elseif (test2) then cond1
                  statement
           else cond1
                  statement
           endif cond1

•      Similarly for select case construct