• Review Chapter 2
• Go over exercises
• Boolean expressions
• if / if-else
• switch
• while, do-while
• for (original, Iterator versions)
• (break, continue)
Control flow uses boolean expressions to navigate blocks of code.
How do we get booleans?
• directly, with true and false .
• using relational operators: < , <= , > , >= , == , !=
• using boolean operators: && , || , !
• calling a method that returns a boolean e.g. myScanner.hasNext()
• any expression, as long as it results in true or false .
• As we introduce blocks of code for the branches of ifelse's and switch statements, and for the bodies of loops, we want to group many statements together.
{ } around multiple • In Java, we place curly braces statements to group them.
• It is so common to use them with control structures that it seems like {}'s are part of their syntax, but it is a separate statement structure all on its own.
Example: { stmt1; stmt2;
}
• If there is only one statement inside the curly braces, we often drop the curly braces for legibility. Can you think of a danger with this approach?
There is no 'elif' in Java: just chain "if else" statements together: if (be1) s1 else if (be2) s2 else if (be3) s3 else s4
Syntax:
} switch (expr) { case val1: stmt1 case val2: stmt2
...
default: stmtD // this 'default' case is optional
Semantics:
• expr must be integral (whole number) or char (no Strings or booleans or floats or objects!). All case values must be constants.
• evaluate expr, and compare against each case value in order until exact match is found.
all stmt's after matching case! (thus break is common at • execute the end of each case)
• default: no value; stmtD always runs if no other case values equaled the switch expression.
Syntax:
Semantics:
• evaluate stmt (no matter what).
• evaluate boolexpr; if true, repeat (evaluate stmt again). If false, do-while is done.
• Note: semicolon after (boolexpr) is required!
;
• Note: stmt runs at least once (unlike while loop, whose stmt might not run at all).
Example: int x = 0; //consider also x = 500; do
System.out.println(x++); while (x<100);
Syntax: for (initializer; guard; incrementer) stmt
Semantics:
• initializer is a statement. Runs exactly once, before everything else. (If a variable is declared, its scope is only within loop. Variable doesn't have to be declared, it can already exist).
• guard is a boolean expression. Each iteration (including first), this is checked: true => run stmt; false => exit loop.
• incrementer is a statement. Runs after stmt, each time that stmt runs.
• Note: initializer, guard, and incrementer could each be omitted!
E.g., for (;;) stmt
Example: for (int i = 0; i<10; i=i+1)
System.out.println(i);
• foreach ( iterator : someList) is another version
• Review Chapter 3
• Go over exercises
• The array type is indicated with [ ] 's.
• Monomorphism: Just as variables can only hold one type of value, Java arrays can only hold one specified type of value, in every slot.
• Example array types: int[] double[] boolean[][] Person[]
• The type doesn't record the dimension lengths, but an array value will specify the (unchanging) lengths.
int[][][] xs = new int[3][4][5]; //a 3x4x5 structure of ints.
Brackets [ ] are used to access and update values in arrays.
int a = xs[4]; //accesses 5 th elt. of xs.
xs[0] = 7; //replaces 1 st xs elt. with a 7.
Any expression of type int may be used as an index,
regardless of the type in the array: xs[ a+4 ] xs[ i ] xs [ sc.nextInt() ] ys[ i ][ j ]
The length of an array is available as an attribute: xs.length ys[i].length
•