27
3. Program Design and Branching Structures

3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

3. Program Design and Branching Structures

Page 2: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Two broad categories of control statement:

- Branches

- Loops

• These will make the program more complex.

To avoid programming errors, a formal program design procedure is needed, which is based on the technique known as top-down design.

Page 3: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Top-down design technique

problem (equations) to be solved

design an algorithm (step-by-step procedure)for finding the solution

subtask subtasksubtasksubtask subtask

pseudo-code

program unit(statements)

program unit test & validation

final program

pseudo-code pseudo-code pseudo-code pseudo-code

program unit(statements)

program unit(statements)

program unit(statements)

program unit(statements)

program unit test & validation

program unit test & validation

program unit test & validation

program unit test & validation

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙

Page 4: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Pseudo-code: hybrid mixture of English & program statements

• Flowchart: graphical description

• Any other formats you prefer

Form to describe the algorithm

• Use pencil and paper as much as you can before writing the computer program.

• Your note ≅ the computer program.

Page 5: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Assignment Statements and Logical Calculation

logical_variable_name = logical expression

A logical expression is a combination of logical constants, logical variables and logical operators.

logical constants:

logical variables:

logical operators:

.true.

.false.

logical :: done logical :: done1 = .true.logical :: done2 = .false.

relational logical operator

combinational logical operator

Page 6: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Relational logical operators:

new style old style

== .eq.

/= .ne.

> .gt.

>= .ge.

< .lt.

<= .le.

logical assignment statement logical value

3 < 4 .true.

3 <= 4 .true.

3 > 4 .false.

4 <= 4 .true.

7+3 < 2+11 .true.

(7+3) < (2+11) .true.

4 == 4.0 .true.

Example:

Page 7: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Combinational logical operators:

Logical statement The result is .true. if...

L1 .and. L2 both L1 and L2 are true

L1 .or. L2 either L1 or L2 is true

L1 .eqv. L2 L1 is the same as L2

L1 .neqv. L2 L1 is not the same as L2

.not. L1 L1 is false

L1 = .true.L2 = .true.L3 = .false.

Logical statement Result

.not. L1 .false.

L1 .or. L3 .true.

L2 .neqv. L3 .true.

L1 .and. L2 .or. L3 .true.

L1 .or. L2 .and. L3 .false.

.not. (L1 .eqv. L2) .false.

Example:

Page 8: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

program test_logicalimplicit noneinteger :: i, j, klogical :: Lg1, Lg2, Lg3, Lg4, Lg5, Lg6

write (*,*) "input three integer number i, j, k:"read (*,*) i,j,k

Lg1 = i+j==k write (*,*) "Is i+j equal to k? ", Lg1Lg2 = i+j/=kwrite (*,*) "Is i+j not equal to k? ", Lg2Lg3 = i+j<=kwrite (*,*) "Is i+j less or equal to k? ", Lg3Lg4 = .not. i+j<=kwrite (*,*) "Is i+j NOT less or equal to k? ", Lg4Lg5 = i+j<=k .and. i<jwrite (*,*) "Is i+j less than k, and i less than k? ", Lg5Lg6 = i==i .eqv. j==jwrite (*,*) "Is i equal to i equivalent to j equal to j? ", Lg6

end program

** Copy this program to the directory ./examples, compile and execute it.

Page 9: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Control Constructs: Branch

• Block IF construct

• Logical IF statement

• ELSE and ELSE IF clauses

• Name Block IF

• Nested Block IF

Page 10: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Block IF construct

if (logical expression) thenstatement block

end if

logical expression

statement(s)(block)

.false.

.true.

• Logical IF statement

if (logical expression) statement

• Block IF construct with ELSE IF clause

if (logical expression 1) thenstatement block 1

else if (logical expression 2) thenstatement block 2

else if (logical expression 3) then...

else !optionstatement block !option

end if

(** At most, one statement block is executed. **)

logicalexpression 1

statementblock 1

.false.

.true.

.false.

.true.

logicalexpression 2

statementblock 2

statementblock

...

.false.

...

Page 11: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Example of using BLOCK IF:

