Welcome to Lesson 12!

Learning Objectives
By the end of today's class, you should know...
  • 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?
  • What is the proper style for indentation

Announcements

  • Don't forget Lab 6 due Friday!
  • Don't forget Quiz 5 due Friday!


Review Questions

With a partner, answer the following questions:
  • 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("Not my favorite.");

}

  • 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++;

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

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

      } 


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

inputs 1, 2, and 3

  • 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

A sentinel (guard) standing watch

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

validator to check user input

  • 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.1: Guessing Game The Final Round (10 pts)

  • Find a partner for pair programming
  • 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 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

  • Submit your program source code to Canvas.
  • 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 and the if-else statements.
final version of program&#39;s main method


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

Proper Styling

While Loops: 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

Correct Indentation

  • Now that our programs can have both loops and if statements (and if statements inside of loops!), it is time to ensure that we are using proper style.
  • Readable code is very important - and code that is styled properly is more readable.
  • Additionally, whether or not you are hired for a job in software can come down to how professionally your code is organized
  • You will be asked to show example of your work
    • If you do not know professional styling, your code may be judged harshly
  • When it comes to proper indentation, it is important to follow the model provided in class.
    • Make sure to mimic the style of the examples that I show
  • Additionally, you should understand the simple rule behind how code is indented:
The Indentation Rule: For each additional set of curly braces in which a statement is located, it should be tabbed over one extra tab
  • For example:
public class ProperIndent {
-->public static void main(String[] args) {
-->-->int count = 0;
-->-->while(count < 10 {
-->-->-->count++;
-->-->-->if (count % 2 == 0) {
-->-->-->-->System.out.println(count + " is an even number.");
-->-->-->}//end of if
-->-->-->System.out.println(count);
-->-->}//end of while
-->}//end of main
}//end of class
  • Note that the arrows --> above mean tab
  • Each tab is color coded to indicate which set of curly braces was responsible for the tab
Variable Declaration Style
  • In general, all variables should be declared at the top of main.
    • There are some exceptions to this rule - namely local variables that belong to loops or methods
    • We will worry about these exceptions later.
  • The reason that variables should all be declared at the top of main is that it makes their definitions easy to location.
    • If I am wondering about the data type of a variable, I know to look at the top of main for this information
  • For now, try to declare all variables at the top of main as demonstrated below
guessing game program where all variables declared at the top of main

Activity 12.2: Proper Style (10 pts)

  • Find a partner for pair programming.
  • Copy and paste the starter code into a text file called Style.txt
/**
 * Style.java
 * @author
 * @author
 * CIS 36A, Activity 12.2
 */

import java.util.Scanner;
public class Style {
public static void main(String[] args) {
System.out.println("I like your style!");
System.out.print("Enter your favorite brand of clothes: ");
Scanner input = new Scanner(System.in);
String brand = input.nextLine();
if(brand.equalsIgnoreCase("Givenchy")){
System.out.println("You are rolling in money!");
} else if (brand.equalsIgnoreCase("Kmart")) {
System.out.println("Interesting.");
}
else {
System.out.println("Nice choice!");
}
input.close();
}
}

  • It is your job to convert the code into a properly-styled program as discussed above
  • When you are finished, upload your work to Canvas
  • The instructor will go over the answer.

Wrap Up

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


Upcoming Assignments


~Have a Great Weekend!~