control structures
DESCRIPTION
Control Structures. Types of Structured Sequential Control. Types of Unstructured Control. GOTO. coroutines. Asynchronous Control (stay tuned). Concurrent Control (stay tuned). Simple Sequence - execute instructions in the written order. - PowerPoint PPT PresentationTRANSCRIPT
Types of Structured Sequential Control
Types of Unstructured Control
GOTO
coroutines
Asynchronous Control (stay tuned)
Concurrent Control (stay tuned)
Simple Sequence - execute instructions in the written order
What instructions are inherently sequential?
Why {...} notation (or begin ... end)?
Selection - choose between alternative code clauses
What are the two forms in Java/C++ ?
Distinguishing characteristics between selection control structures:
Examples:
if -- Java CASE -- Modula-2 COND -- Scheme arithmetic-IF -- FORTRAN
IF (expression) 100, 200, 300
Java/C/C++
Pascal/Algol 60
if (condition) thenClause;else elseClause;
if condition then thenClauseelse elseClause
Modula-2/Adaif condition thenClause;else elseClause;end if
1st Generation IF ≈ optional branch (2-way selection)
examples:conditional branches -- assemblerlogical IF -- FORTRANIF -- BASIC
2nd Generation if-then-else replaces if-then examples: Pascal & C
concern: branching into the midst of a clause
concern: dangling else
When does the else clause execute?
if (condition1) if (condition2) thenClause; else elseClause ;
How to write the code as indented?
1st Generation IF either branches or not (2-way selection)
examples:conditional branches -- assemblerlogical IF -- FORTRANIF -- BASIC
2nd Generation if-then-else replaces if-then examples: Pascal & C
concern: branching into the midst of a clause
concern: dangling else
3rd Generation elseif option is included examples: Algol 68, Ada & Modula-2
Computed-GOTO -- FORTRAN
GOTO (10, 20, 30, 40), integerExpression10 Instruction1
...GOTO 100
20 Instruction2...GOTO 100
30 Instruction3...GOTO 100
40 Instruction4...GOTO 100
100 CONTINUE
Select -- PL/1SELECT (Expression); WHEN(0, 1) Instruction1; WHEN(7) Instruction2;
...
OTHERWISE InstructionN;END;
OR
SELECT; WHEN(Condition1) Instruction1; WHEN(Condition2) Instruction2;
...
OTHERWISE InstructionN;END;
switch -- C
switch (Expression) { case constant1:
Instruction1;break;
case constant2: case constant3:
Instruction1;break;
...
default: InstructionN;break;
}
Guarded-IF (by Edsgar Dijkstra)if condition1 clause1 condition2 clause2 condition3 clause3
... conditionN clauseNfi
Non-deterministic code has alternative valid behavior under the same circumstances.
Ada Select select when condition1 => clause1 or when condition2 => clause2 or when condition3 => clause3
... or when conditionN => clauseNend select
Repetition Control Structures - execute a body repeatedly
EXIT -- Modula-2 & Ada break -- C et. al. LEAVE -- PL/1
(What occurs when a continue instruction (C) executed?)
DO J=1 TO 10 BY 2, 17, 23 WHILE (X>0);...IF (Y=1) THEN LEAVE;...
END;
control structures run amuck - PL/1
top of loop (while) bottom of loop (repeat/do)
The Counting Loop -- What hath FORTRAN wrought?
Early versions of FORTRAN had one loop construct.
DO 1000 j=1,20,1...
1000 CONTINUE
Modern versions of this loop are called for loops.
Modula-2 restrictions.
Ada version:
for ControlVar in 7..20 loop...
end loop
Under what circumstances do these Modula-2 loops behave differently?
FOR J:=1 TO A[N] DO loopBody;END;
J:=1;WHILE J<=A[N] DO loopBody; J:=J+1;END;
Zahn’s Event Indicator
<eventLoop> loop until <eventList> <instructions> repeat then
<signalList> fi
<eventList> <eventName>
| <eventName> or <eventList> <signalList> <signalCase> | <signalCase> <signalList>
<signalCase> <eventName> : <instructions> ;
BNF loop until E1 or ... or EN
loopBodyrepeatthen E1 : Instruction1; ... EN : InstructionN;fi
Skeleton
Example: sequential array searchj := 1;loop until Found or NotThere begin if j>arraySize then NotThere; if A[j]=lookupValue then Found; j := j + 1; endrepeat then Found: index := j; NotThere: begin /* append value to array end */ arraySize := arraySize + 1; A[arraySize] := lookupValue; index := arraySize; endfi/* assert: A[index] = lookupValue */