LM - Chapter 05 PDF
LM - Chapter 05 PDF
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. 65
LESSON 5A
Lab 5.1
Working with the while Loop Basic understanding 25 min. 65
of the while loop
Lab 5.2
Working with the Basic understanding 25 min. 67
do-while Loop of do-while loop
LESSON 5B
Lab 5.3
Working with the for Loop Understanding of for 15 min. 69
loops
Lab 5.4
Nested Loops Understanding of 15 min 70
nested for loops
Lab 5.5
Reading and Writing Basic understanding 15 min. 72
to a File of reading and writing files
continues
55
Lab 5.6
Student Generated Code Basic understanding 30 min. 73
Assignments of loop control structures
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)
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.
The while Loop
Often in programming one needs a statement or block of statements to repeat dur-
ing execution. This can be accomplished using a loop. A loop is a control struc-
ture that causes repetition of code within a program. C++ has three types of
loops. The first we will consider is the while loop. The syntax is the following:
while (expression)
{
statement_1;
statement_2;
:
statement_n;
}
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:
#include <iostream>
using namespace std;
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';
while (letter != 'x')
continues
{
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.
Sample Program 5.3:
#include <iostream>
using namespace std;
const int NUMBEROFTESTS = 5;
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?
Sample Program 5.4:
#include <iostream>
using namespace std;
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.
cout << "Please input your choice of drink "
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;
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.
The for Loop
The for loop is often used for applications that require a counter. For example,
suppose we want to find the average (mean) of the first n positive integers. By
definition, this means that we need to add 1 + 2 + 3 + . . . + n and then divide
by n. Note this should just give us the value in the middle of the list 1, 2, . . . , n.
Since we know exactly how many times we are performing a sum, the for loop
is the natural choice.
The syntax for the for loop is the following:
for (initialization; test; update)
{
statement_1;
statement_2;
:
statement_n;
}
Notice that there are three expressions inside the parentheses of the for statement,
separated by semicolons.
#include <iostream>
using namespace std;
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
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?
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.
Sample Program 5.6:
// This program finds the average time spent programming by a student each
// day over a three day period.
#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.
Files
So far all our input has come from the keyboard and our output has gone to the
monitor. Input, however, can come from files and output can go to files. To do
either of these things we should add the #include <fstream> directive in the head-
er to allow files to be created and accessed. A file containing data to be input to
the computer should be defined as an ifstream data type and an output file
should be defined as ofstream.
Suppose we have a data file called grades.dat that contains three grades, and
we want to take those grades and output them to a file that we will call final-
grade.out. The following code shows how this can be done in C++.
int main()
{
float grade1, grade2, grade3; // This defines 3 float variables
outFile << fixed << showpoint; // These can be used with output files as
// well as with cout.
outFile << grade1 << endl; // These 3 lines write the values stored in
outFile << grade2 << endl; // the 3 variables to the output file
outFile << grade3 << endl;
return 0;
}
Fill-in-the-Blank Questions
1. A block of code that repeats forever is called .
2. To keep track of the number of times a particular loop is repeated, one
.
4. An event controlled loop that is not guaranteed to execute at least once is
the .
5. In the conditional if(++number < 9), the comparison number < 9 is made
and number is incremented . (Choose
8. List the preprocessor directive that is used to allow data and output files to
be used in the program.
9. To write out the first 12 positive integers and their cubes, one should use
a(n) loop.
11. In a nested loop the loop goes through all of its itera-
tions for each iteration of the loop. (Choose inner or
outer for each blank.)
LESSON 5 A
Bring in program while.cpp from the Lab 5 folder. (This is Sample Program 5.2
from the Pre-lab Reading Assignment). The code is shown below:
#include <iostream>
using namespace std;
int main()
{
char letter = 'a';
return 0;
}
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
<< " months is "<< total << " inches." << endl;
return 0;
}
Lesson 5A 67
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;
continues
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;
}
Lesson 5A 69
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.
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
continues
}
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.
Bring in program nested.cpp from the Lab 5 folder (this is Sample Program 5.6
from the Pre-lab Reading Assignment). The code is shown below:
#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;
Lesson 5B 71
average = total / 3;
return 0;
}
Exercise 1: Note that the inner loop of this program is always executed exactly
three timesonce 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.
// This program will read in the quantity of a particular item and its price.
// It will then print out the total price.
// The input will come from a data file and the output will go to
// an output file.
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
ifstream dataIn; // defines an input stream for a data file
ofstream dataOut; // defines an output stream for an output file
int quantity; // contains the amount of items purchased
float itemPrice; // contains the price of each item
float totalBill; // contains the total bill, i.e. the price of all items
// Fill in the output statement that prints the total bill, with a label,
// to an output file
return 0;
}
Exercise 1: Notice that this is an altered version of Lab 3.1. This program gets
the information from a file and places the output to a file. You must
create the data file. Your instructor will tell you how to create the data file
and where to put it. Create a data file called transaction.dat that has the
following information:
22
10.98
Exercise 2: Fill in the blank and the statements that will read the data from the
file and print the following to bill.out:
Lesson 5B 73
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
The total number of people surveyed is 5. The results are as follows: Beverage
Number of Votes
********************************
Coffee 3
Tea 0
Coke 1
Orange Juice 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.
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
Nations 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 Nations 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
How many days was teller 1 out sick during year 1 ?
1
How many days was teller 1 out sick during year 2 ?
0
How many days was teller 1 out sick during year 3 ?
3
The 2 tellers were out sick for a total of 19 days during the last 3 years.