Solve ��� + �� + � = 0 for � given �, � and �.

Design the algorithm (procedure):

1. Read the input data a, b, and c

2. Calculate the roots

if �� − 4�� > 0, then � = −�/(2.∗ �) + (� ∗∗ 2 − 4.∗ � ∗ �)/(2.∗ �)−�/(2.∗ �) − (� ∗∗ 2 − 4.∗ � ∗ �)/(2.∗ �)

if �� − 4�� = 0, then � = −�/(2.∗ �)

if �� − 4�� < 0, then � = −�/(2.∗ �) + �(4 ∗ � ∗ � − � ∗∗ 2)/(2.∗ �)−�/(2.∗ �) − �(4 ∗ � ∗ � − � ∗∗ 2)/(2.∗ �)

3. Write out the roots

Page 12: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Flowchart:start

read a, b, c

echo a, b, c

b**2 - 4.*a*c > 0 b**2 - 4.*a*c = 0

write " The equation has two

complex roots. "write

" The equation has twoidentical read roots. "

write " The equation has two

distinct real roots. "

calculatereal_part, imag_partcalculate x1calculate x1, x2

writereal_part + i imag_partreal_part – i imag_part

write x1write x1, x2

stop

.false. .false.

.true. .true.

Page 13: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

program roots! Purpose:! This program solves for the roots of a quadratic equation of the form! a*x**2 + b*x + c = 0. ! It calculates the answers regardless of the type of roots that the! equation possesses.implicit none! Declare the variables used in this programreal :: a ! Coefficient of x**2 term of equationreal :: b ! Coefficient of x term of equationreal :: c ! Constant term of equationreal :: discriminant ! Discriminant of the equationreal :: imag_part ! Imaginary part of equation (for complex roots)real :: real_part ! Real part of equation (for complex roots)real :: x1 ! First solution of equation (for real roots)real :: x2 ! First solution of equation (for real roots)

! Prompt the user for the coefficients of the equationwrite(*,*) 'This program solves for the roots of a quadratic 'write(*,*) 'equation of the form a*x**2 + b*x + c = 0. 'write(*,*) 'Enter the coefficients a, b, and c: 'read(*,*) a, b, c

! Echo back coefficientswrite(*,*) 'The coefficients a, b, and c are: ', a, b, c

> Continued on next page...

Page 14: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

! Calculate discriminantdiscriminant = b**2 - 4.0*a*c

! Solve for the roots, depending upon the value of the discriminantIF (discriminant > 0.0) THENx1 = (-b + sqrt(discriminant)) / (2.0*a)x2 = (-b - sqrt(discriminant)) / (2.0*a)write(*,*) 'This equation has two real roots:'write(*,*) 'x1 = ', x1write(*,*) 'x2 = ', x2

ELSE IF (discriminant == 0.0) THENx1 = (-b) / (2.0*a)write(*,*) 'This equation has two identical real roots:'write(*,*) 'x1 = x2 = ', x1

ELSE ! there are complex roots, so...real_part = (-b) / (2.0*a)imag_part = sqrt(abs(discriminant)) / (2.0*a)write(*,*) 'This equation has complex roots:'write(*,*) 'x1 = ', real_part, ' +i ', imag_partwrite(*,*) 'x2 = ', real_part, ' -i ', imag_part

END IF

end program

** Copy this program to the directory ./examples, compile and execute it.

** Change ELSE to ELSE IF (discriminant < 0.0) THEN, and test it again.

Page 15: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Using equality test in IF construct

...if(x==10.) then...

• This may cause problem, i.e., the logical test is never be true.

• Because of small round-off errors during floating-point arithmetic operations, two numbers that theoretically are equal will be different by a tiny amount.

• Instead of testing equality, it is better to test near equality.

...if(abs(x-10.) <= 0.000001) then...

...ELSE IF (abs(discriminant) <= 1.0E-7) THEN...

• In the previous example, a better way is to write:

Page 16: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

if (test 1) thenstatement block 1

else if (test 2) thenstatement block 2

else if (test 3) thenstatement block 3

