Flow of Control Java branching statements: Loops: The type boolean

Slides:



Advertisements
Similar presentations
Flow of Control Chapter 3.
Advertisements

Strings Testing for equality with strings.
Intro to CS – Honors I Control Flow: Loops GEORGIOS PORTOKALIDIS
1 Control Structures (and user input). 2 Flow of Control The order statements are executed is called flow of control By default, statements in a method.
Logical Operators Java provides two binary logical operators (&& and ||) that are used to combine boolean expressions. Java also provides one unary (!)
Chapter 31 Flow of Control Chapter 3. 2 Reminders Project 1 was due last night Project 2 released: due Sept 10:30 pm - No Late Submissions Follow.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Java Software Solutions Foundations of Program Design Sixth Edition by Lewis.
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2008 Pearson Education, Inc., Upper.
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2008 Pearson Education, Inc., Upper.
Flow of Control Loops – Chapter 3.2. Java Loop Statements: Outline the while Statement the do-while Statement the for Statement.
Flow of Control Chapter 3.
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2009 Pearson Education, Inc., Upper.
1 Flow of Control A word about PowerPoint. PowerPoint was released by Microsoft in 1990 as a way to euthanize cattle using a method less cruel than hitting.
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2008 Pearson Education, Inc., Upper.
JAVA: An Introduction to Problem Solving & Programming, 6 th Ed. By Walter Savitch ISBN © 2012 Pearson Education, Inc., Upper Saddle River,
Chapter 3 Edited by JJ Shepherd
Flow of Control Module 3. Objectives Use Java branching statements Compare values of primitive types Compare objects such as strings Use the primitive.
Flow of Control Chapter 3 Flow of control Branching Loops
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2008 Pearson Education, Inc., Upper.
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2009 Pearson Education, Inc., Upper.
Chapter 4: Control Structures II
Chapter 5 Conditionals and Loops. © 2004 Pearson Addison-Wesley. All rights reserved5-2 The switch Statement The switch statement provides another way.
Chapter 5 Conditionals and Loops. © 2004 Pearson Addison-Wesley. All rights reserved2/29 The switch Statement The switch statement provides another way.
Flow of Control Chapter 3. Outline Branching Statements Java Loop Statements Programming with Loops The Type boolean.
Control Flow Computer Engineering Department Java Course Asst. Prof. Dr. Ahmet Sayar Kocaeli University - Fall 2014.
JAVA: An Introduction to Problem Solving & Programming, 7 th Ed. By Walter Savitch ISBN © 2015 Pearson Education, Inc., Upper Saddle River,
JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2008 Pearson Education, Inc., Upper.
JAVA: An Introduction to Problem Solving & Programming, 7 th Ed. By Walter Savitch ISBN © 2015 Pearson Education, Inc., Upper Saddle River,
Flow of Control: Loops Module 4. Objectives Design a loop Use while, do, and for in a program Use the for-each with enumerations Use assertion checks.
Flow of Control Joe McCarthy CSS 161: Fundamentals of Computing1.
Catie Welsh February 9,  Friday - No Lab! ◦ Bring questions on Project 2  Lab 3 due on Friday 2.
1 Flow of Control Chapter 5. 2 Objectives You will be able to: Use the Java "if" statement to control flow of control within your program.  Use the Java.
Copyright © 2014 by John Wiley & Sons. All rights reserved.1 Decisions and Iterations.
Chapter 31 Flow of Control Chapter 3. 2 Objectives learn about Java branching statements learn about loops learn about the type boolean (optional) learn.
Chapter 31 Announcements Project 2 has been posted –Due Feb 1st at 10:00pm –Work ALONE! Help hours –Monday – Thursday, 7-10pm –LWSN B146 Quiz solutions.
Flow of Control Chapter 3. JAVA: An Introduction to Problem Solving & Programming, 5 th Ed. By Walter Savitch and Frank Carrano. ISBN © 2009.
Discussion 4 eecs 183 Hannah Westra.
COS 260 DAY 5 Tony Gauvin.
Java Fundamentals 4.
CprE 185: Intro to Problem Solving (using C)
CHAPTER 4 REPETITION CONTROL STRUCTURE / LOOPING
Computer Programming with Java
Boolean expressions and if-else statements
Loops.
Selections Java.
Chapter 3 Edited by JJ Shepherd
EGR 2261 Unit 4 Control Structures I: Selection
Flow of Control.
Chapter 3 Branching Statements
Chapter 5: Control Structures II
Loop Structures.
Repetition-Counter control Loop
CSS 161: Fundamentals of Computing
Branching Loops exit(n) method Boolean data type and expressions
MSIS 655 Advanced Business Applications Programming
Flow of Control Chapter 3 Chapter 3.
CSS161: Fundamentals of Computing
Introduction to C++ Programming
Flow of Control Chapter 3.
Boolean Expressions to Make Comparisons
Chapter 3 Selections Liang, Introduction to Java Programming, Ninth Edition, (c) 2013 Pearson Education, Inc. All rights reserved.
Flow of Control Chapter 3.
Review of Previous Lesson
Chapter 3 Debugging Section 3.4
Announcements/Reminders
Controlling Program Flow
Boolean Expressions September 1, 2019 ICS102: The course.
Presentation transcript:

