Chapter 3 Control Methods

Chapter 3 Control Statements
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved. 013225445X
1
Objectives
To declare bool type and write Boolean
expressions using comparison operators (§3.2).
 To implement selection control using simple if
statements (§3.3).
 To combine conditions using logical operators
(&&, ||, and !) (§3.4).
 To implement selection control using if ... else
statements (§3.5).
 To implement selection control using nested if
statements (§3.6).

Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved. 013225445X
2
Objectives (cont.)
 To
implement selection control using switch
statements (§3.9).
 To write expressions using the conditional
operator (§3.10).
 To display formatted output using the
stream manipulators (§3.11).
 To know the rules governing operand
evaluation order, operator precedence, and
operator associativity (§3.12).
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
3
The bool Type and Operators
 Values:
true, false
 \C++ provides six relational operators (also
known as comparison operators) to compare
two values.
bool done;
bool isGreater;
done = false;
isGreater = 5 < 3;
//isGreater == false
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
4
Comparison Operators
Operator
Name
Example
Result
<
less than
1 < 2
true
<=
less than or equal to
1 <= 2
true
>
greater than
1 > 2
false
>=
greater than or equal to
1 >= 2
false
==
equal to
1 == 2
false
!=
not equal to
1 != 2
true
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
5
Simple if Statements
if (booleanExpression)
{
statement(s);
}
Boolean
Expression
if (radius >= 0)
{
area = radius * radius * PI;
cout << "The area for the circle of " <<
" radius " << radius << " is " << area;
}
false
false
(radius >= 0)
true
true
Statement(s)
(a)
area = radius * radius * PI;
cout << "The area for the circle of " <<
" radius " << radius << " is " << area;
(b)
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
6
Compound Condition
Outer parentheses required
if ((i > 0) && (i < 10))
{
cout << "i is an " <<
"integer between 0 and 10";
}
(a)
Braces can be omitted if the block contains a single
statement
Equivalent
if ((i > 0) && (i < 10))
cout << "i is an " <<
"integer between 0 and 10";
(b)
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
7
Examples
Listing 3.1 gives a program that checks whether a number is even or
odd. The program prompts the user to enter an integer (line 9) and
displays “number is even” if it is even (lines 11-12) and “number is
odd” if it is odd (lines 14-15).
TestBoolean
Run
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
8
Caution
Adding a semicolon at the end of an if clause is a
common mistake.
Empty Body
Logic Error
if (radius >= 0);
{
area = radius * radius * PI;
cout << "The area "
<< " is " << area;
}
(a)
Equivalent
if (radius >= 0) { };
{
area = radius * radius * PI;
cout << "The area "
<< " is " << area;
}
(b)
This mistake is hard to find, because it is not a
compilation error or a runtime error, it is a logic error.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
9
Examples
This section uses the if statements to write an interesting game
program. The program can find your birth date. The program
prompts you to answer whether your birth date is in the following
five sets of numbers:
Set1
16
20
24
28
17
21
25
29
18
22
26
30
19
23
27
31
Set2
Set3
8 9 10 11
12 13 14 15
24 25 26 27
28 29 30 31
1 3 5 7
9 11 13 15
17 19 21 23
25 27 29 31
GuessBirthDate
Set4
2
10
18
26
3
11
19
27
6
14
22
30
Set5
7
15
23
31
4 5 6 7
12 13 14 15
20 21 22 23
28 29 30 31
Run
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
10
Boolean Operators
Operator Name
!
not
&&
and
||
or
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
11
Truth Table for Operator !
p
!p
true
false
!(1 > 2) is true, because (1 > 2) is false.
false
true
!(1 > 0) is false, because (1 > 0) is true.
Example
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
12
Truth Table for Operator &&
p1
p2
p1 && p2
false
false
false
false
true
false
true
false
false
true
true
true
Example
(3 > 2) && (5 >= 5) is true, because (3 >
2) and (5 >= 5) are both true.
(3 > 2) && (5 > 5) is false, because (5 >
5) is false.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
13
Truth Table for Operator ||
p1
p2
p1 || p2
false
false
false
false
true
true
true
false
true
true
true
true
Example
(2 > 3) || (5 > 5) is false, because (2 > 3)
and (5 > 5) are both false.
(3 > 2) || (5 > 5) is true, because (3 > 2)
is true.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
14
Examples
Listing 3.3 gives a program that checks whether a
number is divisible by 2 and 3, whether a number
is divisible by 2 or 3, and whether a number is
divisible by 2 or 3 but not both:
TestBooleanOperators
Run
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
15
Short-Circuit Operator
Given: p1 && p2
C++ first evaluates p1 and then evaluates p2 if
p1 is true; if p1 is false, it does not evaluate p2.
When evaluating p1 || p2, C++ first evaluates p1
and then evaluates p2 if p1 is false; if p1 is true, it
does not evaluate p2.
Therefore, && is referred to as the conditional
or short-circuit AND operator, and || is referred to
as the conditional or short-circuit OR operator.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
16
The if...else Statement
if (booleanExpression) {
statement(s)-for-the-true-case;
}
else {
statement(s)-for-the-false-case;
}
true
Statement(s) for the true case
Boolean
Expression
false
Statement(s) for the false case
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
17
Examples
Listing 3.4 presents a program that lets the user enter a
year and checks whether it is a leap year.
A year is a leap year if it is divisible by 4 but not by 100
or if it is divisible by 400. So you can use the following
Boolean expression to check whether a year is a leap year:
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
LeapYear
Run
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
18
Nested if Statements
if (i > k)
{
if (j > k)
cout << "i and j are greater than k";
}
else
cout << "i is less than or equal to k";
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
19
Multiple Alternative if Statements
if (score >= 90.0)
grade = 'A';
else
if (score >= 80.0)
grade = 'B';
else
if (score >= 70.0)
grade = 'C';
else
if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Equivalent
if (score >= 90.0)
grade = 'A';
else if (score >= 80.0)
grade = 'B';
else if (score >= 70.0)
grade = 'C';
else if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
20
animation
Trace if-else statement
Suppose score is 70.0
The condition is false
if (score >= 90.0)
grade = 'A';
else if (score >= 80.0)
grade = 'B';
else if (score >= 70.0)
grade = 'C';
else if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
21
animation
Trace if-else statement
Suppose score is 70.0
The condition is false
if (score >= 90.0)
grade = 'A';
else if (score >= 80.0)
grade = 'B';
else if (score >= 70.0)
grade = 'C';
else if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
22
animation
Trace if-else statement
Suppose score is 70.0
The condition is true
if (score >= 90.0)
grade = 'A';
else if (score >= 80.0)
grade = 'B';
else if (score >= 70.0)
grade = 'C';
else if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
23
animation
Trace if-else statement
Suppose score is 70.0
grade is C
if (score >= 90.0)
grade = 'A';
else if (score >= 80.0)
grade = 'B';
else if (score >= 70.0)
grade = 'C';
else if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
24
animation
Trace if-else statement
Suppose score is 70.0
Exit the if statement
if (score >= 90.0)
grade = 'A';
else if (score >= 80.0)
grade = 'B';
else if (score >= 70.0)
grade = 'C';
else if (score >= 60.0)
grade = 'D';
else
grade = 'F';
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
25
Note
The else clause matches the most recent if clause
in the same block.
int i = 1;
int j = 2;
int k = 3;
Equivalent
if (i > j)
if (i > k)
cout << "A";
else
cout << "B";
(a)
This is better
with correct
indentation
int i = 1;
int j = 2;
int k = 3;
if (i > j)
if (i > k)
cout << "A";
else
cout << "B";
(b)
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
26
Note, cont.
Nothing is printed from the preceding statement. To force
the else clause to match the first if clause, you must add a
pair of braces:
int i = 1; int j = 2; int k = 3;
if (i > j)
{
if (i > k)
cout << "A";
}
else
cout << "B";
This statement prints B.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
27
TIP
if (number % 2 == 0)
even = true;
else
even = false;
(a)
Equivalent
bool even
= number % 2 == 0;
This is better
(b)
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
28
CAUTION
if (even == true)
cout <<"It is even.";
(a)
Equivalent
This is better
if (even)
cout << "It is even.";
(b)
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
29
Example: Computing Taxes
The US federal personal income tax is calculated based on
the filing status and taxable income. There are four filing
statuses: single filers, married filing jointly, married filing
separately, and head of household. The tax rates for 2002
are shown in Table 3.6.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
30
Example: Computing Taxes, cont.
if (status == 0)
{
// Compute tax for single filers
}
else if (status == 1)
{
// Compute tax for married file jointly
}
else if (status == 2)
{
// Compute tax for married file separately
}
else if (status == 3)
{
// Compute tax for head of household
}
else
{
// Display wrong status
}
ComputeTaxWithSelectionStatement
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
Run
31
Example: A Simple Math Learning Tool
This example creates a program for a first grader
to practice subtractions. The program randomly
generates two single-digit integers number1 and
number2 with number1 > number2 and displays a
question such as “What is 9 – 2?” to the student,
as shown in the sample output. After the student
types the answer, the program displays a message
to indicate whether the answer is correct.
SubtractionTutor
Run
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
32
switch Statements
switch (status) {
case 0: compute taxes for single filers;
break;
case 1: compute taxes for married file jointly;
break;
case 2: compute taxes for married file separately;
break;
case 3: compute taxes for head of household;
break;
default: System.out.println("Errors: invalid status");
System.exit(0);
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
33
switch Statement Flow Chart
status is 0
Compute tax for single filers
break
Compute tax for married file jointly
break
Compute tax for married file separatly
break
Compute tax for head of household
break
status is 1
status is 2
status is 3
default
Default actions
Next Statement
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
34
switch Statement Rules
The switch-expression
must yield a value of char,
byte, short, or int type and
must always be enclosed in
parentheses.
The value1, ..., and valueN must
have the same data type as the
value of the switch-expression.
The resulting statements in the
case statement are executed when
the value in the case statement
matches the value of the switchexpression. Note that value1, ...,
and valueN are constant
expressions, meaning that they
cannot contain variables in the
expression, such as 1 + x.
switch (switch-expression) {
case value1: statement(s)1;
break;
case value2: statement(s)2;
break;
…
case valueN: statement(s)N;
break;
default: statement(s)-for-default;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
35
switch Statement Rules
The keyword break is optional,
but it should be used at the end of
each case in order to terminate the
remainder of the switch
statement. If the break statement
is not present, the next case
statement will be executed.
The default case, which is
optional, can be used to perform
actions when none of the
specified cases matches the
switch-expression.
switch (switch-expression) {
case value1: statement(s)1;
break;
case value2: statement(s)2;
break;
…
case valueN: statement(s)N;
break;
default: statement(s)-for-default;
}
The case statements are executed in sequential
order, but the order of the cases (including the
default case) does not matter. However, it is good
programming style to follow the logical sequence
of the cases and place the default case at the end.
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
36
animation
Trace switch statement
Suppose ch is 'a':
switch (ch) {
case 'a': cout << ch;
case 'b': cout << ch;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
37
animation
Trace switch statement
ch is 'a':
switch (ch) {
case 'a': cout << ch;
case 'b': cout << ch;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
38
animation
Trace switch statement
Execute this line
switch (ch) {
case 'a': cout << ch;
case 'b': cout << ch;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
39
animation
Trace switch statement
Execute this line
switch (ch) {
case 'a': cout << ch;
case 'b': cout << ch;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
40
animation
Trace switch statement
Execute this line
switch (ch) {
case 'a': cout << ch;
case 'b': cout << ch;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
41
animation
Trace switch statement
Execute next statement
switch (ch) {
case 'a': cout << ch;
case 'b': cout << ch;
case 'c': cout << ch;
}
Next statement;
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
42
animation
Trace switch statement
Suppose ch is 'a':
switch (ch) {
case 'a': cout << ch;
break;
case 'b': cout << ch;
break;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
43
animation
Trace switch statement
ch is 'a':
switch (ch) {
case 'a': cout << ch;
break;
case 'b': cout << ch;
break;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
44
animation
Trace switch statement
Execute this line
switch (ch) {
case 'a': cout << ch;
break;
case 'b': cout << ch;
break;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
45
animation
Trace switch statement
Execute this line
switch (ch) {
case 'a': cout << ch;
break;
case 'b': cout << ch;
break;
case 'c': cout << ch;
}
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
46
animation
Trace switch statement
Execute next statement
switch (ch) {
case 'a': cout << ch;
break;
case 'b': cout << ch;
break;
case 'c': cout << ch;
}
Next statement;
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
47
Conditional Operator
if (x > 0)
y=1
else
y = -1;
is equivalent to
y = (x > 0) ? 1 : -1;
(booleanExpression) ? expression1 : expression2
Ternary operator
Binary operator
Unary operator
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
48
Conditional Operator
cout << ((num % 2 == 0) ? "num is even" :
"num is odd");
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
49
Conditional Operator, cont.
(booleanExp) ? exp1 : exp2
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
50
Formatting Output
Operator
Description
setw(width)
specifies the width of a print field
setprecision(n)
sets the precision of a floating-point number
fixed
displays floating-point numbers in fixed point notation
showpoint
causes a floating-point number to be displayed with
a decimal point with trailing zeros even if it has
no fractional part
left
justifies the output to the left
right
justifies the output to the right
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
51
Operator Precedence
How to evaluate 3 + 4 * 4 > 5 * (4 + 3) – 1?
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
52
Operator Precedence











var++, var-+, - (Unary plus and minus), ++var,--var
(type) Casting
! (Not)
*, /, % (Multiplication, division, and
remainder)
+, - (Binary addition and subtraction)
<, <=, >, >= (Comparison)
==, !=; (Equality)
&& (Conditional AND) Short-circuit AND
|| (Conditional OR) Short-circuit OR
=, +=, -=, *=, /=, %= (Assignment operator)
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
53
Enumerated Types
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY};
Once a type is defined, you can declare a variable of that type:
Day day;
The variable day can hold one of the values defined in the
enumerated type. For example, the following statement assigns
enumerated value MONDAY to variable day:
day = MONDAY;
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
54
Enumerated Types
As with any other type, you can declare and initialize a variable in
one statement:
Day day = MONDAY;
Furthermore, C++ allows you to declare an enumerated type and
variable in one statement. For example,
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY} day = MONDAY;
TestEnumeratedType
Run
Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.
013225445X
55