Flow of Control of Program Statements CS 112 Introduction to Programming. Basic if Conditional Statement Basic Test: Relational Operators

Similar documents
CS 112 Introduction to Programming

CS 112 Introduction to Programming. Exercise: MatchDB. match1. Removing break. Solution I: Using break. Loop Patterns: break; Fencepost.

Topic 14 while loops and loop patterns

Building Java Programs

Building Java Programs

Garfield AP CS. User Input, If/Else. Most slides from Building Java Programs. Thanks, Stuart Regesand Marty Stepp!

Advanced if/else & Cumulative Sum

Building Java Programs

CSS 161 Fundamentals of Compu3ng. Flow control (2) October 10, Instructor: Uma Murthy

CS 112 Introduction to Programming

CS 112 Introduction to Programming

Returns & if/else. Parameters and Objects

AP Computer Science. if/else, return values. Copyright 2010 by Pearson Education

Recap: Assignment as an Operator CS 112 Introduction to Programming

Topic 12 more if/else, cumulative algorithms, printf

COSC 236 Section 101 Computer Science 1 -- Prof. Michael A. Soderstrand

CS 112 Introduction to Programming

Building Java Programs

Building Java Programs

Lecture 4: Conditionals

Building Java Programs

CS 112 Introduction to Programming

! definite loop: A loop that executes a known number of times. " The for loops we have seen so far are definite loops. ! We often use language like

Building Java Programs

Java. Programming: Chapter Objectives. Why Is Repetition Needed? Chapter 5: Control Structures II. Program Design Including Data Structures

Building Java Programs

Topic 11 Scanner object, conditional execution

Topic 11 Scanner object, conditional execution

Building Java Programs Chapter 5

Type boolean. Building Java Programs. Recap: Type boolean. "Short-circuit" evaluation. De Morgan's Law. Boolean practice questions.

Building Java Programs Chapter 4

Condition-Controlled Loop. Condition-Controlled Loop. If Statement. Various Forms. Conditional-Controlled Loop. Loop Caution.

CompSci 125 Lecture 11

Java Programming: Guided Learning with Early Objects Chapter 5 Control Structures II: Repetition

Loops. CSE 114, Computer Science 1 Stony Brook University

Topic 12 more if/else, cumulative algorithms, printf

Selec%on and Decision Structures in Java: If Statements and Switch Statements CSC 121 Spring 2016 Howard Rosenthal

Selec%on and Decision Structures in Java: If Statements and Switch Statements CSC 121 Fall 2016 Howard Rosenthal

Chapter 3. Selections

CSC 1051 Villanova University. CSC 1051 Data Structures and Algorithms I. Course website:

Midterm Review Session

CS 106A, Lecture 5 Booleans and Control Flow

Lecture 6: While Loops and the Math Class

Repetition Structures

CS 112 Introduction to Programming

Java Programming: Guided Learning with Early Objects Chapter 5 Control Structures II: Repetition

CSC 1051 Data Structures and Algorithms I

CSC 1051 Data Structures and Algorithms I

Computer Programming. Basic Control Flow - Loops. Adapted from C++ for Everyone and Big C++ by Cay Horstmann, John Wiley & Sons

CSC 1051 Data Structures and Algorithms I

COMP-202 Unit 4: Programming With Iterations. CONTENTS: The while and for statements

Building Java Programs

CS 112 Introduction to Programming

Accelerating Information Technology Innovation

COSC 123 Computer Creativity. Java Decisions and Loops. Dr. Ramon Lawrence University of British Columbia Okanagan

STUDENT LESSON A12 Iterations

Selections. CSE 114, Computer Science 1 Stony Brook University

Introduction. C provides two styles of flow control:

Repetition, Looping. While Loop

Conditional Execution

Motivation of Loops. Loops. The for Loop (1) Learning Outcomes

L o o p s. for(initializing expression; control expression; step expression) { one or more statements }

Loops. EECS1022: Programming for Mobile Computing Winter 2018 CHEN-WEI WANG

Midterm Examination (MTA)

Sequence structure. The computer executes java statements one after the other in the order in which they are written. Total = total +grade;

Control Structures in Java if-else and switch

Outline. Overview. Control statements. Classes and methods. history and advantage how to: program, compile and execute 8 data types 3 types of errors

CS1150 Principles of Computer Science Loops (Part II)

