Welcome to Lesson 12!

Learning Objectives
By the end of today's class, you should know...
  • What is a loop?
  • How do you write a while loop?
  • What are the three main components of a while loop?
  • How does a while loop differ from an if statement?
  • What are 4 common uses of while loops?
    • Give an example of each one.
  • What are some other common mistakes people make when writing loops?

Announcements

  • Don't forget Lab 6 due Friday!
  • Quiz 4 after the break!


Review Activity

  • Imagine that a local radio station is holding a contest to give away a year's supply of free pet food to one lucky winner.
  • To win the contest, you must meet the following criteria:
    • You must be caller 19
    • The pet your own must be one of the following: dog, cat, rabbit
    • You must be between the ages of 18 and 65.
  • Which of the following test conditions will correctly determine the winner of the contest
a. if (numCaller == 19 && (pet == "rabbit" || pet == "cat" || pet == "dog") && (age >= 18 && age <= 65))
System.out.println("You are the winner!");

b. if (numCaller == 19 && (pet == "rabbit" || "cat" || "dog") && (age >= 18 && <= 65))
      System.out.println("You are the winner!");

c. 
if (numCaller == 19 || (pet.equals("rabbit") && pet.equals("cat") && pet.equals("dog")) || (age >= 18 && age <= 65))
      System.out.println("You are the winner!");


d. 
if (numCaller == 19 && (pet.equals("rabbit") || pet.equals("cat") || pet.equals("dog")) && (age >= 18 && age <= 65))
      System.out.println("You are the winner!");

e. 
if (numCaller = 19 && (pet.equals("rabbit") || pet.equals("cat") || pet.equals("dog") && (age >= 18) || age <= 65))
   
System.out.println("You are the winner!");
  • What will the following print to the console?

int age = 20;

boolean is_student = true;

if (is_student || age > 21) {

    System.out.println("Fi!");

}

if (!is_student && age < 21) {

    System.out.println("Fo!");

}

if (is_student && age < 21) {

    System.out.println("Fum!");

}


  • Rewrite the following series of if statements as a switch statement:

if (choice.equals("Ice Cream")) {

    System.out.println("Good choice!");

} else if (choice.equals("Cake")) {

    System.out.println("Okay choice!");

} else {

    System.out.println("What kind of a dessert is that?");

}


Introducing Loops

  • In your daily life, there are many actions that you repeat until some condition is met.
  • For example: 
    • You might run on the treadmill at the gym until 30 minutes are up.
    • You might wash dishes until the pile of dirty dishes is gone.
    • You might take classes every quarter until you receive your degree.
    • Can you think of any others?
  • When we write code, often times we find ourselves repeating statements.
  • Loops allow us to carry out repetitive steps in our code without having to re-write the same statements over and over.
  • These loops will run until some test condition is met, just like the examples above.
  • You wrote your first loops when you did your Hour of Code lab assignment.
    • When did you need loops in this assignment?

Simple Loops

  • loop is a block of code that can execute repeatedly
  • Whether or not a program repeats a block of code is determined by a test condition
  • The test condition is checked each time the loop executes
  • In general, loops have three components:
    • Initialization code
    • Test condition -- evaluated during the loop
    • Loop body with some way to change the test condition
  • There are three loop statements in Java:
    • for
    • while
    • do...while
  • We will start with the simplest of the three -- the while statement

While Loops

  • The simplest looping structure is the while statement
  • A while statement has a test condition and a body, like an if statement
  • Before each execution of the loop body, the while statement checks the test condition
  • If the test condition evaluates to true, then our program executes the body of the loop
  • When the program reaches the end of the loop body, it automatically returns to the while statement
  • Here is the syntax of a while loop:
initialization statement;

while (test)
{   

    statements to repeat

}
  • For example:
String repeat = "y";
while (repeat.equals("y")) {
System.out.print("Do you want to play again? (y/n): ");
repeat = input.next();
}
  • What does the while loop syntax remind you of?
  • The following flow chart shows how the while loop operates

Diagram of while Loop Operation

C++ while loop
Image source.

  • Let's look at an example.