Flow of Control Java branching statements: Loops: The type boolean if-else statement switch statement The Conditional Operator Loops: while for repeat-until The type boolean Reading => Section 1.3

Flow of Control Flow of control is the order in which a program performs actions. So far, the order has been sequential. A branching statement chooses between two or more possible actions. A loop statement repeats an action until a stopping condition occurs.

The if-else Statement The if-else statement is one type of branching statement. Syntax: if (Boolean_Expression) Statement_1 else Statement_2 Example: if (count < 3) total = 0; total = total + count;

The if-else Statement, cont.

Omitting the else Part The else clause is optional; if the expression after the if is false, no action occurs. Syntax: if (Boolean_Expression) Statement Example: caloriesPerDay = 2000; // Initial assumption weight = keyboard.nextInt(); ideal = keyboard.nextInt(); if (weight > ideal) caloriesPerDay = 1500; System.out.println(“The difference is: “ + (weight – ideal));

Compound Statements To include multiple statements in a branch, enclose the statements in braces. if (count < 10) { total = 0; count = 0; } else { System.out.println(“today is Friday”); System.out.println(“tomorrow is Saturday”); if (x == y) { x = x + 1; y = 0;

Introduction to Boolean Expressions The condition in an if-statement (or loop) is a boolean expression. The value of a boolean expression is either true or false. Simple examples: time < limit balance <= 0 ch == ‘a’ x >= y+Z*w x != y

Java Comparison Operators Boolean expressions are composed using individual “terms” which typically use Java Comparison operators.

Primary Logical Operators Individual terms are connected using logical operators: && “and” or “conjunction” || “or” or “disjunction” ! “not” or “negation” Arbitrarily complex logical expressions can be composed. (x < y) && !(z >= w) !(x < y) || ((x + y) == z) && (w != u) ((x >= w) || (z == y)) && !((u <= v) && (x == y)) Note that rules of precedence apply, thereby adding to our rules of precedence.

Compound Boolean Expressions Example using the “and” (&&) operator. if ((score >= 0) && (score <= 100)) ... Parentheses can be used to enhance readability. The expression is true only when both sub-expressions are true. Not allowed: if (0 <= score <= 100)

Compound Boolean Expressions, cont. Example using the “or” (||) operator. Example: if ((quantity > 5) || (cost < 10)) ... Example using negation: “not” (!) operator. If (!(x > 10))

Truth Tables

Boolean Variables Recall that boolean is a Java primitive type. Variables can be declared and initialized: boolean b1, b2; boolean b3 = true; b1 = true; b2 = false; b3 = b1 && (b2 || !b3);

Boolean Variables Boolean variables frequently appear in the condition of an if-statement: if (b3 == true) // rookie “mistake” ... if (b3) if (!b3) // instead of if (b3 == false)

Inclusive vs. Exclusive “or” The “or” in Java is called inclusive - the expression is true when either or both of the sub-expressions is true Another type of “or” is exclusive: True if one or the other, but not both is true. Either work or play, but not both: (work || play) && (!work || !play) (work || play) && !(work && play) The exclusive-or operator in Java is ^ (work ^ play) not a logical operator in most languages

Nested Statements An if-else statement can contain any sort of statement within it. In particular, it can contain another if-else statement in the: “if” part. “else” part. or both. In such a case the if statement is referred to as nested, and as having an inner and outer if statements.

Nested Statements, cont. if (Boolean_Expression_1) if (Boolean_Expression_2) Statement_1 else Statement_2 if (Boolean_Expression_3) Statement_3 Statement_4

Nested if Example System.out.print(“Enter temp:”); int temperature = keyboard.nextInt(); System.out.print(“Is it sunny?”); char sunny = keyboard.nextChar(); if (temperature > 90) // int temperature if (sunny == ‘y’) // char sunny System.out.println(“Beach”); else System.out.println(“Movie”); if (sunny == ‘y’) System.out.println(“Tennis”); System.out.println(“Stay home”);

Nested if Example System.out.print(“Enter temp:”); int temperature = keyboard.nextInt(); System.out.print(“Is it sunny?”); boolean sunny = keyboard.nextBoolean(); if (temperature > 90) // int temperature if (sunny) // boolean sunny System.out.println(“Beach”); else System.out.println(“Movie”); if (sunny) System.out.println(“Tennis”); System.out.println(“Volleyball”);

Nested Statements, cont. The inner if statement, outer if statement, or both, may contain only an else part; consequently there are many forms of nesting. if (Boolean_Expression_1) Statement_1 else if (Boolean_Expression_3) Statement_2 Statement_3

Nested Statements, cont. if (Boolean_Expression_1) if (Boolean_Expression_2) Statement_1 else Statement_2 Statement_3

Nested Statements, cont. if (Boolean_Expression_1) if (Boolean_Expression_2) Statement_1 else Statement_2 if (Boolean_Expression_3) Statement_3

Nested Statements, cont. Why is the following example confusing? if (Boolean_Expression_1) if (Boolean_Expression_2) Statement_1 else if (Boolean_Expression_3) Statement_2 Statement_3

Nested Statements, cont. Which is it? if (Boolean_Expression_1) if (Boolean_Expression_2) Statement_1 else if (Boolean_Expression_3) Statement_2 Statement_3

Nested Statements, cont. Each else is paired with the nearest preceding unmatched if. Braces can be used to group statements and over-ride the above rule. Indentation can communicate which if goes with which else. Indentation does not determine which else goes with which if.

Nested Statements, cont. Indentation does NOT matter; the compiler parses both the same: First form Second form if (a > b) if (a > b) if (c > d) if (c > d) e = f; e = f; else else g = h; g = h; Second form is preferable; indentation should reflect the nesting of if-else statements.

Nested Statements, cont. These, however, are different: First form Second form if (a > b) if (a > b) { if (c > d) if (c > d) e = f; e = f; else } g =h; else g = h; Note how the braces force the else to be associated with the outer if.

Multibranch if-else Statements The following pattern of nested if-else statements is common: if (Boolean_Expression_1) Statement_1 else if (Boolean_Expression_2) Statement_2 if (Boolean_Expression_3) Statement_3 if (Boolean_Expression_4) Statement_4 Default_Statement

Multibranch if-else Statements int grade; : if (grade >=90) System.out.print(“A”); else if (grade >= 80) System.out.print(“B”); if (grade >= 70) System.out.print(“C”); if (grade >= 60) System.out.print(“D”); System.out.print(“F”);

Multibranch if-else Statements It is common practice to format this case as follows: if (Boolean_Expression_1) Statement_1 else if (Boolean_Expression_2) Statement_2 else if (Boolean_Expression_3) Statement_3 else if (Boolean_Expression_4) Statement_4 else Default_Statement

Multibranch if-else Statements, cont.

Multibranch if-else Statements, cont. Logically, the preceding is equivalent to: if (score >= 90) grade = ‘A’; if ((score >= 80) && (score < 90)) grade = ‘B’; if ((score >= 70) && (score < 80)) grade = ‘C’; if ((score >= 60) && (score < 70)) grade = ‘D’; if (score < 60) grade = ‘F’;

Multibranch if-else Statements, cont. Is the following equivalent? if (score >= 90) grade = ‘A’; if (score >= 80) grade = ‘B’; if (score >= 70) grade = ‘C’; if (score >= 60) grade = ‘D’; if (score < 60) grade = ‘F’;

Branch Statement Examples See the following for examples of branching with if statements: http://www.cs.fit.edu/~pbernhar/teaching/cse1001/max http://www.cs.fit.edu/~pbernhar/teaching/cse1001/median

Using the Equality Operator == The == operator is appropriate for determining if two integers or characters have the same value. int a = keyboard.nextInt(); if (a == 3) . . . Recall that only a finite number of real numbers can be represented in any fixed number, e.g., 32, of bits. This results in: Round-off error – results from inexact representation of real numbers. Error propagation – results from applying arithmetic operations to values that have been approximated.

Using the Equality Operator == Because of round-off error and error propagation, the == operator is not appropriate for determining if two floating point values are equal. It is common to use < and some appropriate tolerance instead: if (Math.abs(b - c) < epsilon) ... where b, c, and epsilon are of a floating point type, i.e., double or float

Using the Equality Operator ==, cont. The == operator is also not appropriate for determining if two objects, such as strings, have the same value. String s1 = “hello”; String s2 = “hello”; : if (s1 == s2) System.out.println(“Strings are equal!”); else System.out.println(“Strings are not equal!”);

Using ==, cont. To test the equality of objects of class String, use method equals: String s1 = “hello”; String s2 = “hello”; if (s1.equals(s2)) System.out.println(“Strings are equal!”); else System.out.println(“Strings are not equal!”); Could have used s2.equals(s1) in the above.

Using the Equality Operator ==, cont. Another example: String s1 = “dog”; String s2 = “cat”; if (s1 == s2) System.out.println(“Strings are equal!”); else System.out.println(“Strings are not equal!”); s1 = s2; // What happens to the memory used by s1? System.out.println(s1); // What is output here? => “a CAT, is NOT, a DOG!” (from the musical Cats)

equals and equalsIgnoreCase Note that equals is case-sensitive! To test for equality ignoring case, use equalsIgnoreCase: if (s1.equalsIgnoreCase(“HelLo”)) would evaluate to true. Normally these methods are called on variables, but not always: s1.equals(s2) // The typical case s1.equals(“dog”) // Also very common “dog”.equals(s1) // Unusual, but occasionally used “dog”.equals(“cat”) // Least likely

Testing Strings for Equality

Some (odd) Terminology Note on terminology – method calls in Java take the following form: object_1.method(parameter_1, parameter_2,…,parameter_N) In such cases object_1 is frequently referred to as “this.” Example: equals(Other_String) – Returns true if this string and Other_String are equal. Otherwise, returns false. s1.equals(s2) – Here, s1 is “this.”

Lexicographic Order Lexicographic order is similar to alphabetical order. Based on the order of all the ASCII and Unicode characters: All digits come before all the letters. All uppercase letters come before all lower case letters. The same as alphabetical ordering when all characters are either upper or lower, but not when upper and lower case are mixed. Zip comes before apple

Lexicographic Order Some additional string methods: toUpperCase() – Returns a new string having the same characters as this string, but with any lowercase letters converted to uppercase. toLowerCase() - Returns a new string having the same characters as this string, but with any uppercase letters converted to lowercase. compareTo(A_String) – Compares this string with A_String to see which string comes first in lexicographic ordering. Returns a negative integer if this string is first, returns zero if the two strings are equal, and returns a positive integer if A_String is first.

Lexicographic Order Example: String s1 = “Hello”; String lowerS1 = s1.toLowerCase(); String s2 = “hello”; if (lowerS1.compareTo(s2) == 0) System.out.println(“Equal!”); else if (lowerS1.compareTo(s2) < 0) System.out.println(“lowerS1 comes first lexicographically!”) else // compareTo returned a positive number System.out.println(“s2 comes first lexicographically!”);

Lexicographic Order Example: String s1 = “Hello”; String lowerS1 = “dog”; String s2 = “hello”; if (lowerS1.compareTo(s2) == 0) System.out.println(“Equal!”); else if (lowerS1.compareTo(s2) < 0) System.out.println(“lowerS1 comes first lexicographically!”) else // compareTo returned a positive number System.out.println(“s2 comes first lexicographically!”);

Lexicographic Order Example: String s1 = “Hello”; String lowerS1 = “Dog”; String s2 = “hello”; if (lowerS1.compareTo(s2) == 0) System.out.println(“Equal!”); else if (lowerS1.compareTo(s2) < 0) System.out.println(“lowerS1 comes first lexicographically!”) else // compareTo returned a positive number System.out.println(“s2 comes first lexicographically!”);

Lexicographic Order Example ignoring upper and lower case: //or use s1.compareToIgnoreCase(s2) String s1 = “Hello”; String s2 = “hello”; if (s1.compareToIgnoreCase(s2) == 0) System.out.println(“Equal!”); else if (s1.compareToIgnoreCase(s2) < 0) System.out.println(“s1 comes first lexicographically!”) else // compareTo returned a positive number System.out.println(“s2 comes first lexicographically!”);

switch Statement The switch statement is another multi-way branch statement. More restricted than if-else statements Branching decision based on an integral (integer or character) expression. See http://www.cs.fit.edu/~pbernhar/teaching/cse1001/switch

switch Statement, cont. The switch statement begins with the keyword switch followed by an integral expression in parentheses and called the controlling expression. A list of cases follows, enclosed in braces. Each case consists of the keyword case followed by a constant called the case label a colon a list of statements. The list of cases is searched for a case label matching the controlling expression.

switch Statement, cont. The action associated with a matching case label is executed. If no match is found, the case labeled default is executed. The default case is optional. Repeated case labels are not allowed.

switch Statement, cont.

switch Statement, cont. The action for each case typically ends with the word break. The optional break statement prevents the consideration of other cases. The controlling expression can be anything that evaluates to an integral type (integer or character). By the way, a switch statement can be nested as well, although we won’t consider any examples just yet.

The switch Statement, cont. Syntax: switch (Controlling_Expression) { case Case_Label: Statement(s); break; … default: }

Switch with char Type A switch can be based on a char expression: char grade = 'A'; switch(grade) { case 'A': case 'B': case 'C': case 'D': System.out.println("Pass"); break; case 'W': System.out.println("Withdraw"); case 'I': System.out.println("Incomplete"); default: System.out.println("Fail"); }

Conditional Operator, cont. The conditional operator…is weird…it is: a way to branch an operator, and hence has a value (in contrast to if or switch statements) A simplified conditional operator has the following form: <boolean expression> ? <value#1> : <value#2>

Conditional Operator, cont. Consider the following: int x = keyboard.nextInt(); String S1; if (x >= 0) S1 = “positive”; else S1 = “negative”; System.out.println(“The number is “ + S1); The above is equivalent to: S1 = (x >= 0) ? “positive” : “negative”;

Conditional Operator, cont. Similarly: int x, y; : if (x == 50) y = x * 10; else y = x * 20; Is equivalent to: y = (x == 50) ? (x * 10) : (x * 20);

Conditional Operator, cont. And lastely: if (x < 0) y = 25; else y = 20; Is equivalent to (silly): if ((x < 0) ? True : false)

Loop Statements A loop repeats a statement or a group of statements. This group of statements is called the body of the loop. Example: Computing a class exam average. Computing quiz or exam averages for each student. Every loop has a control structure, which determines how many times the group of statements is repeated. Loop control has three components (ICU): Initialization Condition for termination (or continuation) Updating the condition

Loop Statements Three different types of Java loops: while for do-while Each type of loop will manage loop control in a different manner. Every loop, regardless of type, will have a body. It will be important to learn and understand which type of loop is preferable in which types of situations. This is particularly true for do-while loops!!!!!!!!!!!!!!!!!!! When in doubt, don’t use a do-while loop

while Loop A while loop is controlled by a boolean expression: If the expression is true then the loop continues, i.e., the body is repeated. If the expression is false then the loop is terminated. Example #1: int i, n; System.out.print(“Enter N:”); n = keyboard.nextInt(); i = 1; while (i <= n) { System.out.println(“Hello World!”); i = i + 1; }

while Loop The loop body could be a single statement: or: while (Boolean_Expression) Body_Statement or: { First_Statement Second_Statement … }

while Loop, cont.

while Loop, cont. Example #2: Input a positive integer n>=0 Output the value of i and 2i, for all 0<=i<=n int i, v, n; System.out.print(“Enter n:”); n = keyboard.nextInt(); i = 0; v = 1; while (i <= n) { System.out.println(i + “ “ + v); v = v * 2; i = i + 1; }

while Loop, cont. Example #3: Input a positive integer n>=0 Output a silly rhyme

while Loop See: http://www.cs.fit.edu/~pbernhar/teaching/cse1001/evens http://www.cs.fit.edu/~pbernhar/teaching/cse1001/loops http://www.cs.fit.edu/~pbernhar/teaching/cse1001/evens

Example: Bug Infestation Suppose: Roach volume: 0.002 cubic feet Reproductive rate is: 95% per week Given: Starting roach population Total house volume Find: Number of weeks to exceed the capacity of the house Number and volume of roaches Assume that roaches do not die, shrink or leave.

Computer Simulation The following program is an example of a computer simulation. Simulations, by their very nature, tend to approximate the real world. Simulations typically make assumptions that simplify or improve the efficiency of a computation. For example, population is a real number in the following program. In other words, simulations typically do not model the real world exactly. As you have probably already come to know, e.g., computer games, simulations are very common.

while Loop First, some declarations and initial input: public class bugTest { public static final double GROWTH_RATE = 0.95; public static final double ONE_BUG_VOLUME = 0.002; public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.println("Enter total house volume in cubic feet:"); double houseVolume = keyboard.nextDouble(); System.out.println("Enter initial number of roaches in house:"); int startPopulation = keyboard.nextInt();

while Loop Now for the main loop: double population = startPopulation; double totalBugVolume = population * ONE_BUG_VOLUME; while (totalBugVolume < houseVolume) { population = population + (GROWTH_RATE * population); totalBugVolume = population * ONE_BUG_VOLUME; }

while Loop In order to count the number of weeks, one more variable is added: int countWeeks = 0; double population = startPopulation; double totalBugVolume = population * ONE_BUG_VOLUME; while (totalBugVolume < houseVolume) { population = population + (GROWTH_RATE * population); totalBugVolume = population * ONE_BUG_VOLUME; countWeeks = countWeeks + 1; }

while Loop Finally, the output: System.out.println(“Initial roach population:" + startPopulation); System.out.println(“House volume:" + houseVolume + " cubic feet,"); System.out.println(“After " + countWeeks + " weeks,"); System.out.println("the house will be filled with roaches."); System.out.println("There will be " + (int)population + " roaches."); System.out.println("They will fill “ + (int)totalBugVolume + " cubic feet."); }

for Loop A for loop typically iterates over an integer range: int i; for (i = 1; i <= 4; i++) System.out.println(i); System.out.println(“Done”); Equivalent to: i = 1; while (i <= 4) { i++; }

for Loop A for loop can decrement as well as increment: int i; for (i = 3; i >= 0; i--) System.out.println(i); The increment, or decrement, can be by any amount: for (i = 1; i <= 10; i = i + 2)

for Loop The range can start or end anywhere: int i; for (i = 34; i <= 83; i++) System.out.println(i); The body might never get executed: for (i = 10; i <= 5; i++)

for Loop Typically variables are used: int i, n; n = keyboard.nextInt(); for (i = 1; i <= n; i++) System.out.print(i); The body can contain multiple statements: int i; for (i = 1; i <= 10; i++) { System.out.print(“hello “); System.out.println(“world!”); }

for Loop Typically the loop control variable is declared in the for loop: for (int i = 1; i <= 10; i++) { System.out.print(“hello “); System.out.println(“world! for the ” + i + “th time”); } In such a case the scope of the loop control variable is limited to the loop body; the following will not compile: System.out.println(i);

Multiple Initialization, etc. This is where it gets weird… A for-loop can contain multiple statements in its initialization section. for (n = 1, p = 1; n < 10; n++) p = p * n; Only one boolean expression is allowed, but it can be arbitrarily complex, i.e., consist of &&, ||, and !. Multiple update actions are also allowed. for (i = 1, y = 100; i < n; i++, z = z - i) ...

Multiple Initialization, etc. An entire loop body could be placed in the update section. int i, x = 0; int n = nextInt(); for (i = 1; i <= n; i++) { System.out.println(“value i:” + i); x = x + i; } The above is equivalent to: for (x = 0, i = 1; i <= n; System.out.println(“value i:” + i), x = x + i, i++) ; Note the empty body, and the (required) semicolon.

Multiple Initialization, etc. In fact, a loop control variable is not even necessary. int i = 1; int n = keyboard.nextInt(); for (System.out.println(“hello”); i < n; System.out.println(“goodbye”)) ; Such “abuses” of the for-loop are not recommended.

do-while Statement Also called a do-while loop (repeat-until loop) Similar to a while statement, except that the loop body is executed at least once. Syntax: do Body_Statement while (Boolean_Expression); Recall that you should not use the do-while loop in this class unless permission is granted first..

do-while Statement, cont. First, the loop body is executed. Then the boolean expression is checked. if it is true, the loop is executed again. if it is false, the loop exits. Equivalent while statement: Statement(s)_S1 while (Boolean_Condition)

do-while Statement, cont.

do-while Statement, cont.

do-while Loop See http://www.cs.fit.edu/~pbernhar/teaching/cse1001/dowhile

Loop Terminology Some general terminology: For the obvious reasons… while loops and for loops are commonly referred to as pre-test loops. do-while loops are referred to as post-test loops. For the obvious reasons…

Choosing a Loop Type In most cases pre-test loops are preferable. The choice of loop type is a “judgment call.” If you know how many times a loop will be iterated and, in particular, if the loop is going to iterate over a fixed range of “enumerated” values, i.e., integers or chars - for loop If you don’t know how many times the loop will be iterated, but it is: Zero or more times - while loop One or more times - do-while

Techniques for Loop Termination Asking the user before each iteration is common: String CMD; System.out.print("Enter Command:"); CMD = kb.next(); while (!CMD.equals("quit")) { if (CMD.equals("add")) : else if (CMD.equals("subtract")) else System.out.println("Invalid Command"); }

Techniques for Loop Termination A sentinel value is frequently used to signal the end of the list: A negative number after a list of (nonnegative) scores would be suitable. 90 10 -1 int next = keyboard.nextInt(); while (next >= 0) { Process_The_Score next = keyboard.nextInt(); }

Nested Loops The body of a loop can contain any kind of statements, including: Other loops if-else statements Variable declarations (in a compound statement) This nesting can be arbitrarily deep and complex.

Nested Loops **** Example: for (int line = 0; line < 3; line++) { for (int star = 0; star < 4; star++) System.out.print('*'); System.out.println(); } The inner loop body will execute 4 times for each iteration of the outer loop. 12 times total **** Output: 92

Nested Loops body of outer loop body of inner loop Some Terminology: for (line = 0; line < 3; line++) { for (star = 0; star < 4; star++) System.out.print('*'); System.out.println(); } body of outer loop body of inner loop 93

Nested Loops Consider a program that inputs a list of n student names and, for each student, m quiz scores. For each student, the program should output each student’s name, along with a quiz average. Enter number of students: 2 Enter number of quizzes: 4 Enter name: Smith Enter quiz scores: 70 90 80 100 Quiz average for Smith: 85.0 Enter name: Jones Enter quiz score: 95 90 85 72 Quiz average for Jones: 85.5 94

Nested Loops Assume the following variable declarations. int n, m, quizScore, quizSum; double quizAvg; String name; Scanner keyboard = new Scanner(System.in); 95

Nested Loops System.out.print("Enter number of students:"); n = keyboard.nextInt(); System.out.print("Enter number of quizzes:"); m = keyboard.nextInt();   for (int i = 1; i <= n; i++) { System.out.print("Enter name:"); name = keyboard.next(); System.out.print("Enter quiz scores:"); quizSum = 0; for (int j = 1; j <= m; j++) { quizScore = keyboard.nextInt(); quizSum = quizSum + quizScore; } quizAvg = quizSum/(double)m; System.out.println(“Quiz average for " + name + “:” + quizAvg); ) 96

Nested Loops Now suppose there are m quiz scores and k exam scores for each student, and that output should include an exam average as well. Enter number of students: 2 Enter number of quizzes: 4 Enter number of exams: 3 Enter name: Smith Enter quiz scores: 70 90 80 100 Enter exam scores: 65 73 91 Quiz average for Smith: 85.0 Exam average for Smith: 76.3 Enter name: Jones Enter quiz scores: 95 90 85 72 Enter exam scores: 100 87 93 Quiz average for Jones: 85.5 Exam average for Jones: 93.3 See http://www.cs.fit.edu/~pbernhar/teaching/cse1001/nested 97

Nested Loops Exercises: What if we move some of the statements around; Is the program still correct? Modify the previous program so that the number of quizzes and the number of exams is different for each student, and terminated by a sentinel value, i.e., -1.

Nested Loops For example: Enter number of students: 2 Enter name: Smith Enter quiz scores: 70 90 80 100 -1 Enter exam scores: 65 73 91 -1 Quiz average for Smith: 85.0 Exam average for Smith: 76.3 Enter name: Jones Enter quiz scores: 95 90 -1 Enter exam scores: 100 87 93 87 65 -1 Quiz average for Jones: 92.5 Exam average for Jones: 86.4 99

Nested Loops How would you print out the following (for a generic value of n)? 1 2 3 4 5 2 3 4 5 3 4 5 4 5 5 Note that 2-dimensional processing typically requires doubly-nested loops.

Nested Loops First try this: 1 2 3 4 5 1 2 3 4 5 Next, modify the code to give the previous output. Lesson => start simple, and then enhance.

Nested Loops How about these? 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1

Loop Bugs Loops are the source of many programming bugs. Common loop bugs: Unintended infinite loops Off-by-one errors Empty loop bodies Testing equality of floating-point numbers

Infinite Loops A loop which repeats without ever ending is called an infinite loop. When does this happen? When the controlling boolean expression never becomes false Usually an error. The behavior of a program containing an infinite loop is often times somewhat unexpected. Produces non-stop output. Produces no output at all; program seems “dead.”

Subtle Infinite Loops Examples: System.out.print(“Enter N:”); n = keyboard.nextInt(); sum = 0; while (true) count = 1; x = 0; while (count <= n) { System.out.print(“Enter value:”); x = keyboard.nextInt(); while (true) ; sum = sum + x; } For the roach infestation example, a negative growth rate causes totalBugVolume always to be less than houseVolume.

Off-by-One Errors The loop body is repeated one too many times or one too few times. Examples: < is used when <= should be used, or visa-versa. using the index of the last character of a string instead of the length of the string (or vice versa) Easy to overlook and very frequent. int i = 0; while (i <= 10) { System.out.println(i); i++; }

Empty for Statement What is printed by: How about: int product = 1, number; for (number = 1; number <= 10; number++); product = product * number; System.out.println(product); How about: int product = 1, number = 1; while (number <= 10); { number++; }

Testing Equality of Floating-point Numbers As discussed previously, == is not reliable for floating-point numbers (which are approximate quantities). Can cause infinite loops Use <= or >= rather than == or !=. See http://www.cs.fit.edu/~pbernhar/teaching/cse1001/floatTest

Tracing Variables Tracing a program means watching the variables change while the program is running. One way to trace is to place temporary output statements in a program to print out the values of variables of interest. Where should such output statements be placed? Potentially, any point at which a variable is modified (before or after). Right after those values are input (see below) At the bottom or top of a loop Immediately before or after a computation along with an assignment

Tracing Variables Another, and usually better way to trace a program is to use an automated debugger. Keep in mind that many errors, although difficult to find, are SIMPLE programming errors! Similarly, never assume a conspiracy when stupidity will suffice…

Type boolean Boolean Expressions and Variables Truth Tables and Precedence Rules Input and Output of Boolean Values

Type boolean, cont. Type boolean is a primitive type with only two values: true and false. Boolean variables can make programs more readable. Boolean systemsAreOk; systemsAreOk = (temperature <= 100) && (thrust >= 12000) && (cabinPressure > 30) && … ; if (systemsAreOK) ... Instead of: if((temperature <= 100) && (thrust >= 12000) && (cabinPressure > 30) && …)

Boolean Expressions and Variables Variables, constants, and expressions of type boolean all evaluate to either true or false. A boolean variable can be given the value of a boolean expression by using an assignment operator. boolean isPositive = (number > 0); ... if (isPositive) ... Choose names such as isPositive or systemsAreOk. Avoid names such as numberSign or systemStatus.

Precedence Rules Parentheses should be used to indicate the order of operations. When parentheses are omitted, the order of operation is determined by precedence rules. Operations with higher precedence are performed before operations with lower precedence. Operations with equal precedence are done left-to-right (except for unary operations which are done right-to-left).

Precedence Rules, cont. Comparison operators: <, >, <=, >= ==, != Logical operators: & | && ||

Precedence Rules, cont. In what order are the operations performed? score < min/2 - 10 || score > 90 score < (min/2) - 10 || score > 90 score < ((min/2) - 10) || score > 90 (score < ((min/2) - 10)) || score > 90 (score < ((min/2) - 10)) || (score > 90)

Short-circuit Evaluation Sometimes only part of a boolean expression needs to be evaluated to determine the value of the entire expression. If the first operand of || is true entire expression is true If the first operand of && is false entire expression is false In either case there is no need to evaluate the second operand. This is called short-circuit or lazy evaluation.

Short-circuit Evaluation, cont. Short-circuit evaluation is not only efficient, sometimes it is essential! A run-time error can result, for example, from an attempt to divide by 0. if (sum/number > 5) ... The following avoids the run-time error: if ((number != 0) && (sum/number > 5)) Complete evaluation can be achieved by substituting & for && or | for ||.

Short-circuit Evaluation Be careful! int count = 1; … if ( … && (++count < 10) ) { } System.out.println(count);

Input and Output of Boolean Values Example: boolean boo = false; System.out.println(boo); System.out.print(“Enter a boolean value: “); Scanner keyboard = new Scanner (System.in); boo = keyboard.nextBoolean();

Input and Output of Boolean Values, cont. Sample dialog: false Enter a boolean value: true true

Using a Boolean Variable to End a Loop Example: boolean numbersLeftToRead = true; while (numbersLeftToRead) { next = keyboard.nextInt(); if (next < 0) numbersLeftToRead = false; else Process_Next_Number }

Using a Boolean Variable to End a Loop, cont

break Statement in Loops: NOT recommended A break statement can be used to end a loop immediately. The break statement ends only the innermost loop that contains the break statement. break statements make loops more difficult to understand: Loop could end at different places (multiple possible exit points), harder to know where. Always try to end a loop at only one place--makes debugging easier (only one possible exit point)

Misuse of break Statements in loops (p. 177) “Because of the complications they introduce, break statements in loops should be avoided. Some authorities contend that a break statement should never be used to end a loop, Virtually all programming authorities agree that they should be used at most sparingly.”

exit Method Sometimes a situation arises that makes continuing the program pointless. A program can be terminated normally by System.exit(0). Example: if (numberOfWinners == 0) { System.out.println(“/ by 0”); System.exit(0); }