## Learning Objectives

By the end of today's class, you should know...
• What is a loop?
• What are the 3 parts of any loop?
• How do you structure a while loop?
• What are 4 common uses of while loops?
• What are some other common mistakes people make when writing loops?

## 1. Lesson 9 Practice Exam Questions

• Write one statement to print out the value of the following variable to exactly 5 decimal places:
final double PI = 3.1415926535;
• The below code contains some magic numbers. Fix the problem without changing the outcome of the program:
System.out.println("The area of the triangle is: " + (.5 * 7 * 8));
• Write the equivalent of the below statement in 3 ways
x = x + 1;

## 2. 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

## 3. 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

Image source.

### 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 ``` ```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.print("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.

### Activity 10.1: Counting Down... (20pts Total)

• Open up Eclipse and create a new Java project named Countdown inside of a project folder named Activity10
• 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 name and section in a block comment at the start of the program.
• 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.
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.

• 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

## 3. 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?

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?
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!");
}
}

## 4. Applications of While Loops

• Let's look at 4 common loop applications:

### Indefinite Loops

• An indefinite loop is one where you don't know when the loop will end.
• The loop will end (unlike an infinite loop), but you, the programmer, cannot predict exactly how many times it will run (unlike a counting loop)
• Instead, it is usually up to the user to decide when to end the loop by pressing a particular key
• Recall the example 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

### 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
image source

#### Program Processing a Sequence of Numerical Inputs

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);
}

### 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
• A 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);
}

### 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 10.2: Guessing Game The Final Round (10 pts)

• Copy the following program into a class named Loopy and then compile and run the starter program to make sure you copied it correctly.

import java.util.Scanner;
public class Loopy {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int guess = 0;
System.out.print("I'm thinking of a number between"
+ " 1 and 10.\nCan you guess it?\n\n"
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 code after the initialization statements
// 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?

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?

*** Correct! ***
Do you want to play again? (y/n) n
Game over

• Submit your program source code to Canvas.

#### Completed Program

• When finished, your application should look like the following.
• Note especially the extra indentation within the curly braces of the while loop and the if-else statements.

### Wrap Up

• Label the different parts of the following while loop as: update statement, initialization or test condition.

int count = 1;

while (count <= 10) {

System.out.println(count);

count++;

}
• Fill in the missing parts of the below loop to display the numbers from 1 to 5 to the console
int count = _________;

while (___________________________) {
count++;
System.out.println(count);
}
• What is the difference between an infinite loop and an indefinite loop

• Correct the loops below. What will happen if you run the code BEFORE making the correction?

Loop 1:

String repeat = "y";

while (repeat.equals("y")) {

System.out.println("Playing an exciting game!\n");

System.out.println("Want to play again? (y/n): ");

}

Loop 2:

int counter = 1;

while (counter <= 10) {

System.out.println(counter);

}

Upcoming Assignments
• Activities 10.1 and 10.2 due Thursday at 11:59pm
• Assignment 9 due Friday at 11:59pm
• Quiz 5 due Friday at 11:59pm
• Assignment 10 due Tuesday at 11:59pm

~Have a Great Weekend!~