LM 005 Chp05
LM 005 Chp05
LM 005 Chp05
LESSON SET
5 Looping Statements
PROCEDURE 1. Students should read the Pre-lab Reading Assignment before coming to lab.
2. Students should complete the Pre-lab Writing Assignment before coming to lab.
3. In the lab, students should complete labs assigned to them by the instructor.
Approximate Check
completion Page when
Contents Pre-requisites time number done
Pre-lab Reading Assignment 20 min. 56
Pre-lab Writing Assignment Pre-lab reading 10 min. 64
LESSON 5A
Lab 5.1
Working with the while Loop Basic understanding 25 min. 64
of the while loop
Lab 5.2
Working with the Basic understanding 25 min. 66
do-while Loop of do-while loop
LESSON 5B
Lab 5.3
Working with the for Loop Understanding of for 15 min. 68
loops
Lab 5.4
Nested Loops Understanding of 15 min 69
nested for loops
Lab 5.5
Student Generated Code Basic understanding 30 min. 71
Assignments of loop control structures
55
LM_Chp5.qxd 4/24/03 12:36 PM Page 56
The two increment statements both execute exactly the same. So do the decre-
ment operators. What is the purpose of having postfix and prefix modes? To
answer this, consider the following code:
int age = 49;
if (age++ > 49)
cout << "Congratulations - You have made it to the half-century"
<< " mark !" << endl;
In this code, the cout statement will not execute. The reason is that in the post-
fix mode the comparison between age and 49 is made first. Then the value of
age is incremented by one. Since 49 is not greater than 49, the if conditional
is false. Things are much different if we replace the postfix operator with the pre-
fix operator:
int age = 49;
if (++age > 49)
cout << " Congratulations - You have made it to the half-century"
<< " mark !" << endl;
In this code age is incremented first. So its value is 50 when the comparison is
made. The conditional statement is true and the cout statement is executed.
If there is only one statement, then the curly braces can be omitted. When a
while loop is encountered during execution, the expression is tested to see if it
is true or false. The block of statements is repeated as long as the expression is
true. Consider the following:
int main()
{
int num = 5;
int numFac = 1;
return 0;
}
This program computes 5! = 5 * 4 * 3 * 2 * 1 and then prints the result to the screen.
Note how the while loop controls the execution. Since num = 5 when the while
loop is first encountered, the block of statements in the body of the loop is exe-
cuted at least once. In fact, the block is executed 5 times because of the decre-
ment operator which forces the value of num to decrease by one every time the
block is executed. During the fifth iteration of the loop num becomes 0, so the
next time the expression is tested num > 0 is false and the loop is exited. Then
the cout statement is executed.
What do you think will happen if we eliminated the decrement operator
num–– in the above code? The value of num is always 5. This means that the
expression num > 0 is always true! If we try to execute the modified program,
the result is an infinite loop, i.e., a block of code that will repeat forever. One
must be very cautious when using loops to ensure that the loop will termi-
nate. Here is another example where the user may have trouble with termi-
nation.
#include <iostream>
using namespace std;
int main()
{
char letter = 'a';
{
cout << "Please enter a letter" << endl;
cin >> letter;
cout << "The letter your entered is " << letter << endl;
}
return 0;
}
Note that this program requires input from the user during execution. Infinite
loops can be avoided, but it would help if the user knew that the 'x' charac-
ter terminates the execution. Without this knowledge the user could continual-
ly enter characters other than 'x' and never realize how to terminate the
program. In the lab assignments you will be asked to modify this program to make
it more user friendly.
Counters
Often a programmer needs to control the number of times a particular loop is
repeated. One common way to accomplish this is by using a counter. For exam-
ple, suppose we want to find the average of five test scores. We must first input
and add the five scores. This can be done with a counter-controlled loop as
shown in Sample Program 5.3. Notice how the variable named test works as a
counter. Also notice the use of a constant for the number of tests. This is done
so that the number of tests can easily be changed if we want a different number
of tests to be averaged.
int main()
{
int score ; // the individual score read in
float total = 0.0; // the total of the scores
float average; // the average of the scores
int test = 1; // counter that controls the loop
while (test <= NUMBEROFTESTS) // Note that test is 1 the first time
// the expression is tested
{
cout << "Enter your score on test " << test << ": " << endl;
cin >> score;
return 0;
}
Sample Program 5.3 can be made more flexible by adding an integer variable called
numScores that would allow the user to input the number of tests to be processed.
Sentinel Values
We can also control the execution of a loop by using a sentinel value which is
a special value that marks the end of a list of values. In a variation of the previ-
ous program example, if we do not know exactly how many test scores there are,
we can input scores which are added to total until the sentinel value is input.
Sample Program 5.4 revises Sample Program 5.3 to control the loop with a sen-
tinel value. The sentinel in this case is -1 since it is an invalid test score. It does
not make sense to use a sentinel between 0 and 100 since this is the range of valid
test scores. Notice that a counter is still used to keep track of the number of test
scores entered, although it does not control the loop. What happens if the first
value the user enters is a -1?
int main()
{
int score ; // the individual score read in
float total = 0.0; // the total of the scores
float average; // the average of the scores
int test = 1; // counter that controls the loop
return 0;
}
Notice that the program asks for input just before the while loop begins and
again as the last instruction in the while loop. This is done so that the while loop
can test for sentinel data. Often this is called priming the read and is frequently
implemented when sentinel data is used to end a loop.
Data Validation
One nice application of the while loop is data validation. The user can input data
(from the keyboard or a file) and then a while loop tests to see if the value(s)
is valid. The loop is skipped for all valid input but for invalid input the loop is
executed and prompts the user to enter new (valid) input. The following is an
example of data validation.
What type of invalid data does this code test for? If beverage is an integer vari-
able, what happens if the user enters the character ‘$’ or the float 2.9?
the expression is tested. The format for a single statement in the loop body is the
following:
do
statement;
while (expression);
Note that the statement must be executed once even if the expression is false. To
see the difference between these two loops consider the code
int num1 = 5;
int num2 = 7;
Here the statements num1 = num1 + 1 and num2 = num2 - 1 are never executed since
the test expression num2 < num1 is initially false. However, we get a different
result using a do-while loop:
int num1 = 5;
int num2 = 7;
do
{
num1 = num1 + 1;
num2 = num2 - 1;
} while (num2 < num1);
In this code the statements num1 = num1 + 1 and num2 = num2 - 1 are executed
exactly once. At this point num1 = 6 and num2 = 6 so the expression num2 < num1
is false. Consequently, the program exits the loop and moves to the next section
of code. Also note that since we need a block of statements in the loop body, curly
braces must be placed around the statements. In Lab 5.2 you will see how do-
while loops can be useful for programs that involve a repeating menu.
Notice that there are three expressions inside the parentheses of the for statement,
separated by semicolons.
int main()
{
int value;
int total = 0;
int number;
float mean;
if (value > 0)
{
for (number = 1; number <= value; number++)
{
total = total + number;
} // curly braces are optional since
// there is only one statement
cout << "The mean average of the first " << value
<< " positive integers is " << mean << endl;
}
else
cout << "Invalid input - integer must be positive" << endl;
return 0;
}
Note that the counter in the for loop of Sample Program 5.5 is number. It incre-
ments from 1 to value during execution. There are several other features of this
code that also need to be addressed. First of all, why is the typecast operator
needed to compute the mean? What do you think will happen if it is removed?
LM_Chp5.qxd 4/24/03 12:36 PM Page 63
Finally, what would happen if we entered a float such as 2.99 instead of an inte-
ger? Lab 5.3 will demonstrate what happens in these cases.
Nested Loops
Often programmers need to use a loop within a loop, or nested loops. Sample Program
5.6 below provides a simple example of a nested loop. This program finds the average
number of hours per day spent programming by each student over a three-day week-
end. The outer loop controls the number of students and the inner loop allows the
user to enter the number of hours worked each of the three days for a given student.
Note that the inner loop is executed three times for each iteration of the outer loop.
#include <iostream>
using namespace std;
int main()
{
int numStudents;
float numHours, total, average;
int count1 = 0, count2 = 0; // these are the counters for the loops
cout << "This program will find the average number of hours a day"
<< " that each given student spent programming over a long weekend"
<< endl << endl;
cout << "How many students are there ?" << endl << endl;
cin >> numStudents;
In Lab 5.4 you will be asked to modify this program to make it more flexible.
LM_Chp5.qxd 4/24/03 12:36 PM Page 64
LESSON 5A
#include <iostream>
using namespace std;
int main()
{
char letter = 'a';
return 0;
}
LM_Chp5.qxd 4/24/03 12:36 PM Page 65
Lesson 5A 65
Exercise 1: This program is not user friendly. Run it a few times and explain
why.
Exercise 2: Add to the code so that the program is more user friendly.
Exercise 3: How would this code affect the execution of the program if the
while loop is replaced by a do-while loop? Try it and see.
Bring in program sentinel.cpp from the Lab 5 Folder. The code is shown below:
#include <iostream>
using namespace std;
int main()
{
// Fill in the code to define and initialize to 1 the variable month
float total = 0, rain;
cout << "Enter the total rainfall for month " << month << endl;
cout << "Enter -1 when you are finished" << endl;
// Fill in the code to read in the value for rain
cout << "Enter the total rainfall in inches for month "
<< month << endl;
cout << "Enter -1 when you are finished" << endl;
// Fill in the code to read in the value for rain
if (month == 1)
cout << "No data has been entered" << endl;
else
cout << "The total rainfall for the " << month-1
continues
LM_Chp5.qxd 4/24/03 12:36 PM Page 66
<< " months is "<< total << " inches." << endl;
return 0;
}
Exercise 4: Complete the program above by filling in the code described in the
statements in bold so that it will perform the indicated task.
Exercise 5: Run the program several times with various input. Record your
results. Are they correct? What happens if you enter –1 first? What happens
if you enter only values of 0 for one or more months? Is there any numeri-
cal data that you should not enter?
Exercise 6: What is the purpose of the following code in the program above?
if (month == 1)
cout << "No data has been entered" << endl;
// This program displays a hot beverage menu and prompts the user to
// make a selection. A switch statement determines which item the user
// has chosen. A do-while loop repeats until the user selects item E
// from the menu.
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
// Fill in the code to define an integer variable called number,
// a floating point variable called cost,
// and a character variable called beverage
bool validBeverage;
do
{
cout << endl << endl;
cout << "Hot Beverage Menu" << endl << endl;
cout << "A: Coffee $1.00" << endl;
cout << "B: Tea $ .75" << endl;
cout << "C: Hot Chocolate $1.25" << endl;
cout << "D: Cappuccino $2.50" << endl << endl << endl;
LM_Chp5.qxd 4/24/03 12:36 PM Page 67
Lesson 5A 67
cout << "Enter the beverage A,B,C, or D you desire" << endl;
cout << "Enter E to exit the program" << endl << endl;
// Fill in the code to read in beverage
switch(beverage)
{
case 'a':
case 'A':
case 'b':
case 'B':
case 'c':
case 'C':
case 'd':
case 'D': validBeverage = true;
break;
default: validBeverage = false;
}
if (validBeverage == true)
{
cout << "How many cups would you like?" << endl;
// Fill in the code to read in number
}
case 'e':
case 'E': cout << " Please come again" << endl;
break;
default:cout << // Fill in the code to write a message
// indicating an invalid selection.
cout << " Try again please" << endl;
}
Exercise 1: Fill in the indicated code to complete the above program. Then
compile and run the program several times with various inputs. Try all the
possible relevant cases and record your results.
Exercise 2: What do you think will happen if you do not enter A, B, C, D
or E? Try running the program and inputting another letter.
Exercise 3: Replace the line
if (validBeverage == true)
with the line
if (validBeverage)
and run the program again. Are there any differences in the execution of
the program? Why or why not?
LESSON 5B
// This program has the user input a number n and then finds the
// mean of the first n positive integers
#include <iostream>
using namespace std;
int main()
{
int value; // value is some positive number n
int total = 0; // total holds the sum of the first n positive numbers
int number; // the amount of numbers
float mean; // the average of the first n positive numbers
if (value > 0)
{
for (number = 1; number <= value; number++)
{
total = total + number;
} // curly braces are optional since there is only one statement
Lesson 5B 69
}
else
cout << "Invalid input - integer must be positive" << endl;
return 0;
}
Exercise 1: Why is the typecast operator needed to compute the mean in the
statement mean = static_cast(float)(total)/value;? What do you think
will happen if it is removed? Modify the code and try it. Record what happens.
Make sure that you try both even and odd cases. Now put static_cast<float>
total back in the program.
Exercise 2: What happens if you enter a float such as 2.99 instead of an integer
for value? Try it and record the results.
Exercise 3: Modify the code so that it computes the mean of the consecutive
positive integers n, n+1, n+2, . . . , m, where the user chooses n and m.
For example, if the user picks 3 and 9, then the program should find the
mean of 3, 4, 5, 6, 7, 8, and 9, which is 6.
#include <iostream>
using namespace std;
int main()
{
int numStudents;
float numHours, total, average;
int student,day = 0; // these are the counters for the loops
cout << "This program will find the average number of hours a day"
<< " that a student spent programming over a long weekend\n\n";
cout << "How many students are there ?" << endl << endl;
cin >> numStudents;
average = total / 3;
return 0;
}
Exercise 1: Note that the inner loop of this program is always executed exactly
three times—once for each day of the long weekend. Modify the code so
that the inner loop iterates n times, where n is a positive integer input by
the user. In other words, let the user decide how many days to consider
just as they choose how many students to consider.
Sample Run:
This program will find the average number of hours a day that a student spent
programming over a long weekend
Exercise 2: Modify the program from Exercise 1 so that it also finds the average
number of hours per day that a given student studies biology as well as
programming. For each given student include two prompts, one for each
subject. Have the program print out which subject the student, on average,
spent the most time on.
LM_Chp5.qxd 4/24/03 12:36 PM Page 71
Lesson 5B 71
Sample Run:
Please input the favorite beverage of person #1: Choose 1, 2, 3, or 4 from the
above menu or -1 to exit the program
4
Please input the favorite beverage of person #2: Choose 1, 2, 3, or 4 from the
above menu or -1 to exit the program
1
Please input the favorite beverage of person #3: Choose 1, 2, 3, or 4 from the
above menu or -1 to exit the program
3
Please input the favorite beverage of person #4: Choose 1, 2, 3, or 4 from the
above menu or -1 to exit the program
1
Please input the favorite beverage of person #5: Choose 1, 2, 3, or 4 from the
above menu or -1 to exit the program
1
Please input the favorite beverage of person #6: Choose 1, 2, 3, or 4 from the
above menu or -1 to exit the program
-1
Option 2: Suppose Dave drops a watermelon off a high bridge and lets it fall
until it hits the water. If we neglect air resistance, then the distance d in
meters fallen by the watermelon after t seconds is d = 0.5 * g * t2, where the
acceleration of gravity g = 9.8 meters/second2. Write a program that asks the
user to input the number of seconds that the watermelon falls and the
height h of the bridge above the water. The program should then calculate
the distance fallen for each second from t = 0 until the value of t input by
the user. If the total distance fallen is greater than the height of the bridge,
then the program should tell the user that the distance fallen is not valid.
LM_Chp5.qxd 4/24/03 12:36 PM Page 72
Sample Run 1:
Please input the time of fall in seconds:
2
Please input the height of the bridge in meters:
100
Sample Run 2:
Please input the time of fall in seconds:
4
Please input the height of the bridge in meters:
50
Warning-Bad Data: The distance fallen exceeds the height of the bridge
Option 3: Write a program that prompts the user for the number of tellers at
Nation’s Bank in Hyatesville that worked each of the last three years. For
each worker the program should ask for the number of days out sick for
each of the last three years. The output should provide the number of
tellers and the total number of days missed by all the tellers over the last
three years.
See the sample output below.
Sample Run:
How many tellers worked at Nation’s Bank during each of the last three years ?
2
How many days was teller 1 out sick during year 1 ?
5
How many days was teller 1 out sick during year 2 ?
8
How many days was teller 1 out sick during year 3 ?
2
LM_Chp5.qxd 4/24/03 12:36 PM Page 73
Lesson 5B 73
The 2 tellers were out sick for a total of 19 days during the last three years
LM_Chp5.qxd 4/24/03 12:36 PM Page 74