Welcome to Lesson 14!


Learning Objectives
By the end of today's class, you should know...

  • What is a nested loop?
  • How do you trace the output of a nested loop?
  • What is a do-while loop?
  • What is the syntax of a do-while loop?
  • When do you use a do-while loop instead of a while loop?

Announcements

  • Quiz 4 after the break
  • Last day to drop with a W is this Friday
    • You can check your current grade on Canvas
    • Please see me with questions
Review Questions
Find a partner and answer the following questions:
  • What is the problem with the following loop?
String repeat = "Yes";
while (repeat.equalsIgnoreCase("Yes")){
System.out.println("I love Java!");
}
  • How can you fix it?
  • Change the following for loop into the equivalent while loop:
for (int i = 10; i < 20; i++)
{
    System.out.println("*");
}

  • What will be the output of the following code:
for (int i = 0; i <= 5; i++){
        if (i % 2 == 0)
            System.out.print("$");
        else
            System.out.print("!");
    }

Nested Loops

About Nested Loops
  • Some looping applications have loops nested within other loops
  • For example, you may use a nested loop to print a table of values
  • The following example shows a simple table created with nested loops
  • Let's follow the execution sequence before checking the result


Example of Nested Loops

1
2
3
4
5
6
7


for (int outer = 1; outer < 4; outer++)
{
    for (int inner = 1; inner < 4; inner++)
    {
            System.out.println(outer + " " + inner);
    }
}

Tracing the Variables

  • To understand a looping application, you need to trace the loop by hand
  • To trace the loop, write the variables used in the loop as headings across a page
  • On the first line under the headings, write the initial values
  • Execute the loop 3-5 times and record the values of the variables each time through the loop
  • Pay especial attention when entering the loop the first time and when ending the loop
  • You can slightly modify the computations if it helps to test the loop
  • Below is an annotated trace of the variables for the inner and outer loops
  • Note that the outer loop changes only after the inner loop is finished
Memory Screen 
 outer  inner  
  1  11 1
   21 2
   31 3
   4 (end of loop)   
  2  12 1
   22 2
   32 3
   4 (end of loop)   
  3  13 1
   23 2
   33 3
   4 (end of loop)   
  4 (end of loop)     
  • By analogy, nested loops are like an odometer on a car
  • The inner loop is like the digit to the right on an odometer
  • The numbers to the right loop completely before the number to the left increments by one

Nested Loop Example: Drawing Squares
  • Another example of a nested loop is to draw a square using stars ("*")
  • Remember our bar graph example with the for loop?
  • Copy and paste the following code into your Netbeans Loopy program, compile and run it.
    package loopy;

    /**
    *
    * @author Jennifer Parrish
    */
    import java.util.Scanner;

    public class Loopy {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {

    int size = 0;
    Scanner input = new Scanner(System.in);

    System.out.print("Enter a number and I will show its"
    + " bar graph.\nEnter your number: ");
    size = input.nextInt();
    System.out.println();

    for (int row = 1; row <= size; row++)
    {
    System.out.print("*");
    }
    System.out.println();

    }

    }

  • Now, let's alter the program to contain a nested for loop.
  • We will place another for loop inside the first one.
  • The nested loop makes the bar graph print in 2D.
  • The code for drawing a square consists of two loops, one nested inside the other:
    for (int row = 1; row <= size; row++)
    {
        for (int col = 1; col <= size; col++)
        {
            System.out.print("*");
        }
        System.out.println();
    }
    
  • The code is easier to read from the inside out
  • The inner loop draws a line of characters across the screen from left to right
  • At the end of the inner loop we print a newline to end the line of characters
  • The outer loop controls the number of lines to draw
  • Note how the inner loop is indented to make the structure clear
  • The inner loop is controlled by the outer loop, which is why it is indented
  • The inner loop in turn controls other statements, which ends up indenting yet again
  • Whenever you type an opening brace ({) you should indent the next character
  • Whenever you type a closing brace (}) you should remove the indentation (outdent)

Example Program to Draw Squares

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

package loopy;

/**
*
* @author Jennifer Parrish
*/
import java.util.Scanner;

public class Loopy {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

int size = 0;
Scanner input = new Scanner(System.in);

System.out.print("Enter a number and I will print a square."
+ "\nEnter your number: ");
size = input.nextInt();
System.out.println();

for (int row = 1; row <= size; row++)
{
for (int col = 1; col <= size; col++)
{
System.out.print("*");
}
            
System.out.println();
         }
}

}
  • We can make the square hollow by using an if statement inside the inner loop to decide when to print characters
  • Develop test conditions that allow the characters to print only at the start and end of the columns and rows
  • Use an else clause to print spaces when not printing characters
  • Another example of a nested loop is to draw a triangle, which we explore in the next exercise

Activity 14.1: Tracing a Nested Loop (10 pts)

In this exercise we explore how nested loops work by tracing the execution of a loop in a program. Part of the trace will involve use of the Boolean "or" (||) operator we discussed last class.

Specifications

  • Find a partner.
  • Take out a piece of paper, put your name on it and draw a grid like this:

rowcol#12345
11 21*    
21 2 32**   
  3     
  4     
  5     
  • Leave extra room for the col column as shown. The right hand area is for drawing the shape where the row and column headings match the row and col variables of the program.
  • For the code snippet listed below, trace the loop variables and write the values of the loop variables on the paper as your trace progresses for 5 rows. In addition, draw on your paper the shape printed by the nested loops in the program. Do NOT run the program.
  • You can see the trace for the first few entries in the grid above. As you trace the program, cross out the col entries as you update them, as shown. However, make each row change start on a new row so that the graph on the right lines up with the row entries.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

for (int row = 1; row <= 5; row++)
{
    for (int col = 1; col <= row; col++)
    {
        if (col == 1 || row == col || row == 5)
        {
            System.out.print("*");
        }
        else
        {
            System.out.print(".");
        }
    }
    System.out.println();
}
  • Draw the output into the text box under the activity on Canvas.
  • The instructor will trace it on the board when everyone is finished.


Do-While Loops

  • Sometimes we want to execute the body of a loop at least once and perform the loop test after the body was execute
  • In this case, we can use a do-while loop (a.k.a. do loop).
  • The structure of a do-while loop looks like this
    do {
       //statements
    } while (test); // loop test
    
  • Where:
    • statements: the statements to execute the first time and repeatedly while the test remains true
    • test: the test condition to evaluate
  • The loop test is placed after the body and executes at the end of the loop
  • The statements in the body of the loop always execute at least once

Flowchart of do-while loop:

Flowchart of working of do...while loop in C programming.

Image source.

  • One common use of a do-while loop is to validate user input
  • The following code shows an example where we force the user to enter a positive value

Example do-while Loop Used to Validate Input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package loopy;

/**
*
* @author Jennifer Parrish
*/
import java.util.Scanner;

public class Loopy {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
double value;
Scanner input = new Scanner(System.in);
do {
System.out.print("Enter a positive number: ");
value = input.nextDouble();
} while (value <= 0.0); // test condition at end
System.out.println("You entered: " + value);
}
}

When to Use do-while Statements

  • Use the do-while loop when you want to force a minimum of one iteration
  • Note that you can accomplish the same control flow with a while loop
  • However, in some cases we can save a statement by using a do-while loop

Group Activity
With a partner, answer the following questions:
  • How is the syntax of a do-while loop different from a while loop?
  • When would you use choose a do-while loop over a while loop?
  • Change the following while loop into a do-while loop:
int score, sum = 0;
System.out.print("Enter a score or 0 to quit: ");

score = input.nextInt();

while (score != 0)
{
    sum + = score;
    System.out.print("Enter a score or 0 to quit: ");

    score = input.nextInt();
}
System.out.println("The sum is: " + sum);
   


Wrap Up

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

Upcoming Assignments