end if

statementblock 1

.false.

.true.

.false.

.true.

test 1 test 2 test 3

statementblock 2

statementblock 3

.true.

.false.

if (test 1) thenstatement block 1

else if (test 2) thenstatement block 2

elseif (test 3) thenstatement block 3

end ifend if

end if

• Nested Block IF constructs

statementblock 1

.false.

.true.test 1

test 2

test 3

statementblock 2

statementblock 3

.true.

.true.

.false.

.false.

• Block IF constructs

** The two are the same. Choose whichever style you prefer.

Page 17: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

if (test 1) thenstatement block 1if (test 2) thenstatement block 2if (test 3) thenstatement block 3

end ifend if

end if

test 1

test 2

statementblock 1

statementblock 2

statementblock 3

test 3

.true.

.true.

.true.

.false.

.false.

.false.

• Nested Block IF Constructs with ELSE

if (test 1) thenstatement block 1

else if (test 2) thenstatement block 2

elseif (test 3) thenstatement block 3

end ifend if

end if

statementblock 1

.false.

.true.test 1

test 2

test 3

statementblock 2

statementblock 3

.true.

.true.

.false.

.false.

• Nested Block IF Constructs without ELSE

** The two are totally different!

(At most, 1 statement block is executed.)

(At most, 3 statement blocks are executed.)

Page 18: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Example comparing Block IF and Nested Block IF

score grade

95 < x A

86 < x ≤ 95 B

76 < x ≤ 86 C

66 < x ≤ 76 D

0 < x ≤ 66 E

if x > 95 ? if x > 86 ? if x > 76 ? if x > 66 ?

write(*,*)'Grade is A'

write(*,*)'Grade is B'

write(*,*)'Grade is C'

write(*,*)'Grade is D'

write(*,*)'Grade is E'

end

start

YESYESYES YES

NO NO NO NO

Page 19: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Example comparing Block IF and Nested Block IF

score grade

95 < x A

86 < x ≤ 95 B

76 < x ≤ 86 C

66 < x ≤ 76 D

0 < x ≤ 66 E

if x > 95 ?

if x > 86 ?

if x > 76 ?

if x > 66 ?

write(*,*)'Grade is A'

write(*,*)'Grade is B'

write(*,*)'Grade is C'

write(*,*)'Grade is D'

write(*,*)'Grade is E'

end

start

YES

YES

YES

YES

NO

NO

NO

NO

Page 20: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

if (x > 95) thenwrite(*,*) 'Grade is A'

else if (x > 86) thenwrite(*,*) 'Grade is B'

else if (x > 76) thenwrite(*,*) 'Grade is C'

else if (x > 66) thenwrite(*,*) 'Grade is D'

elsewrite(*,*) 'Grade is E'

end if

Block IF

if (x > 95) thenwrite(*,*) 'Grade is A'

elseif (x > 86) thenwrite(*,*) 'Grade is B'elseif (x > 76) thenwrite(*,*) 'Grade is C'

elseif (x > 66) thenwrite(*,*) 'Grade is D'elsewrite(*,*) 'Grade is E'

end ifend ifend if

end if

Nested Block IF

score grade

95 < x A

86 < x ≤ 95 B

76 < x ≤ 86 C

66 < x ≤ 76 D

0 < x ≤ 66 E

Page 21: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

• Name Block IF constructs

[name:] if (logical expression 1) thenstatement block 1

else if (logical expression 2) then [name]statement block 2

else if (logical expression 3) then [name]...

else [name]statement block n

end if [name]

to help identify a complex BLOCK IF construct that spans long listing

[name] after else if and else are option

[name1:] if (logical expression 1) thenstatement block 1

else [name1][name2:] if (logical expression 2) then statement block 2

else [name2][name3:] if (logical expression 3) then...else [name3]statement block n

end if [name3]end if [name2]

end if [name1]

Page 22: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

if (test 1) thenstatement block 1

else if (test 2) thenstatement block 2

else if (test 3) thenstatement block 3

end if

Nested Block IF Constructs

Block IF Constructs

