Welcome to Lesson 10!By the end of today's class, you should know...
final double PI = 3.1415926535;
System.out.println("The area of the triangle is: " + (.5 * 7 * 8));
2. Introducing Loops
Simple Loops
3. While Loops
initialization statement;
String repeat = "y"; System.out.print("Do you want to play again? (y/n): "); repeat = input.next();
Image source. Understanding the |
1
2
3
4
5
6
7
8
9
10
11
12
| public static void main(String[] args) |
- 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...10987654321We 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.
- 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.
- 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 awhile
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("\nThanks for playing!");
}
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("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"))
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("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")) ;
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!");
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")){
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("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
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");
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 loopWe 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");
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);
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.
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"
+ "Enter your guess: ");
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?
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
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);
}