Download Programming Language Control Structures: Statement-Level Selection and more Slides Programming Languages in PDF only on Docsity!
Software II: Principles of
Programming Languages
Lecture 8 ā Statement-Level
Control Structures
Control Statements: Evolution
⢠FORTRAN I control statements were based
directly on IBM 704 hardware
⢠Much research and argument in the 1960s
about the issue
- One important result: It was proven that all
algorithms represented by flowcharts can be
coded with only two-way selection and pretest
logical loops
Control Structure
⢠A control structure is a control statement
and the statements whose execution it
controls
⢠Design question
- Should a control structure have multiple
entries?
Selection Statements
⢠A selection statement provides the means
of choosing between two or more paths of
execution
⢠Two general categories:
- Two-way selectors
- Multiple-way selectors
Clause Form
- In many contemporary languages, the then and
else clauses can be single statements or compound
statements
- In Perl, all clauses must be delimited by braces
(they must be compound)
- In Fortran 95, Ada, Python, and Ruby, clauses are
statement sequences
- Python uses indentation to define clauses if x > y : x = y print " x was greater than y"
Nesting Selectors
⢠Java example
if (sum == 0) if (count == 0) result = 0; else result = 1;
⢠Which if gets the else?
⢠Java's static semantics rule: else matches
with the nearest previous if
Nesting Selectors (continued)
⢠To force an alternative semantics,
compound statements may be used:
if (sum == 0) {
if (count == 0)
result = 0;
else result = 1;
⢠The above solution is used in C, C++, and
C#
Nesting Selectors (continued)
⢠Statement sequences as clauses: Ruby
if sum == 0 then
if count == 0 then
result = 0
else
result = 1
end
end
Multiple-Way Selection Statements
- Allow the selection of one of any number of
statements or statement groups
- Design Issues:
- What is the form and type of the control expression?
- How are the selectable segments specified?
- Is execution flow through the structure restricted to include just a single selectable segment?
- How are case values specified?
- What is done about unrepresented expression values?
Multiple-Way Selection: Examples
- C, C++, Java, and JavaScript switch ( expression ) { case const_expr1 : stmt1 ; ⦠case const_exprn : stmtn ; [ default: stmtn+1] }
Multiple-Way Selection: Examples
- Design choices for Cās switch statement
- Control expression can be only an integer type
- Selectable segments can be statement sequences, blocks, or compound statements
- Any number of segments can be executed in one execution of the construct ( there is no implicit branch at the end of selectable segments ) 4. default clause is for unrepresented values (if there is no default , the whole statement does nothing)
Multiple-Way Selection: Examples
- C#
- Differs from C in that it has a static semantics
rule that disallows the implicit execution of
more than one segment
- Each selectable segment must end with an
unconditional branch ( goto or break )
- Also, in C# the control expression and the case
constants can be strings
Multiple-Way Selection Using if
- Multiple Selectors can appear as direct
extensions to two-way selectors, using else- if clauses, for example in Python: if count < 10 : bag1 = True elif count < 100 : bag2 = True elif count < 1000 : bag3 = True
Multiple-Way Selection Using if
- The Python example can be written as a
Ruby case case when count < 10 then bag1 = true when count < 100 then bag2 = true when count < 1000 then bag3 = true end
Schemeās Multiple Selector
⢠General form of a call to cond :
(cond (predicate1 expression1) ⦠(predicaten expressionn) [(ELSE expressionn+1)] )
Schemeās Multiple Selector
⢠The else clause is optional; else is a
synonym for true
⢠Each predicate-expression pair is a
parameter
⢠Semantics: The value of the evaluation of
cond is the value of the expression
associated with the first predicate
expression that is true
Counter-Controlled Loops: Examples
- Ada for var in [reverse] discrete_range loop ... end loop
Counter-Controlled Loops: Ada
- Design choices:
- Type of the loop variable is that of the discrete
range (A discrete range is a sub-range of an
integer or enumeration type).
- Loop variable does not exist outside the loop
- The loop variable cannot be changed in the
loop, but the discrete range can; it does not
affect loop control
- The discrete range is evaluated just once
- Cannot branch into the loop body
Counter-Controlled Loops: Examples
- C-based languages for ( [expr_1] ; [expr_2] ; [expr_3] ) statement
- The expressions can be whole statements, or even statement sequences, with the statements separated by commas
- The value of a multiple-statement expression is the value of the last statement in the expression
- If the second expression is absent, it is an infinite loop
Counter-Controlled Loops: C-based Languages
- Design choices:
- There is no explicit loop variable
- Everything can be changed in the loop
- The first expression is evaluated once, but the
other two are evaluated with each iteration
- It is legal to branch into the body of a for loop
in C
Counter-Controlled Loops: Examples
- Python
- The object is often a range, which is either a list
of values in brackets ([2, 4, 6]), or a call to the
range function (range(5), which returns 0, 1, 2,
- The loop variable takes on the values specified
in the given range, one for each iteration
- The else clause, which is optional, is executed
if the loop terminates normally
Counter-Controlled Loops: Example in F#
- Because counters require variables, and functional languages do not have variables, counter-controlled loops must be simulated with recursive functions let rec forLoop loopBody reps = if reps <= 0 then () else loopBody() forLoop loopBody, (reps ā 1)
- This defines the recursive function forLoop with the parameters loopBody (a function that defines the loopās body) and the number of repetitions
- () means do nothing and return nothing
Logically-Controlled Loops
⢠Repetition control is based on a Boolean
expression
⢠Design issues:
- Pretest or posttest?
- Should the logically controlled loop be a
special case of the counting loop statement or a
separate statement?
Logically-Controlled Loops: Examples
⢠C and C++ have both pretest and posttest
forms, in which the control expression can
be arithmetic:
while (control_expr) loop_body
or
do { loop body while (control_expr)
User-Located Loop Control Mechanisms
- Sometimes it is convenient for the
programmers to decide a location for loop control (other than top or bottom of the loop)
- Simple design for single loops (e.g., break )
- Design issues for nested loops
- Should the conditional be part of the exit?
- Should control be transferable out of more than
one loop?
User-Located Loop Control Mechanisms
- C , C++, Python, Ruby, and C# have
unconditional unlabeled exits ( break )
- Java and Perl have unconditional labeled exits
( break in Java, last in Perl)
- C, C++, and Python have an unlabeled control
statement, continue , that skips the remainder of
the current iteration, but does not exit the loop
- Java and Perl have labeled versions of continue
Iteration Based on Data
Structures
- The number of elements in a data structure
controls loop iteration
- Control mechanism is a call to an iterator function
that returns the next element in some chosen
order, if there is one; else loop is terminate
- C's for can be used to build a user-defined
iterator:
for (p=root; p == NULL; traverse(p)){ ... }
Iteration Based on Data Structures
(continued)
⢠PHP
- current points at one element of the array
- next moves current to the next element
- reset moves current to the first element