Review. Primitive Data Types & Variables. String Mathematical operators: + - * / % Comparison: < > <= >= == int, long float, double boolean char

Motivations. Chapter 5: Loops and Iteration. Opening Problem 9/13/18. Introducing while Loops

Chapter 5 Loops Liang, Introduction to Java Programming, Tenth Edition, Global Edition. Pearson Education Limited

Chapter 4 Loops. Lecture notes for computer programming 1 Faculty of Engineering and Information Technology Prepared by: Iyad Albayouk

Chapter 4: Control Structures I

Why Is Repetition Needed?

Università degli Studi di Bologna Facoltà di Ingegneria. Principles, Models, and Applications for Distributed Systems M

Basic computer skills such as using Windows, Internet Explorer, and Microsoft Word. Chapter 1 Introduction to Computers, Programs, and Java

Java Coding 3. Over & over again!

JAVA PROGRAMMING LAB. ABSTRACT In this Lab you will learn to write programs for executing statements repeatedly using a while, do while and for loop

CS106X Handout 03 Autumn 2012 September 24 th, 2012 Getting Started

Principles of Computer Science I

Loops. EECS1021: Object Oriented Programming: from Sensors to Actuators Winter 2019 CHEN-WEI WANG

Repe$$on CSC 121 Spring 2017 Howard Rosenthal

FLOW CONTROL. Author: Boaz Kantor The Interdisciplinary Center, Herzliya Introduction to Computer Science Winter Semester

Motivation of Loops. Loops. The for Loop (1) Learning Outcomes

COMP-202: Foundations of Programming. Lecture 3: Boolean, Mathematical Expressions, and Flow Control Sandeep Manjanna, Summer 2015

Theory of control structures

Reviewing all Topics this term

Chapter 3 Selections. Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved.

How would you handle the case for when a user selects an option? 1/15/2016 CSE 11 WINTER LEC 6 2

YEAH 2: Simple Java! Avery Wang Jared Bitz 7/6/2018

Admin. CS 112 Introduction to Programming. Recap: Exceptions. Summary: for loop. Recap: CaesarFile using Loop. Summary: Flow Control Statements

Topic 5 for loops and nested loops

CS 112 Introduction to Programming

YOLOP Language Reference Manual

CONDITIONAL EXECUTION

Loops. Repeat after me

Flow of Control Branching 2. Cheng, Wei COMP May 19, Title

Chapter 4 Loops. Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved.

Control flow, conditionals, boolean expressions, block statements, nested statements. Course website:

Information Science 1

Transcription:

Flow of Control of Program Statements CS 112 Introduction to Programming (Spring 2012) q Java provides two types of program flow of control statements: decision statements, or conditional statements: decide whether or not to execute a particular statement repetition statements, or loop statements: perform a statement over and over repetitively Lecture #8: More on Conditional & Loop Zhong Shao Department of Computer Science Yale University Office: 314 Watson q With conditional and loop statements, we http://flint.cs.yale.edu/cs112 can write substantial programs Acknowledgements: some slides used in this class are taken directly or adapted from those accompanying the two textbooks: Introduction to Programming in Java: An Interdisciplinary Approach by Robert Sedgewick and Kevin Wayne and Building Java Programs: A Back to Basics Approach by Stuart Reges and Marty Stepp Basic if Conditional Statement Basic Test: Relational Operators q A basic test is to compare two values using a Executes statement if test is true if (test) statement operator : condition evaluated true Operator false statement q Example: double gpa = console.nextdouble(); if (gpa >= 4.0) System.out.println("Welcome to Yale University!"); Meaning relational Example Value == equals 1 + 1 == 2 true!= does not equal 3.2!= 2.5 true < less than 10 < 5 false > greater than 10 > 5 true <= less than or equal to 126 <= 100 false >= greater than or equal to 5.0 >= 5.0 true q Note the difference between the equality operator (==) and the assignment operator (=) 1