Understanding the while Loop

  • The following looping application simulates the play of an exciting game
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Scanner;

public static void main(String[] args)
{ Scanner input = new Scanner(System.in);
    String repeat = "y"; while (repeat.equals("y"))
{ System.out.println("\nPlaying an exciting game!"); System.out.println("Do you want to play again? (y/n) "); repeat = input.next(); } System.out.println("\nThanks for playing!"); }
  • Notice the structure of the code for the looping application
  • First was the statement to correctly initialize the looping condition:
    String repeat = "y";
  • Then came the while statement with the test condition
    while (repeat.equals("y"))
  • The loop executes the body of the loop if and only if the condition evaluates to true
  • Another important part of the loop is the statement: 
repeat = input.next();
  • Most loops have these parts:
    • Initialization code
    • Loop test condition
    • Loop body with some way to change the test condition
  • Question: What would happen if I replaced the while loop with an if statement?
  • We will explore the while loop more in the next exercise.

Group Activity: Candy Crush Loop

  • As a class, we are going to act out the following while loop:
While Loop :
int num_pieces_candy = 12;
instructor.fill_with_candy(Box, num_pieces_candy);
instructor.hand_box(first_student);
while (num_pieces_candy > 0)
{
    student.takeOnePieceCandy();
    student.passBox(next_student);
    num_pieces_candy--;

}
  • With your partner, discuss for the while loop above: 
    • What is/are the initialization statement(s)?
    • What is the loop test condition?
    • What are the statements that repeat?
    • Which statement will ultimately cause the test condition to fail?
  • Now, let's act out the While Loop!

Activity 12.1: Counting Down...
  • Grab a partner for pair programming.
  • Open up Eclipse and create a new Java project named Countdown.
  • Imagine we are at NASA Mission Control.
  • A new space ship is about to be launched.
  • Let's write a program that counts down until take off. See the sample output below:
NASA Mission Control readying for liftoff.
Initializing countdown from 10...
10
9
8
7
6
5
4
3
2
1
We have liftoff!
  • We are going to write this program in two ways.


Part 1: Repetition, Repetition, Repetition (10 pts)
  • The first program should use 13 System.out statements to achieve the above output.
  • Add your names and section in the block comments.
  • Declare an integer variable called countdown at the top of main and set it equal to 10.
  • Now, write a System.out statement to output the following:
NASA Mission Control readying for liftoff.
  • Add another System.out statement to print the following to the console:
Initializing countdown from 10...
  • Next, in a pair of statements, lets print the contents of countdown and then decrease its value by 1.
  • Add the following two statements to your code:
System.out.println(countdown);
countdown--;
  • You will need to repeat these two lines of code 10 times in your program.
  • Copy the two lines and then paste them into your program 9 more times.
  • You should have a very repetitive program by now!
  • Finally, add a System.out statement to print out "We have liftoff!" below the numbers.
  • Run your code to make sure that your output is identical to my output above.
  • When you are finished and the program is working properly, upload it to Canvas.

Part 2: Using a While Loop (10 pts)
  • Let's alter the above program to be written more efficiently with a loop.
  • First, take a look at your code.
  • Which part of the code is repetitive?
  • Hint: The repetitive lines will go inside the while loop.
  • We need a while loop to count down from the number entered by the user. Create a while loop that looks like this:
while (test will go here) {
    //statements
}
  • What should go inside the test?
countdown > 0
  • Why do you use > 0 here?
  • Inside the curly braces of the while loop, we need to print out the contents of the countdown variable and then decrease its value by 1.
  • Take one of your pairs of System.out statement and variable decrement and place it in the curly braces of the while loop.
  • Now, you can erase the other 9 pairs of statements.
  • Finally, below your while loop, there should now be only one System.out statement
  • Run your program to make sure it is working the same as before.
  • When you are finished, upload this new version to Canvas.

About those Curly Braces

  • Like the if-statement, the curly braces of a while loop are optional
  • Technically, the while statement affects only the single statement that follows
  • We use curly braces to make that one statement into a block of statements
  • This allows us to put any number of statements within the body
  • Curly braces are not always required, but the best practice is to always include them

