Nested if Statements
|
|
|
Example (in pseudocode) |
|
IF today is Saturday or Sunday |
|
IF it is raining |
|
Sleep late |
|
ELSE |
|
Get up and go outside |
|
ELSE |
|
Go to work |
if Alternatives
|
|
|
|
if (month == 1) if (month == 1) |
|
cout << “January”; cout << “January”; |
|
if (month == 2) else |
|
cout << “February”; if (month == 2) |
|
if (month == 3) cout << “February”; |
|
cout <<
“March”; else |
|
. if (month
== 3) |
|
. cout
<< “March”; |
|
. else |
|
if (month == 12) if (month == 4) |
|
cout << “December”; |
Multiple Alternatives
|
|
|
cout << “The recommended activity
is ”; |
|
if (temperature > 85) |
|
cout << “swimming.” << endl; |
|
else if (temperature > 70) |
|
cout << “tennis.” << endl; |
|
else if (temperature > 32) |
|
cout << “golf.” << endl; |
|
else if (temperature > 0) |
|
cout << “skiing.” << endl; |
|
else |
|
cout << “dancing.” << endl; |
Beware of the dangling else
|
|
|
if (average >= 60.0) |
|
if (average < 70.0) |
|
cout << “Passing but marginal”; |
|
else |
|
cout << “Failing”; |
|
|
|
|
Beware of the dangling else
|
|
|
if (average >= 60.0) //
Incorrect |
|
if (average < 70.0) |
|
cout << “Passing but marginal”; |
|
else |
|
cout << “Failing”; |
|
|
|
|
Beware of the dangling else
|
|
|
if (average >= 60.0) //
Incorrect |
|
if (average < 70.0) |
|
cout << “Passing but marginal”; |
|
else |
|
cout << “Failing”; |
|
|
|
if (average >= 60.0) //
Correct |
|
{ |
|
if (average < 70.0) |
|
cout << “Passing but marginal”; |
|
} |
|
else |
|
cout << “Failing”; |
Testing the State of
an
I/O Stream
|
|
|
C++ provides a way to check whether a
stream is in the fail state. You simply use the name of the stream object as
if it were a Boolean variable. |
I/O Stream State Test
Example
|
|
|
int main() |
|
{ |
|
int height, width; |
|
ifstream inFile; |
|
inFile.open(“mydata.dat”); |
|
if ( !inFile ) |
|
{ |
|
cout << “Can’t open the input file.”; |
|
return 1; |
|
} |
|
inFile >> height >>
width; |
|
return 0; |
|
} |
Problem-Solving Case
Study-
Warning Notices
|
|
|
Problem: In order to warn freshmen who
are in danger of failing a class, your program should calculate the average
of three tests. Then, the program prints out the student id, average, and
either pass, fail, or marginal. |
|
Input: Student ID number (long)
followed by three test grades. |
|
Output: A prompt for input, echo print
input, id, average, message with possible error message for invalid data
(<0). |
|
Discussion: Passing is >= 70.0,
marginal is < 70.0 and >= 60.0, failing is < 60.0. |
Main Module (Level 0)
|
|
|
|
Get data |
|
Test data |
|
IF data OK |
|
Calculate average |
|
Print message indicating status |
|
ELSE |
|
Print “Invalid Data: Score(s) less than
zero.” |
Print Message Indicating
Status
(Level 1)
|
|
|
|
|
Print average |
|
IF average >= 60.0 |
|
Print “Passing” |
|
IF average < 70.0 |
|
Print “but marginal” |
|
Print ‘.’ |
|
ELSE |
|
Print “Failing” |
Notices Program
|
|
|
//************************************************************ |
|
// Notices program |
|
// This program determines (1) a
student's average based on |
|
// three test scores and (2) the
student's passing/failing |
|
// status |
|
//************************************************************ |
|
|
|
#include <iostream> |
|
#include <iomanip> // For setprecision() |
|
using namespace std; |
|
|
|
int main() |
|
{ |
|
float average; //
Average of three test scores |
|
long studentID; // Student's identification number |
|
int test1; // Score for first test |
|
int test2; // Score for second test |
|
|
More Notices Program
|
|
|
int test3; // Score for third test |
|
bool dataOK; // True if data is correct |
|
|
|
cout << fixed <<
showpoint; // Set up floating
pt. |
|
// output format |
|
// Get data |
|
cout << "Enter a Student ID number and three test
scores:" |
|
<< endl; |
|
cin >> studentID >> test1 >> test2 >> test3; |
|
cout << "Student number: " << studentID <<
" Test Scores: " |
|
<< test1 << ", " << test2
<< ", " << test3 << endl; |
|
|
|
// Test data |
|
if (test1 < 0 || test2 < 0 || test3 < 0) |
|
dataOK = false; |
|
else |
|
dataOK = true; |
Notices Program
(continued)
|
|
|
if (dataOK) |
|
{ |
|
// Calculate average |
|
average = float(test1 + test2 + test3) / 3.0; |
|
|
|
// Print message |
|
cout << "Average score is " << setprecision(2) |
|
<< average << "--"; |
|
|
|
if (average >= 60.0) |
|
{ |
|
cout << "Passing"; // Student is passing |
|
if (average < 70.0) |
|
cout << " but marginal"; // But marginal |
|
cout << '.' << endl; |
|
} |
|
|
Notices Program (The End)
|
|
|
else //
Student is failing |
|
cout << "Failing." << endl; |
|
} |
|
else
// Invalid data |
|
cout << "Invalid Data:
Score(s) less than zero." |
|
<< endl; |
|
return 0; |
|
} |
|
|
Testing and Debugging
Phases
|
|
|
|
|
Problem-Solving Phase |
|
Algorithm Walk-Through |
|
Precondition - an assertion which must
be true before a module is executed in order for the module to execute
correctly. |
|
Postcondition - an assertion which will
be true after the module has executed, if it has done its job properly. |
|
|
|
|
Testing and Debugging
Phases
|
|
|
|
Implementation Phase |
|
Code Walk-Through - make sure that
you’ve faithfully reproduced the algorithm. |
|
Execution Trace - play computer and
execute each statement of a program by hand. |
|
Testing Selection Control Structures -
you need to execute each branch at least once and verify the results. |
|
|
Testing
Selection
Control Structures
Test Set 1
test1 = 100, test2 =100, test3 = 100
Test Set 2
test1 = 60, test2 = 60, test3 = 63
Test Set 3
test1 = 50, test2 = 50, test3 = 50
Test Set 4
test1 = -50, test2 = 50, test3 = 50