Lecture 2
Lecture 2
MATTEO PASQUALI
[email protected]
713-348-5830
AL B-243
FORTRAN LECTURE 2
SELECTIVE EXECUTION
PROBLEM(s)
1. DECIDE WHETHER A CERTAIN
SET OF INSTRUCTIONS
SHOULD BE EXECUTED
DEPENDING ON CERTAIN CONDITIONS
2. DECIDE WHICH (AMONG SEVERAL)
SET OF INSTRUCTIONS
SHOULD BE EXECUTED
DEPENDING ON CERTAIN CONDITIONS
1. SIMPLE SELECTION
INSTRUCTIONS
FALSE TRUE
CHOICE
INSTRUCTIONS
1. SIMPLE SELECTION: IF STATEMENT
STRUCTURE:
INSTRUCTIONS
TRUE FALSE
CHOICE
INSTRUCTION INSTRUCTION
SET 1 SET 2
2. TWO-WAY SELECTION:
IF... ELSE STATEMENT
STRUCTURE:
delta = b**2 - 4 * a * c
if (delta >= 0) then
x1 = (– b – sqrt(delta)) / (2 * a)
x2 = (– b + sqrt(delta)) / (2 * a)
write(*,*) ‘Solutions:’, x1, x2
else
write(*,*) ‘No real solution’
endif
INDENTATION FOR CLARITY
3. MULTIPLE SELECTION
CHOICE
DO NOTHING
INSTR. INSTR. INSTR.
SET 1 SET 2 SET 3
IF EXPRESSION i IS TRUE,
INSTRUCTION SET i IS EXECUTED,
AND THE IF BLOCK IS EXITED;
OTHERWISE EXPRESSION i+1 IS EVALUATED
3a. MULTIPLE SELECTION:
IF... ELSEIF... STATEMENT
INS4 INS5
write(*,*) ‘B’
case (70:79)
write(*,*) ‘C’
case (60:69)
write(*,*) ‘D’
case default
write(*,*) ‘F’
endselect
EXAMPLE: SEVEN ELEVEN (CRAPS)
OPERATOR MEANING
== EQUAL TO
/= NOT EQUAL TO
> GREATER THAN
>= GREATER THAN OR EQUAL TO
< LESS THAN
<= LESS THAN OR EQUAL TO
RELATIONAL EXPRESSIONS ARE FORMED
BY COMBINING AND COMPARING
VARIABLES AND EXPRESSIONS
logical :: test, l_angle
real :: alpha, beta
...
if (alpha <= beta) then
...
elseif (test) then
...
endif
l_angle = (alpha > beta)
COMPLEX LOGICAL EXPRESSIONS
FORMED BY COMBINING SIMPLE
LOGICAL EXPRESSIONS THROUGH
COMBINATORIAL LOGIC OPERATORS
SYNTAX
EX1 OP EX2
OPERATOR DEFINITION
EX1 .and. EX2 TRUE IF BOTH EX1 & EX2 TRUE
EX1 .or. EX2 TRUE IF EITHER OR BOTH
EX1 & EX2 TRUE
EX1 .eqv. EX2 TRUE IF EX1 & EX2 ARE SAME
(BOTH TRUE OR FALSE)
EX1 .neqv. EX2 TRUE IF EX1 & EX2 ARE DIFFERENT
(ONE TRUE AND ONE FALSE)
.not. EX1 TRUE IF EX1 FALSE
EXAMPLE
PROBLEM(s)
INSTRUCTIONS
loop:
CV = IV to FV,
STEP
INSTRUCTIONS
do icount = 1, nmax, 2
write(*,*) icount, ‘is odd’
enddo
INSTRUCTIONS
x = 1.1
do
x = x*2
write (*,*) ‘ x = ‘, x
if (x >= 100.0) then
exit
endif
enddo CAN HAVE
MORE THAN ONE
EXIT CLAUSES
3. PREMATURE TERMINATION OF
ITERATIVE DO LOOP
exit STATEMENT
EXAMPLE: prime number algorithm
do i = 2, nmax
q = (n / i) * i
if (q == n) then
write(*,*) n, ‘is not a prime number’
exit
endif
enddo NO NEED TO CONTINUE
THE LOOP: WE ALREADY KNOW
THAT n IS NOT PRIME
4. PREMATURE TERMINATION OF
LOOP ITERATION
cycle STATEMENT
EXAMPLE: evaluate f(x) = log(x) - sqrt(x)
do
write (*,*) ‘input x’
read (*,*) x
if (x <= 0.0) then
write(*,*) x, ‘is not positive’
cycle
endif
f = log(x) - sqrt(x)
...
enddo
POSSIBLE PROBLEMS WITH DO LOOPS
INITIALIZATION
m = 28
n = 20 IF m > n
do i = m, n, 2 NEVER EXECUTED
(STEP > 0)
...
enddo
p = -7
q=1 IF p < q
do j = p, q, -1 NEVER EXECUTED
(STEP < 0)
...
enddo
POSSIBLE PROBLEMS WITH DO LOOPS
INFINITE LOOPS
x = 100.0
do
x = sqrt (x)
if (x < 0.0) then
exit THIS EXPRESSION
endif WILL NEVER
BE TRUE
enddo
INFINITE LOOPS, OTHER EXAMPLE
x = 1.0
fmax = 10.0
do VALUE OF fmax
IS NEVER UPDATED
f = x**2
write (*,*) ‘x = ‘, x, ‘f = ‘, f
if (fmax > 100.0) then
exit
endif
x = x + 0.5
enddo
TOO MANY / TOO FEW / INFINITE ITERATIONS
DUE TO TRUNCATION ERROR
step = (5.0 - 3.0) / 11.0
do x = 3.0, 5.0, step MAY GET x = 4.999...
OR x = 5.000001
... DUE TO TRUNCATION;
enddo ONE MORE (LESS)
ITERATION
step = (5.0 - 3.0) / 11.0
x = 3.0 BETTER
do i = 1, 12 ALTERNATIVE,
NEVER USE REALS
... AS CONTROL
x = x + step VARIABLES
enddo
ATTEMPTS AT MODIFYING:
COUNTER, LIMITS, OR STEP
do i = m, n, step
...
i=i-3 ILLEGAL STATEMENTS;
m = 12 WILL BE IGNORED
AND / OR
n = i**3
CAUSE ERRORS
step = step + 2
enddo
PROBLEMS
•MAKE DECISIONS INSIDE DO LOOP
•MAKE DECISIONS INSIDE IF BLOCK
•REPEAT INSTRUCTIONS INSIDE DO LOOP
•REPEAT INSTRUCTIONS INSIDE IF BLOCK
DO LOOPS & IF BLOCKS CAN BE NESTED,
i.e., ONE CAN BE PLACED INSIDE ANOTHER
do i = 1, 100
if (i / 2 * 2 == i) then
write (*,*) i, ‘is even’
else
write (*,*) i, ‘is odd’
endif
enddo
NESTED LOOPS MUST HAVE
DIFFERENT COUNTERS
do i = 1, 100
do j = 1, 100
write (*,*) i, j, i*j
enddo
enddo ILLEGAL
do i = 1, 100
do i = 1, 100
write (*,*) i, i*i
enddo
enddo
NAMED DO LOOPS and IF & SELECT BLOCKS
SYNTAX
NAME1: do
...
enddo NAME1
outer_do: do i = 1, n
...
inner_if: if (x > 0.0) then
...
endif inner_if
enddo outer_do
NAMED CYCLE STATEMENT
EXAMPLE
outer_do: do i = 1, n
...
inner_do: do j = 1, n
...
if (x < 0.0) then
cycle outer_do
endif
IF NO NAME
... IS SPECIFIED
enddo inner_do WILL CYCLE
INNERMOST LOOP
enddo outer_do
NAMED EXIT STATEMENT
EXAMPLE
outer_do: do i = 1, n
...
inner_do: do j = 1, n
...
if (x < 0.0) then
exit outer_do
endif
IF NO NAME
... IS SPECIFIED
enddo inner_do WILL EXIT
INNERMOST LOOP
enddo outer_do