Fortran Tutorial Loop
Fortran Tutorial Loop
9. Loops
For repeated execution of similar things, loops are used. If you are familiar with other programming languages
you have probably heard about for-loops, while-loops, and until-loops. Fortran 77 has only one loop construct,
called the do-loop. The do-loop corresponds to what is known as a for-loop in other languages. Other loop
constructs have to be simulated using the if and goto statements.
do-loops
The do-loop is used for simple counting. Here is a simple example that prints the cumulative sums of the integers
from 1 through n (assume n has been assigned a value elsewhere):
integer i, n, sum
sum = 0
do 10 i = 1, n
sum = sum + i
write(*,*) 'i =', i
write(*,*) 'sum =', sum
10 continue
The number 10 is a statement label. Typically, there will be many loops and other statements in a single program
that require a statement label. The programmer is responsible for assigning a unique number to each label in
each program (or subprogram). Recall that column positions 2-5 are reserved for statement labels. The numerical
value of statement labels have no significance, so any integer numbers can be used. Typically, most
programmers increment labels by 10 at a time.
The variable defined in the do-statement is incremented by 1 by default. However, you can define any other
integer to be the step. This program segment prints the even numbers between 1 and 10 in decreasing order:
integer i
do 20 i = 10, 1, -2
write(*,*) 'i =', i
20 continue
var is the loop variable (often called the loop index) which must be integer. expr1 specifies the initial value of
var, expr2 is the terminating bound, and expr3 is the increment (step).
Note: The do-loop variable must never be changed by other statements within the loop! This will cause great
confusion.
Many Fortran 77 compilers allow do-loops to be closed by the enddo statement. The advantage of this is that the
statement label can then be omitted since it is assumed that an enddo closes the nearest previous do statement.
The enddo construct is widely used, but it is not a part of ANSI Fortran 77.
while-loops
https://www.tat.physik.uni-tuebingen.de/~kley/lehre/ftn77/tutorial/loops.html 1/3
2/26/2021 Fortran Tutorial
while (logical expr) do
statements
enddo
or alternatively,
do while (logical expr)
statements
enddo
The statements in the body will be repeated as long as the condition in the while statement is true. Even though
this syntax is accepted by many compilers, it is not ANSI Fortran 77. The correct way is to use if and goto:
label if (logical expr) then
statements
goto label
endif
Here is an example that calculates and prints all the powers of two that are less than or equal to 100:
integer n
n = 1
10 if (n .le. 100) then
n = 2*n
write (*,*) n
goto 10
endif
until-loops
If the termination criterium is at the end instead of the beginning, it is often called an until-loop. The pseudocode
looks like this:
do
statements
until (logical expr)
Note that the logical expression in the latter version should be the negation of the expression given in the
pseudocode!
Loops in Fortran 90
Fortran 90 has adopted the do-enddo construct as its loop construct. So our "counting down in twos" example
will look like this:
do i = 10, 1, -2
write(*,*) 'i =', i
end do
For while and until loops you also use the do-enddo construct, but you have to add a conditional exit statement.
The general case is:
do
statements
if (logical expr) exit
https://www.tat.physik.uni-tuebingen.de/~kley/lehre/ftn77/tutorial/loops.html 2/3
2/26/2021 Fortran Tutorial
statements
end do
If you have the exit condition at the beginning it is a while loop, and if it is at the end you have an until loop.
Exercises
Exercise A
Rewrite these pseudo-code loops into proper Fortran 77 syntax. Avoid goto if possible.
i = 1
while (i<100) do
sum = sum + i
i = i+2
enddo
i = 0
x = 1.0
repeat
x = f(x)
i = i+1
until (x<0)
write(*,*) i, x
Exercise B
The following code is poorly written. Rewrite it in good F77 style. (Tip: Compile and run to verify that the
new version gives the same answer as the old version.)
i = 1
sum = 0
10 do 20 i = 1, 50
if (i .gt. 10) goto 30
sum = sum + i
20 continue
30 if (i. le. 20) then
sum = sum - 1
goto 20
else
sum = 2*sum
endif
write(*,*) 'Sum =', sum
boman@sccm.stanford.edu
https://www.tat.physik.uni-tuebingen.de/~kley/lehre/ftn77/tutorial/loops.html 3/3