Chapter 5

advertisement
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!
Download