Program Style: Indent Statements Inside a Loop

  • It is important to format the loop code correctly:
    String repeat = "y";
    while (repeat.equals("y")) {
        // ... statements to repeat
        repeat = input.next();
    }
Also Accepted Style:
        String repeat = "y";
    while (repeat.equals("y"))
    {
        // ... statements to repeat
        repeat = input.next();
    }
  • Note how the repeated code is indented inside the loop
  • This lets us see easily which code is repeated and which is not
  • Also note the placement of curly braces
  • Different groups have different practices for placing curly braces in a loop statement




Applications of Loops
  • Let's look at 4 common loop applications:

1. Indefinite Loops

Recall our looping application that simulated the play of an exciting game


    public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String repeat = "y";
while (repeat.equals("y"))
{
System.out.println("\nPlaying an exciting game!");
System.out.println("Do you want to play again? (y/n) ");
repeat = input.next();
}
System.out.println("\nThanks for playing!");
}
  • Loops of this type are called indefinite loops because you do not know in advance how many time the loop will execute
  • This behavior is different from a counting loop where you know how many times the loop will execute before the loop starts
  • With an indefinite loop we can solve a new set of problems
  • Most problems solved with indefinite loops make use of while statements


2. Processing a Sequence of Inputs
  • Another common use for indefinite loops is to process a sequence of inputs
  • As an example, let us add up (sum) a series of numbers
  • Every number is added to the sum
  • We use a loop to repeat the input until the user decides to stop
  • Since we do not know how many number the user will enter, we use an indefinite loop as shown below


public static void main(String[] args) {
    double number = 1;
    double sum = 0;
    String repeat = "y";
    Scanner input = new Scanner(System.in);

    System.out.println("I will add up numbers for you\n"); while (repeat.equals("y")) { System.out.println("So far, sum = " + sum); System.out.print("Enter a number: "); number = input.nextDouble(); sum = sum + number; System.out.print("Another number? (y/n) "); repeat = input.next(); } System.out.println("Ending sum: " + sum); }

3. Terminating the Input with a Sentinel

  • Whenever we read a sequence of input values, we need to have some way of terminating the input loop
  • We could use a separate variable and input statement as we have done before:
    String repeat = "y";
    while (repeat.equals("y")) {
        // ... statements to repeat
        repeat = input.next();
    }
    
  • However, when entering numbers (or other data) repeatedly, answering an extra question each time through the loop becomes annoying
  • One way to avoid asking an extra question is to use a sentinel value
  • sentinel is guard who watches for something to happen
  • Similarly, a sentinel in a program watches for a specific sentinel value that signals termination of a loop
  • To use a sentinel value, we must have a special value in the input
  • Some commonly used sentinel values for numeric input are 0 or -1
  • However, if our application suggests another value, then we should use that value
  • The following program is an update of the previous program to use a sentinel value to end the loop

Example Application Using a Sentinel Value for the Loop Test

public static void main(String[] args) {
    double number = 1;
    double sum = 0;
    Scanner input = new Scanner(System.in);    

    System.out.println("I will add up numbers for you\n"); while (number != 0) { System.out.println("So far, sum = " + sum); System.out.print("Enter a number or 0 to exit: "); number = input.nextDouble(); sum = sum + number; } System.out.println("\nEnding sum: " + sum); }

4. Input Validation

  • Another common use for indefinite loops is input validation
  • Input validation combines a loop with one or more if statements
  • The input statement is placed inside the loop
  • The if-statement tests for an incorrect input value
  • The loop repeats while the user's input contains an error
  • Since we do not know how many times the loop must execute ahead of time, the loop is indefinite
  • For example, the following program uses a loop to ensure a user enters a positive number
  • The if statement is used to decide when to output an error message

Example of Input Validation Using a Loop


public static void main(String[] args) {
    double number = 0.0; // initialize value
    Scanner input = new Scanner(System.in);    

    while (number <= 0) { System.out.print("Enter a positive number: "); number = input.nextDouble(); if (number <= 0.0) { System.out.println("You must enter a positive number\n"); } } System.out.println("\nYou entered: " + number); }
  • We will explore all of these applications in our programs as we continue to write loops.

