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 thenClause else elseClause Modula-2/Ada if condition thenClause ; else elseClause ; end if
1st Generation IF ≈ optional branch (2-way selection) examples: conditional branches -- assembler logical IF -- FORTRAN IF -- 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 -- assembler logical IF -- FORTRAN IF -- 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), integerExpression 10 Instruction1... GOTO Instruction2... GOTO Instruction3... GOTO Instruction4... GOTO CONTINUE
Select -- PL/1 SELECT ( 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 clauseN fi 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 => clauseN end 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, CONTINUE Modern versions of this loop are called for loops. Modula-2 restrictions. Ada version: for ControlVar in 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 loop until repeat then fi | or | : ; BNF loop until E 1 or... or E N loopBody repeat then E 1 : Instruction1 ;... E N : InstructionN ; fi Skeleton
Example: sequential array search j := 1; loop until Found or NotThere begin if j>arraySize then NotThere; if A[j]=lookupValue then Found; j := j + 1; end repeat then Found: index := j; NotThere: begin /* append value to array end */ arraySize := arraySize + 1; A[arraySize] := lookupValue; index := arraySize; end fi /* assert: A[index] = lookupValue */