## Welcome to Lesson 13!

Learning Objectives
By the end of today's lesson, you should be able to answer the following questions...
• Name 2 common applications of for loops.
• What is an off-by-one error?
• How can you determine how many times a for loop will execute?
• What is a one good way to "debug" a loop if your output is not as expected?
• What is a nested loop?
• What is an application of a nested loop?

Announcements

• Quiz 5 on Thursday
• Return Quiz 4
• Reminder: Friday is the Veteran's Day holiday. No lab on Friday!

## Review Questions

Find a partner and answer the following questions:
• What are two problems with the following loop? What will happen if you run the code as it is now?

int numCats = 1;
while (numCats <= 10);{
cout << "Meow!";
}

• Fix the above loop so that it prints out "Meow" 10 times to the console.
• Change the following for loop into the equivalent while loop:

for (int i = 10; i < 20; i++)
{
cout << "*";
}

For Loops Continued

Applications of For Loops

• We can use for loops in two ways:
1. To repeat a task a specified number of times, where the task performed is not dependent on the counter.
1. For example, making a bar graph (below).
2. To repeat a task a specified number of times, where the task performed is dependent on the value of the counter.
1. For example, summing a sequence of numbers (below).

Making Bar Graphs
• We can use a counting loop to make a horizontal bar graph
• Instead of displaying a number, we will display a series of "*" characters for the "bar"
• Thus, all we need to change is the print statement:
```cout << i << endl;
```
to become:
`cout << '*';`
• We can see this change in the following example:

#### Example C++ Application That Displays a Bar Chart

 ```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ``` ```#include using namespace std; int main() { int number = 0; cout << "Enter a number and I will show its" << " bar graph.\nEnter your number: "; cin >> number; cout << "\nBar graph:\n"; for (int i = 0; i < number; i++) { cout << '*'; } cout << endl; return 0; } ```

### Summing Numbers

• One common looping task is to input a list of numbers and calculate their sum
• For example, if we want to add the sum of the first four integers:
`sum = 1 + 2 + 3 + 4 = 10`
• As another example, we can add a list of 5 numbers:
`sum = 1 + 2 + 3 + 4 + 5 = 15`
• We can generalize our examples to sum from 0 to any number n.

#### Example Application to Sum a Sequence of Numbers

 ```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ``` ```#include using namespace std; int main() { cout << "Enter the number to sum to: "; int number = 0; cin >> number; int sum = 0; for (int i = 1; i <= number; i++) { sum = sum + i; //using the counter as a value to add to my sum } cout << "Total sum = " << sum << endl; return 0; } ```

#### Activity 13.1: Tracing a Loop (10 pts)

In this exercise, we will trace the execution of the following for loop.

for (int i = 10; i <= 15; i++)
{
if (i == 11 || i == 13 || i== 15)
cout << "*";
else
cout << "!";
}

• Find a partner. Then, open up a text editor (Not CodeBlocks) and create a new document called tracing.doc or tracing.txt.
• In the text editor write both your names at the top of the program.
• Then, type what the output of the above for loop would be to the console.
• Note, you should do this without running the code.
• Then, change the statement i <=15 to be i < 15.
• Draw the output of the for loop with this alteration.
• How is it different?
• The instructor will be going over the examples so you can verify your answers and understanding.
• Don't forget to upload your text document before the end of class.

More Loopy Errors

• A common problem with counting loops is the off-by-one error
• Finding the correct upper and lower bounds can be confusing
• Should you start at 0 or 1?
• Are you counting up to a number (<), or up to and including a number (<=)?
• To understand the counting loop you need to count iterations.
• For instance, the following loop executes b - a times:
`for (int i = a; i < b; i++)`
• However, the following loop is executed b - a + 1 times:
`for (int i = a; i <= b; i++)`
• The "+1" is the source of many errors
• For example, to sum the numbers from 1 to 5, what is wrong with:
```#include <iostream>
using namespace std;

int main()
{
int sum = 0;
for (int count = 0; count < 5; count++)
{
sum += count;
}
cout << sum << endl;

return 0;
}
```
• One way to visualize the "+1" error is by looking at a fence • How many posts do you need for a fence with three sections?
• It is easy to be "off-by-one" with problems like this
• Forgetting to count the last value is sometimes called a fence-post error

#### Debugging Technique: Tracing Variables

• One good way to discover loopy errors is to display the variables that are part of the loop
• Tracing variables means watching their values change as the program executes
• You can insert temporary output statements in your program to watch the variables, like:
`cout << "count=" << count << ", sum=" << sum << endl;`

### Activity 13.2: ASCII (10 pts)

In this exercise we continue exploring some uses of counter-controlled loops.

#### Background

Recall that a `char` data type is stored by the computer as a number using the ASCII code (ASCII Table). Since a `char` is stored as an `int` by the computer, C++ lets you cast an `int` to a `char`.

```int count = 65;
cout << (char) count << endl; //What does the (char) do?
```

This casting feature lets us construct our own ASCII table.

#### Specifications

• Find a partner for pair programming.
• Copy and paste the starter code into a file called ascii.cpp

int main() {
cout << "Displaying the characters from 32 to 127:\n\n";
for (int i = ????; i <=????; i++) {
cout << i << endl;
}
}
• Alter the `for`-loop so that it counts from 32 to 127
• Inside the for-loop, alter the cout statement as follows:
``` ```
• Compile and run your modified program and make sure your output looks like:
```(some output not shown)
65      A
66      B
67      C
(more output not shown)
```
• When you are finished, play around with the starting and ending values of your for loop.
• Can you find the ASCII value for any unusual characters, such as the 4 ranks of playing cards, smiley faces and musical notes.
• It turns out that each of these symbols has its own ASCII value in C++!
• Submit the final version of your file to Catalyst when you are finished.

## 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 13.3: 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, hand it to the instructor.
• 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.

Wrap Up