Lesson: Comparing Real Numbers Beyond basic if: Comparing two Integers q You should rarely use the equality operator (==) when comparing two real numbers in many situations, you might consider two real numbers to be "close enough, e.g., final double EPSILON = 0.00001; if (Math.abs (f1 - f2) < EPSILON) System.out.println ("Essentially equal."); q If we had only if, to compare two integers a and b, and distinguish the two cases: a > b, a <= b public static void compare(int a, int b) { if (a > b) System.out.println(a + > + b); if (a <= b) System.out.println(a + <= + b); #comparisons: 2 Comparing Two Integers q With if/else, to compare two integers a and b, and distinguish two cases: a > b, a <= b public static void compare(int a, int b) { if (a > b) System.out.println(a + > + b); else System.out.println(a + <= + b); #Comparison: 1 Nested if/else q Chooses among outcomes using many tests q The statement executed as a result of an if-else statement could be another if statement these are called nested if/else statements q Typical pattern if (case1) // do case 1 else if (case 2) // not case 1, test case 2 // do case 2 else if (case 3) // not cases 1 and 2, test case 3 // do case 3 else // not cases 1, 2, 3 // default case 2

Comparing two Integers: Sequential if Solution II: Nested Comparison q Write a method to compare two integers a and b, and distinguish three cases: a > b, a < b, a == b public static void compare(int a, int b) { if (a > b) { System.out.println(a + > + b); if (a < b) { System.out.println(a + < + b); if (a == b) { System.out.println(a + == + b); Q: How many comparisons? public static void compare(int a, int b) { if (a > b) { System.out.println(a + > + b); else if (a < b) { System.out.println(a + < + b); else { // a == b System.out.println(a + == + b); Q: How many comparisons? Benefit of nested comparison: reduce # comparisons Grading Curve FIX: Using nested comparison to achieve mutual exclusion. Nested if/else/if q How is this code for grading based on percentiles? Scanner console = new Scanner(System.in); System.out.print("What percentile? "); int percent = console.nextint(); if (percent >= 90) { System.out.println("You got an A!"); else if (percent >= 80) { System.out.println("You got a B!"); else if (percent >= 70) { System.out.println("You got a C!"); else if (percent >= 60) { System.out.println("You got a D!"); else if (percent < 60) { System.out.println("You got an F!");... 11 q If a nested if/else ends with else, exactly one case be chosen. q If ends with if, the code might not choose any case: q if (test) { else if (test) { else if (test) { Example: if (place == 1) { System.out.println("Gold medal!"); else if (place == 2) { System.out.println("Silver medal!"); else if (place == 3) { System.out.println("Bronze medal."); 3

Nested if Structures Matching Nested if Statements exactly 1 case (mutually exclusive) if (test) { else if (test) { else { if (test) { if (test) { if (test) { 0 or 1 case (mutually exclusive) if (test) { else if (test) { else if (test) { 0, 1, or many cases (independent tests; may not be exclusive) q Nested if statements may have a matching problem if (temperature < 50) if (temperature < 100) System.out.println( Cool! ); else System.out.println( Hot! ); Nested if w/ Ambiguity Nested if Statements if (temperature < 50) if (temperature < 100) System.out.println( Cool! ); else System.out.println( Hot! ); t < 50 Yes if (temperature < 50) if (temperature < 100) System.out.println( Cool! ); else System.out.println( Hot! ); No t < 50 Yes if (temperature < 50) if (temperature < 100) System.out.println( Cool! ); else System.out.println( Hot! ); if (temperature < 50) if (temperature < 100) System.out.println( Cool! ); else System.out.println( Hot! ); No t < 100 Yes Hot! t < 100 Yes - Rule: an else clause is matched to the last unmatched if (no matter what the indentation implies) Hot! Cool! 50 100 50 100 Give a value of temperature to produce different results Cool! - If you find such statements confusing, avoid writing such structures and always use block statements ({) to make the structure clear. 4

Summary: Basic if/else Example <op1> <relational operator > <op2> if (case1) // do case 1 else if (case 2) // not case 1, test case 2 // do case 2 else if (case 3) // not cases 1 and 2, test case 3 // do case 3 else // not cases 1, 2, 3 // default case q Design a method to compute the number of days in a month? DaysInMonth1.java Refinement I Refinement II q There can be many test cases producing the same result: case 1: result 1 case 2: result 2 case 3: result 1 case 4: result 1 No need to enumerate the cases one-by-one => merge the test cases together => use a logical OR to combine the cases if (m == 1 m == 3 m == 5 m == 7 m == 8 m == 10 m == 12) numdays = 31; q We may need to check complex logical conditions a leap year condition: most years that are evenly divisible by 4 are leap years; However, there are some exceptions to this rule: Years that are evenly divisible by 100 are not leap years, unless they are also evenly divisible by 400 or year % 400 == 0 and year % 4 == 0 year % 100!= 0 5

Testing Leap Year Categories of Loops q We may need to check multiple conditions leap year or year % 400 == 0 and 4 100 400 year % 4 == 0 year % 100!= 0 y % 400 == 0 (y % 100!= 0 && y % 4 == 0) q definite loop: Executes a constant number of times. The for loops we have seen are mostly definite loops. q indefinite loop: One where the number of times its body repeats is unknown in advance by the programmer, e.g., Prompt the user until they type a non-negative number. Print random numbers until a prime number is printed. Repeat until the user has typed "q" to quit. Java Repetition /Loop Statements The while Loop q Java has three kinds of loop statements: the for loop the while loop, the do-while loop, and q They have the same expressive power q Which loop statements to use will depend on the situation, and we should choose the one which is more intuitive q while loop: Repeatedly executes its body as long as a logical test is true. while (<test>) { <statement(s)>; q Example: while is a keyword int num = 1; while (num <= 200) { System.out.print(num + " "); num = num * 2; // output: 1 2 4 8 16 32 64 128 // initialization // test // update 6

The while Statement Example: while Loop q If the condition of a while statement is false initially, the statement is never executed q Therefore, the body of a while loop will execute zero or more times // finds the first factor of 91 int n = 91; int factor = 2; while (n % factor!= 0) { factor++; System.out.println("First factor is " + factor); Programming Pattern: Sequential Scan Programming Pattern: Early Exit q Visit each element in a set, and update state variables initialize states (e.g., sumsofar, minsofar, maxsofar) q Break out a loop before seeing all elements for each element process element (e.g., checking if it is what we are looking for, if it is, terminate the loop) for each element process element (e.g., update state such as sumsofar, minsofar, maxsofar) q Typical in a search problem Find what you are looking for, i.e., an evidence 7

Sequential Scan and User Input User Input Control q Using repeat statements to process a stream of user input (e.g., command or data) is a quite common task q We first focus on collecting statistics from a stream of user data to, e.g., a sequence of grades a sequence of words q A programming human user interface decision issue: How does your program know how many data items? q Two input styles Out of band control protocol User first specifies the number of data items In-band control protocol User finishes input by entering a sentinel value e.g., -1 to signal the end of input grades Why in-band sentinel: flexibility. Implication: a data item just read can be either a real data item or the signaling sentinel N data 1 data N Input Style Sentinel Values N data 1 data N data control q sentinel: A value that signals the end of user input. sentinel loop: Repeats until a sentinel value is seen. q Example: Write a program that prompts the user for text until the user types nothing, then output the total number of characters typed. (In this case, the empty string is the sentinel value.) Type a line (or nothing to exit): hello Type a line (or nothing to exit): this is a line Type a line (or nothing to exit): You typed a total of 19 characters. 8

Solution Changing the Sentinel Value String response = "dummy"; // "dummy" value, anything but "" while (!response.equals("")) { // if not equal to empty string System.out.print("Type a line (or nothing to exit): "); response = StdIn.readLine(); // read a string from std input sum += response.length(); // the length of the string read System.out.println("You typed a total of " + sum + " characters."); q Changing the sentinel's value to "quit" String response = "dummy"; // "dummy" value, anything but "quit" while (!response.equals("quit") ) { System.out.print("Type a line (or \"quit\" to exit): "); response = StdIn.readLine(); sum += response.length(); System.out.println("You typed a total of " + sum + " characters."); Type a line (or "quit" to exit): hello Type a line (or "quit" to exit): this is a line Type a line (or "quit" to exit): quit You typed a total of 23 characters. q This solution produces the wrong output (should still be 19 characters). Why? A Simpler Problem... Previous Solution q Revisit the countdown method that prints from a given maximum (>=1) to 1, separated by commas. For example, the call: countdown(5) should print: 5, 4, 3, 2, 1 q public static void countdown(int max) { for (int i = max; i >= 1; i--) { System.out.print(i + ", "); System.out.println(); // to end the line of output Output from countdown(5): 5, 4, 3, 2, 1, q public static void countdown(int max) { for (int i = max; i >= 1; i--) { System.out.print(", " + i); System.out.println(); // to end the line of output Output from countdown(5):, 5, 4, 3, 2, 1 9

Fence Post Analogy Fencepost Loop q We print n numbers but need only n - 1 commas. q Similar to building a fence with wires separated by posts: If we use a flawed algorithm that repeatedly places a post + wire, the last post will have an extra dangling wire. for (length of fence) { place some wire. q Add a statement outside the loop to place the initial "post." Also called a fencepost loop or a "loop-and-a-half" solution. for (length of fence - 1) { place some wire. Many programmers feel heart-broken to see this redundancy not removed by loop Fencepost Method Solution Back to Counting w/ Sentinel q public static void countdown(int max) { System.out.print(max); // first post for (int i = max-1; i >= 1; i--) { System.out.print(", " + i); // wire + post System.out.println(); // to end the line Alternate solution: Either first or last "post" can be taken out: public static void countdown(int max) { for (int i = max; i >= 2; i--) { System.out.print(i + ", "); // post + wire System.out.println(1); // last post String response = "dummy"; // "dummy" value, anything but "quit" while (!response.equals("quit") ) { System.out.print("Type a line (or \"quit\" to exit): "); response = StdIn.readLine(); sum += response.length(); System.out.println("You typed a total of " + sum + " characters."); Type a line (or "quit" to exit): hello Type a line (or "quit" to exit): this is a line Type a line (or "quit" to exit): quit You typed a total of 23 characters. 10

The Problem with our Code A Fencepost Solution q Our code uses a pattern like this: sum = 0. while (input is not the sentinel) { prompt for input; read input. add input length to the sum. q On the last pass, the sentinel s length (4) is added to the sum: prompt for input; read input ("quit"). add input length (4) to the sum. q This is a fencepost problem. Must read N lines, but only sum the lengths of the first N-1. sum = 0. prompt for input; read input. // place a "post" while (input is not the sentinel) { add input length to the sum. // place a "wire" prompt for input; read input. // place a "post" q Sentinel loops often utilize a fencepost "loop-anda-half" style solution by pulling some code out of the loop. Fencepost Sentinel Loop Define as constants Summary public static final String SENTINEL = "quit"; public static final String PROMPT = "Type a line (or \"" + SENTINEL + "\" to exit): ; public static Count() { // pull one prompt/read ("post") out of the loop String response = getstring(prompt, console); while (!response.equals(sentinel) ) { sum += response.length(); // wire response = getstring(prompt, console); // post System.out.println("You typed a total of " + sum + " characters."); public static String getstring(string prompt, Scanner console) { System.out.print(prompt); return StdIn.readLine(); for (length of fence) { place some wire. for (length of fence - 1) { place some wire. 11

Another Approach Sentinel Loop Internal Test Do we need both tests? for (length of fence) { place some wire. for (length of fence) { if (! last post) place some wire. Detect if it is the last post in the loop, if it is, do not place the wire int grade = 0; while ( grade!= -1 ) { System.out.print("Enter a number (-1 to quit): "); grade = StdIn.readInt(); if ( grade!= -1 ) { sum = sum + grade; // detect the last post System.out.println("The total was " + sum); Duplicated code Duplicate execution Sentinel Loop with break Summary: Solutions Scanner console = new Scanner(System.in); while (true) { System.out.print("Enter a number (-1 to quit): "); int grade = StdIn.readInt(); if (grade == -1) { break; sum = sum + grade; // detect the last post // grade!= -1 here System.out.println("The total was " + sum); int grade = 0; while ( true ) { System.out.print("Enter a number (-1 to quit): "); grade = StdIn.readInt(); if ( grade == -1 ) { break; sum = sum + grade; // detect the last post System.out.print("Enter a number (-1 to quit): "); int grade = console.nextint(); while ( grade!= -1 ) { sum = sum + grade; System.out.print("Enter a number (-1 to quit): "); grade = StdIn.readInt(); 12

Comments q Choice between sentinel loop with break vs non-break is typically a personal choice q For many programmers, the non-break version is preferred, because the high-level structure ( topical sentence ) indicates that the loop is controlled by a sentinel the high-level structure ( topical sentence ) of the break version indicates that the loop is an infinite loop. Summary: for Loop q for loop is easy to read, since it provides visual aid to recognize the four components if the initialization, increment, or condition too complicated, a for loop may not read as well as a while or do/while loop typically used in sequential iteration for ( initialization ; condition ; increment ) { statement list; Summary: while, do/while Loop q The choice between do /while and while depends on the logic of the program: first check condition or first execute statement while ( condition ) { statement list; do { statement list; while ( condition ); 13