if (test 1) thenstatement block 1

else if (test 2) thenstatement block 2

elseif (test 3) thenstatement block 3

end ifend if

end if

• Nested Block IF constructs

outer: if (test 1) thenstatement block 1

else outermiddle: if (test 2) thenstatement block 2

else middleinner: if (test 3) thenstatement block 3

end if innerend if middle

end if outer

outer: if (test 1) thenstatement block 1

else middle: if (test 2) thenstatement block 2

elseinner: if (test 3) thenstatement block 3

end if innerend if middle

end if outer

Name Nested Block IF Constructs

test: if (test 1) thenstatement block 1

else if (test 2) then teststatement block 2

else if (test 3) then teststatement block 3

end if test

Name Block IF Constructs

test: if (test 1) thenstatement block 1

else if (test 2) thenstatement block 2

else if (test 3) thenstatement block 3

end if test

Page 23: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

if (x > 95) thenwrite(*,*) 'Grade is A'

else if (x > 86) thenwrite(*,*) 'Grade is B'

else if (x > 76) thenwrite(*,*) 'Grade is C'

else if (x > 66) thenwrite(*,*) 'Grade is D'

elsewrite(*,*) 'Grade is E'

end if

Block IF

aif: if (x > 95) thenwrite(*,*) 'Grade is A'

else aifbif: if (x > 86) thenwrite(*,*) 'Grade is B'else bifcif: if (x > 76) thenwrite(*,*) 'Grade is C'

else cifdif: if (x > 66) thenwrite(*,*) 'Grade is D'else difwrite(*,*) 'Grade is E'

end if difend if cifend if bif

end if aif

Nested Block IF

score grade

95 < x A

86 < x ≤ 95 B

76 < x ≤ 86 C

66 < x ≤ 76 D

0 < x ≤ 66 E

Page 24: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Write two Fortran programs using both block if and nested block if respectively to evaluate the function with different user-specified real � and �:

� �, � =

� + �� ≥ 0and� ≥ 0

� + ��� ≥ 0and� < 0

�� + �� < 0and� ≥ 0

�� + ��� < 0and� < 0

Exercise 1

Page 25: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Consider a cubic equation with real coefficients ��, ��, �� :

�� + ���� + ��� + �� = 0.

Let

� = ��3�� − ��

� , � = ���

9���� − 27�� − 2��� , � = �� + ��,

� = sgn � + ��/� � + ��/� �/�, � = sgn � − ��/� � − ��/� �/�

When � > 0, the equation has a real root and 2 non-real complex conjugate roots:

�� = � + � − �

���

�� = −�

�� + � − �

��� + ��

�3�/�(� − �)

�� = −�

�� + � − �

��� − ��

�3�/�(� − �) .

When � = 0, all roots are real and at least two are equal:

�� = 2��/� − �

���

�� = −��/� − �

���

�� = −��/� − �

���

When � < 0, the equation has 3 distinct real roots:

�� = 2 −� �/� cos �

�� − �

���

�� = 2 −� �/� cos �

�� + �

�� − �

���

�� = 2 −� �/� cos �

�� + �

�� − �

���,

where, cos� = �/(−�)�/�.

Implement these into a Fortran program given the three coefficients as input data.

Exercise 2

Page 26: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart:

Exercise 3

The implementation of the solution of a cubic equation can be tested by substituting the three solved roots into the original equation and see if it is nearly equal to zero.

It can also be tested whether the following identities are satisfied to the appropriate precision:

�� + �� + �� = −��, ���� + ���� + ���� = ��, ������ = −��,

where ��, ��, �� are the three roots.

Incorporate these two tests into the program.

Examples of cubic equations having different types of roots are:

�� − 6�� + 11� − 6 = 0

�� − 5�� + 8� − 4 = 0

�� − 3�� + 3�� − 1 = 0

�� + �� + � − 3 = 0

Page 27: 3. Program Design and Branching Structureshomepage.ntu.edu.tw/~wttsai/fortran/ppt/3.Branching_Structures.pdf• Pseudo-code: hybrid mixture of English & program statements • Flowchart: