## Review Questions

Find a partner and answer the following questions:
• Change the following for loop into the equivalent while loop:

for (int i = 10; i < 20; i++)
{
cout << "*";
}
• What will the following for loop print to the console window?

for (int i = 0; i < 10; i++)
{

if (i % 3 == 0)

cout << "*";

else

cout << "!";

}

## Nested Loops

• Some applications require loops within loops, called "nested" 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 8 9 10 11 12 13 ``` ```#include using namespace std; int main() { for (int outer = 1; outer < 4; outer++) { for (int inner = 1; inner < 4; inner++) { cout << outer << " " << inner << endl; } } } ```

#### Tracing the Variables

• To understand any 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 special 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 variable outer changes only after the inner loop is finished
Memory Screen
` outer `` inner `
`  1``  1``1 1`
`  2``1 2`
`  3``1 3`
`  4` (end of loop)
`  2``  1``2 1`
`  2``2 2`
`  3``2 3`
`  4` (end of loop)
`  3``  1``3 1`
`  2``3 2`
`  3``3 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?

#include <iostream>
using namespace std;

int main() {
int size = 0;
cout << "Enter a number and I will show its"
<< " bar graph.\nEnter your number: ";

cin >> size;

cout << "\nBar graph:\n";

for (int row = 1; row <= size; row++) {
cout << '*';
}
cout << endl;

return 0;
}
• 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++) {         cout << "*";     }     cout << endl;  }
```
• 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 are indented yet again
• Formatting note:
• 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 ``` ```#include using namespace std; int main() { cout << "I will print squares for you!\n\n"; cout << "Enter the width of the square: "; int size; cin >> size; for (int row = 1; row <= size; row++) { for (int col = 1; col <= size; col++) { cout << "*"; } cout << endl; } return 0; } ```
• 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!

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 15 ``` ```for (int row = 1; row <= 5; row++) { for (int col = 1; col <= row; col++) { if (col == 1 || row == col || row == 5) { cout << "*"; } else { cout << "."; } } cout << endl; } ```
• When you are finished tracing it on paper, draw your trace into the box provided on Canvas.
• Do not show your paper to any other students and do not run the code until all students have completed the hand tracing.
• The instructor will trace it on the board when everyone is finished.