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
- 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:
- To repeat a task a specified number of times, where the task performed is not dependent on the counter.
- For example, making a bar graph (below).
- To repeat a task a specified number of times, where the task performed is dependent on the value of the counter.
- 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 Chart1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| #include <iostream>
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
Example Application to Sum a Sequence of Numbers1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include <iostream>
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

Image source.
- 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 VariablesActivity 13.2: ASCII (10 pts)
In this exercise we continue exploring some uses of counter-controlled loops. BackgroundRecall 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++) {
}
Nested LoopsAbout 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 Loops1
2
3
4
5
6
7
8
9
10
11
12
13
| #include <iostream>
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;
}
- 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 Squares1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include <iostream>
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:
row | col | # | 1 | 2 | 3 | 4 | 5 |
---|
1 | 1 2 | 1 | * | | | | | 2 | 1 2 3 | 2 | * | * | | | | | | 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 - With your partner, answer the questions from today's learning objectives. Additionally:
- How many times will the following loop execute?
for (int i = 1; i < 5; i++){
cout << i << endl;
}
for (int i = 1; i <= 5; i++){
cout << i << endl;
}
- Alter the nested loop below so that it will print rectangles instead of squares:
#include <iostream>
using namespace std;
int main() {
cout << "I will print rectangles for you!\n\n";
cout << "Enter the width of the rectangle: ";
int width;
cin >> width;
cout << "Enter the length of the triangle: ";
int length;
cin >> length;
for (int row = 1; row <= ???; row++)
{
for (int col = 1; col <= ???; col++)
{
cout << "*";
}
cout << endl;
}
return 0;
}
- Assignment 13 due Thursday at 3:20pm on Catalyst
- Quiz 5 on Thursday.
- No lab this week!
|