Activity 12.2: Guessing Game The Final Round (10 pts)

  • Copy the following program into an Eclipse project named Loopy and then compile and run the starter program to make sure you copied it correctly.
    import java.util.Scanner;
    
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("I'm thinking of a number between"
             + " 1 and 10.\nCan you guess it?\n\n"
             + "Enter your guess: ");
        int guess = input.nextInt();
        
        if (7 == guess)
        {
            System.out.println("*** Correct! ***\n");
        }
        else
        {
            System.out.println("Sorry, that is not correct.");
            System.out.println("Try again.");
        }
        
    }
    
  • Add the following code after the statement where int guess; is declared:
    String repeat = "y";
    

    This is the initialization code that we will use for the test condition that comes next.

  • We want to repeat all the rest of the code in our program. For this we need to add a while statement such as:
    while (repeat.equalsIgnoreCase("y")) {
        // Place the rest of the code after the initialization
        // and before the end of main between these curly braces.
    }
    

    Statements inside the curly braces repeat while the test condition in the parenthesis, (repeat.equalsIgnoreCase("y")), evaluates to true. 

  • Inside the while loop we need some way to change the test condition. We change the test condition by letting the user enter a value for the repeat variable by adding the following code at the end of the loop just before the closing curly brace:
    System.out.print("\nDo you want to play again? (y/n) ");
    repeat = input.next();
    

    Without these two statements our loop would have no way to exit. A loop with no way to exit is known as an infinite loop

  • Formatting a loop is important. Indent all the code within the curly braces of the while loop. 
  • As a final part of our program, we add the infamous phrase: "Game Over". Add the following statement after the closing curly brace of the while loop:
    System.out.println("Game over");
    
  • Compile and run your program again and verify the output looks like:
    I'm thinking of a number between 1 and 10.
    Can you guess it?
    
    Enter your guess: 3
    Sorry, that is not correct.
    Try again.
    
    Do you want to play again? (y/n) y
    I'm thinking of a number between 1 and 10.
    Can you guess it?
    
    Enter your guess: 7
    *** Correct! ***
    
    Do you want to play again? (y/n) n
    Game over
    
  • Submit your program source code to Catalyst.
  • If you finish early, find someone to help! Remember, you learn by teaching others.

Completed Program

When finished, your application should look like the following. Note especially the extra indentation within the curly braces of the while loop.



Common Loop Pitfalls

  • Loops have many pitfalls for the unwary
  • The following are the most common problems you should look out for

Infinite Loops

  • Common error: unintentional infinite loop
  • For example, what is wrong with the following code?
1
2
3
4
5
6
7
8
9
10
11
12

    public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String repeat = "y";
while (repeat.equals("y"))
{
System.out.println("\nPlaying an exciting game!");
System.out.println("Do you want to play again? (y/n) ");

}
System.out.println("\nThanks for playing!");
}

Missing Curly Braces

  • The curly braces of a while loop let us associate multiple statements with a while loop
  • However, if we leave off the curly braces, only the first line of code after the while statement is interpreted to be part of the loop.
  • For example, what is wrong with the following code?
1
2
3
4
5
6
7
8
9
10
11
12
13

public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String repeat = "y";
while (repeat.equals("y"))

System.out.println("\nPlaying an exciting game!");
System.out.println("Do you want to play again? (y/n) ");
repeat = input.next();

System.out.println("\nThanks for playing!");
}


Empty Statements

  • Remember that statements are terminated by a semicolon
  • Is the following a legal statement?
    ;
  • This is known as an empty or null statement
  • Empty statements are a common source of infinite loops
  • For example, what is wrong with the following code?


public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String repeat = "y";
while (repeat.equals("y")) ;
System.out.println("\nPlaying an exciting game!");
System.out.println("Do you want to play again? (y/n) ");
repeat = input.next();

System.out.println("\nThanks for playing!");
}
}


Wrap Up
  • With your partner, answer the questions from today's learning objectives


Upcoming Assignments


~Have a Great Weekend!~