Transcript Chapter 5
If-Else statement
Control Flow
The order of executing statements in a program.
What are the possibilities?
Statement 1
Statement 2
true
condition
false
condition
true
Statements 1
Statements 2
Statements
Statement 3
sequential
Selection/branching
Repetition/looping
false
IF statement
int num1, num2;
float quotient;
cin >> num1 >> num2;
quotient = float(num1) / num2;
// Any possible issues?
// What if num2 is zero?
if (num2 != 0)
quotient = float(num1) / num2;
IF statement
if ( expression )
statement;
if ( num2 != 0 )
quotient = float(num1) / num2;
Semantics
do computation only when num2 is not zero
the statement is skipped when num2 is zero
Syntax
condition inside ()
!= for not equal
Style
on separate lines
indent 3 spaces
a space before and after each character
How to print an error message?
IF-ELSE statement
if ( expression )
statement;
else
statement;
if (num2 != 0)
quotient = float(num1) / num2;
else
cout << "Error: divided by zero!" << endl;
What if I also want to print the quotient if possible?
IF-ELSE statement
if ( expression )
{
statements;
}
else
{
statements;
}
if (num2 != 0)
{
quotient = float(num1) / num2;
cout << "The quotient is" << quotient << endl;
}
else
cout << "Error: divided by zero!" << endl;
Semantics
do different things when num2 is zero or not
Syntax
braces for multiple statements (statement block)
braces are optional for single statement
Style
braces on separate lines
Statement Block
if (hour <= 40)
salary
salary =
= hour
hour *
* payRate;
payRate;
else
else
{
salary
salary =
= (
( hour
hour - 40
40 )
) *
* payRate
payRate
cout
cout <<
<< endl
endl <<
<< "You
"You have
have "
" <<
<< (
(
cout << "Your salary is " << salary
}
cout << "Your salary is " << salary
*
* 1.5
1.5 +
+ 40
40 *
* payRate;
payRate;
hour
hour - 40
40 )
) <<
<< "
" hours
hours overtime."
overtime." <<
<< endl;
endl;
<< endl;
<< endl;
What will be the output if hour = 30 and payRate = 10?
• Indentation and blank line is a style issue. It does not make a block.
• Braces are required for block of multiple statements.
Example: Find the MAX of two numbers
int num1, num2, max;
cin >> num1 >> num2;
if ( num1 > num2 )
max = num1;
else
max = num2;
cout << “The max value is ” << max << endl;
// Another way
if ( num1 >= num2 )
max = num1;
else
max = num2;
How to find the MAX of three numbers?
cout << “The max value is ” << max << endl;
8
Nested IF statement
int num1, num2, num3, max;
cin >> num1 >> num2 >> num3;
if ( num1 > num2 )
if ( num1 > num3 )
max = num1;
else
max = num3;
else
if ( num2 > num3 )
max = num2;
else
max = num3;
if ( num1 > num2 )
if ( num1 > num3 )
max = num1;
else
max = num3;
else if ( num2 > num3 )
max = num2;
else
max = num3;
cout << “The max value is ” << max << endl;
The Dangling else
max = 0;
if ( num1 > num2 )
if ( num1 > num3 )
max = num1;
else
max = num3;
max = 0;
if ( num1 > num2 )
if ( num1 > num3 )
max = num1;
else
max = num3;
suppose num1 = 10, num2 = 20, num3 = 4, what is the value of max?
else always look backwards for the closest if.
How about
max = 0;
if ( num1 > num2 )
{
if ( num1 > num3 )
max = num1;
}
else
max = num3;
?
Use braces to
change the pairing!
Multi-way branching using If-else if-else
int score;
char grade;
cin >> score;
if (score >= 90)
grade = 'A';
else if (score >= 80)
grade = 'B';
else if (score >= 70)
grade = 'C';
else if (score >= 60)
grade = 'D';
else // NO if here!
grade = 'F';
Which is better?
if (score >= 90)
grade = ‘A’;
if (score >= 80 && score < 90)
grade = ‘B’;
if (score >= 70 && score < 80)
grade = ‘C’;
if (score >= 60 && score < 70)
grade = ‘D’;
if (score < 60)
grade = ‘F’;
cout << “Your Grade: ” << grade;
What is the problem?
Can we change the order?
Magic number!
NO!
Order in If-else if-else
int score;
char grade;
cin >> score;
if (score >= 80)
grade = ‘B';
else if (score >= 90)
grade = ‘A';
else if (score >= 70)
grade = 'C';
else if (score >= 60)
grade = 'D';
else // NO if here!
grade = 'F';
cout << “Your Grade: ” << grade;
You will never get an ‘A’!
Debugging in HiC
Run set breakpoint
Run run
Run step over
Run watches
Run clear all breakpoints
use debugging tool to observe the control flow!
Problem: Input range check
check whether the 2 integer inputs are both in the
range [10, 50].
10 <= num1 <= 50 AND 10 <= num2 <= 50
How to express it in C++?
Conditions
if ( logical expression )
statement;
The value of a logical expression is either true or false.
The bool data type: true or false
int x = 6, y = 5;
bool result;
result = ( x == y );
result = ( x != y );
result = ( x >= 7 );
Comparison Operators
==
!=
>
>=
<
<=
No Space between!
16
A common mistake
int num;
cin >> num ;
if ( num = 10 )
cout << “num equals 10” << endl;
else
cout << “num doesn’t equals 10” << endl;
num = 10 is an assignment statement
num == 10 is a Boolean expression
conditions can only be Boolean expressions!
Comparison Operators
!=
!>
// NO!
<=
// Yes!
≤
// NO!
<=
// Yes!
18
Compare characters
Expression
‘M’ < ‘R’
'M' < 'm'
't' < 'm'
'a' >= '9'
'a' >= 9
'0' < 9
Comparing the ASCII codes!
Result
true
true
false
true
true
false
Compare strings
You can compare
two string variables
a string variable and a string literal
You CANNOT compare two string literals!
==: two strings are exactly the same
>,>=,<,<=: character by character check
Compare strings
string myName = “Yan”;
string herName = “Margaret”;
string hisName = “Kyle”;
Expression
myName < herName
myName == "Yan"
hisName > "Kevin"
"Zack" > "Kevin"
herName >= "Margareta"
myName < "Zack" + hisName
Result
false
true
true
ERROR
false
true
Logical (Boolean) operators
AND
OR
NOT
&&
||
!
logical operators are used to connect multiple
conditions into one compound condition.
the operands MUST be of bool data type!
precedence: ! > && > ||
Truth Table
cond1
cond2
cond1 && cond2
cond1 || cond2
! cond1
T
T
T
T
F
F
F
F
F
T
T
F
F
T
F
F
T
F
T
T
Short-circuit evaluation
Evaluation proceeds from left to right
Evaluation stops as soon as the computer knows the
value of the whole expression.
AND: if a sub-expression is false
OR:
if a sub-expression is true
Example:
10 * 2 - 5 > 0 ||
5 / 0 == 1
10 * 2 - 5 < 0 && 5 / 0 == 1
10 * 2 - 5 > 0 || !5
true
false
ERROR
Operator Precedence
()
!, Unary +, Unary –
*, /, %
+, <, <=, >, >=
==, !=
&&
||
=
De Morgans's Laws
! ( cond1 && cond2 ) == ! cond1 || ! cond2
! ( cond1 || cond2 )
== ! cond1 && ! cond2
Exercise
char a = 'a', b = 'b';
string myName = "Yan";
int num1 = 3, num2 = 5;
Expression
!(a == b)
!(a == b || a >= 97)
! a != b
myName.length()<num1 && myName == "Yan"
num1 >= num2 && a != b
a && b
Result
true
false
ERROR
false
false
ERROR
Example: MAX of three numbers
int num1, num2, num3, max;
cin >> num1 >> num2 >> num3;
if ( num1 > num2 )
if ( num1 > num3 )
max = num1;
else
max = num3;
else
if ( num2 > num3 )
max = num2;
else
max = num3;
if ( num1 > num2 && num1 > num3 )
max = num1;
else if ( num2 > num3 )
max = num2;
else
max = num3;
cout << “The max value is ” << max << endl;
Examples: input range check
check whether the 2 integer inputs are both in the
range [10, 50].
int num1, num2;
cin >> num1 >> num2;
if ( num1 >= 10 && num1 <= 50 && num2 >= 10 && num2 <= 50 )
cout << "Both inputs are in the range [10, 50]. " << endl;
else
cout << "One or more inputs are out of range. " << endl;
Examples: input range check (2)
check whether at least one of the 2 integer inputs is in
the range [10, 50].
int num1, num2;
cin >> num1 >> num2;
Do we need braces?
if ( ( num1 >= 10 && num1 <= 50 ) || ( num2 >= 10 && num2 <= 50 ) )
cout << “One or more inputs are in the range [10, 50]. " << endl;
else
cout << “Both inputs are out of range. " << endl;
Examples: input range check (3)
check input range: 2 integer inputs
are they both positive?
are they both negative?
are they one positive and one negative?
print out the answers to all three questions in the
same order.
How will you design the program?
rangeCheck3.cpp
More Examples
couponCalc.cpp
compute the total charge after applying coupon code
decisionTree.cpp
get the result of a psychological test given the answers to a sequence
of questions
1
Y
N
2
2
3
4
A
3
4
C
D
4
C
3
4
4
3
4
4
A
C
C D B
B A C D
C
A
after class exercise:
try to combine conditions to compound conditions
4
B
Summary
IF
IF-ELSE
Nested IF-ELSE
The dangling else
Conditions
Comparison operators
Logical operators
Short-circuit evaluation
IF-ELSE IF-ELSE
After Class Exercise
write a program to find out whether the input is an odd or
even number.
write a program to check if the input name belongs to a
given list of names {Alex King, Alice Wonderland, John
Smith}.
C++ Style Check List
Comment Block!
Constants should be before main().
Do not indent constants!
Magic Number! (any number besides -1, 0, and 1)
Braces on separate lines!
Brace alignment!
Line should not be too long (<=74 characters).
Alignment of multi-line statements!
Indentation!
Space before and after operator!
No blank line before/after else!
No blank line before/after brace!