66
Selection Structures: if and switch Statements Chapter 4

Selection Structures: if and switch Statements Chapter 4

Embed Size (px)

Citation preview

Page 1: Selection Structures: if and switch Statements Chapter 4

Selection Structures: if and switch Statements

Chapter 4

Page 2: Selection Structures: if and switch Statements Chapter 4

2

Selection Statements

– In this chapter we study statements that allow alternatives to straight sequential processing. In particular:• if statements (do this only if a condition is

true)• if-else statements (do either this or that)• Logical expressions (evaluate to true or

false)• Boolean operators (not: ! and: && or: ||)

Page 3: Selection Structures: if and switch Statements Chapter 4

3

4.1 Control Structures

– Programs must often anticipate a variety of situations.

– Consider an Automated Teller Machine:• ATMs must serve valid bank customers. They must

also reject invalid PINs.

• The code that controls an ATM must permit these different requests.

• Software developers must implement code that anticipates all possible transactions.

Page 4: Selection Structures: if and switch Statements Chapter 4

4

4.1 Control Structures

Type of control structures– Sequence (compound statements)

{ Statment1; Statement2; …}

– Selection (this chapter)• Choose among several alternatives• Typically decisions are made dynamically

– Repetition

Page 5: Selection Structures: if and switch Statements Chapter 4

5

4.2 Logical Expressions (Conditions)

Declarationint month = 9;Expression is(month > 9) False

(month < 9) False

(month >= 9) True

(month <= 9) True

Page 6: Selection Structures: if and switch Statements Chapter 4

6

Boolean Variables

bool variable Declaration and execution statements

bool leapYear;

leapYear = true; // Non zero return value

leapYear = false; // Zero return value

Page 7: Selection Structures: if and switch Statements Chapter 4

7

Boolean Expressions

Examples (Write T for True, or F for False): int n1 = 55;

int n2 = 75;

n1 < n2 // _____

n1 > n2 // _____

(n1 + 35) > n2 // _____

(n1-n2) < 0.1 // _____

n1 == n2 // _____

Page 8: Selection Structures: if and switch Statements Chapter 4

8

Logical Expressions

– Logical expressions often use these relational operators:

> Greater than < Less than >= Greater than or equal <= Less than pr equal == Equal (Note: it is not the assignment

operator =) != Not equal

Page 9: Selection Structures: if and switch Statements Chapter 4

9

Logical Operators

Logical operator (&& means AND) used in an if...else statement:

( (tryIt >= 0) && (tryIt <= 100) )

Logical operator (| | means OR) used in an if...else statement:

( (tryIt >= 0) | | (tryIt <= 100) )

Page 10: Selection Structures: if and switch Statements Chapter 4

10

Using &&

Assume tryIt = 90, Is tryIt within the range of 0 and 100 ?

( (tryIt >= 0) && (tryIt <= 100) )

( ( 90 >= 0) && ( 90 <= 100) )

( 1 && 1 )

1

Page 11: Selection Structures: if and switch Statements Chapter 4

11

Using &&

Assume tryIt = 99 Is tryIt outside the range of 0 and 100 ?

( (tryIt < 0) ¦¦ (tryIt > 100) )

( ( 99 < 0) ¦¦ ( 99 > 100) )

( 0 ¦¦ 0 )

0

Page 12: Selection Structures: if and switch Statements Chapter 4

12

Truth Tables for Boolean Operators

Truth tables Logical operators !, ¦¦, &&– 1 is a symbol for true– 0 is a symbol for false

Operation Result Operation Result Operation Result! 0! 1

10

1 ¦¦ 11 ¦¦ 00 ¦¦ 10 ¦¦ 0

1110

1 && 11 && 00 && 10 && 0

1000

Page 13: Selection Structures: if and switch Statements Chapter 4

13

Precedence of Operators

Precedence: most operators are evaluated (grouped) in a left-to-right order:– a / b / c / d is equivalent to

(((a/b)/c)/d) Assignment operators group in a right-to-

left order so the expression – x = y = z = 0.0 is equivalent to

(x=(y=(z=0.0)))

Page 14: Selection Structures: if and switch Statements Chapter 4

14

Operator Description GroupingHighest ::

()Scope resolutionFunction call

Left to right

Unary !, +, - Not, unary plus/minus Right to left

Multiplicative * / % Multipy/divide/remainder Left to right

Additive + - Binary plus, minus Left to right

Input/Output >> << Extraction / insertion Left to right

Relational < ><= >=

Less/Greater thanLess/Greater or equal

Left to right

Equality == != Equal, Not equal Left to right

and && Logical and Left to right

or ¦¦ Logical or Left to right

Assignment = Assign expression Right to left

Precedence of Operators

Page 15: Selection Structures: if and switch Statements Chapter 4

15

Precedence of Operators

Examplesbool flag = false;

int a = b = c = 0;!flag || (a+b < c – a)

0+0 < 0-0 0 < 0 false !false || false true || false true Parentheses are sometimes restrictive

Page 16: Selection Structures: if and switch Statements Chapter 4

16

Comparing characters and strings

Characters– Based on their ASCII code (lexicographic)– Examples

‘a’ < ‘c’ true ‘A’ < ‘a’ true ‘7’ < ‘3’ false

Strings– Based on characters – Examples

“XXX” <= “ABCDEF” false (since ‘X’ > ‘A’)“bed” != “beds” true“bed” < “beds” true (prefix)

Page 17: Selection Structures: if and switch Statements Chapter 4

17

Boolean Assignment

bool same, isLetter;

char c

Form:

variable = expression;

Example:

same = (x = = y);

IsLetter = ((‘A’ <= c) && (c <=‘Z’)) ||

((‘a’ <= c) && (c <=‘z’))

Page 18: Selection Structures: if and switch Statements Chapter 4

18

4.3 Introduction to the if Control Statement

– The “if” is the first statement that alters strict sequential control.

– General form: one alternative

if ( logical-expression )

true-part ;

• logical-expression: any expression that evaluates to nonzero (true) or zero (false).

Page 19: Selection Structures: if and switch Statements Chapter 4

19

if Control Statementswith Two Alternatives

– The logical expression is evaluated. When true, the true-part is executed and the false-part is disregarded. When the logical expression is false, the false-part executes.

– General Form: two alternativesif ( logical-expression ) true-part ;else false-part ;

Page 20: Selection Structures: if and switch Statements Chapter 4

20

What happens when an if statement executes?

• After the logical expression of the if statement evaluates, the true-part executes only if the logical expression was true.

gross >100.0

False

net=gross-tax net=gross True

Page 21: Selection Structures: if and switch Statements Chapter 4

21

if statement with Characters and Strings

Example for Character

if(momOrDad == ‘m’)

cout << “Hi mom” << endl; else cout << “Hi Dad” << endl;

Example for Stringspos = myString.find(“aaa”)

if(( 0 <= pos ) && (pos < myString.length()))cout << “aaa found at position ” << pos << endl;

elsecout << “could not finf aaa!” << endl;

Page 22: Selection Structures: if and switch Statements Chapter 4

22

Programming Tip

Using = for == is a common mistake. For example the following statements are legal:

int x = 25;

Because assignment statements evaluate to the

expression on the right of =, x = 1 is always

1, which is nonzero, which is true:

if (x = 1) // should be (x == 1)

Page 23: Selection Structures: if and switch Statements Chapter 4

23

4.4 if Statements with Compound Alternatives

– General form (also known as a block): {

statement-1 ; statement-2 ;

...statement-N ;

} – The compound statement groups together many

statements that are treated as one.

Page 24: Selection Structures: if and switch Statements Chapter 4

24

Writing Compound Statements

if (transactionType == 'c'){ // process check cout << "Check for $" << transactionAmount << endl;

balance = balance - transactionAmount;}else{ // process deposit cout << "Deposit of $" << transactionAmount << endl;

balance = balance + transactionAmount;}

Page 25: Selection Structures: if and switch Statements Chapter 4

25

4.5 Decision Steps in Algorithms

Algorithm steps that select from a choice of actions are called decision steps. The algorithm in the following case contains decisions steps to compute an employee’s gross and net pay after deductions. The decision steps are coded as if statements.

Payroll Case Study

Page 26: Selection Structures: if and switch Statements Chapter 4

26

Decision Steps in Algorithms

Statement:  Your company pays its hourly workers once a week. An employee’s pay is based upon the number of hours worked (to the nearest half hour) and the employee’s hourly pay rate. Weekly hours exceeding 40 are paid at a rate of time and a half. Employees who earn over $100 a week must pay union dues of $15 per week. Write a payroll program that will determine the gross pay and net pay for an employee.

Page 27: Selection Structures: if and switch Statements Chapter 4

27

Decision Steps in Algorithms

Analysis:  

– InputInput data • float hours // Number worked hours

• money rate // hourly pay

– Output data

• money gross // gross pay

• money net // net pay

– Constants

DUES = 15.00 // union dues

MAX_NO_DUES = 100.00 // maximum weekly earnings without dues

MAX_NO_OVERTIME = 40.0 // maximum hours without overtime pay

OVERTIME_RATE = 1.5 // rate for overhours

– We model all data using the money and float data types.

Page 28: Selection Structures: if and switch Statements Chapter 4

28

Decision Steps in Algorithms

Program Design:  The problem solution requires that the program read the hours worked and the hourly rate before performing any computations. After reading these data, we need to compute and then display the gross pay and net pay. The structure chart for this problem (Figure 4.6) shows the decomposition of the original problem into five subproblems. We will write three of the subproblems as functions. For these three subproblems, the corresponding function name appears under its box in the structure chart.

Page 29: Selection Structures: if and switch Statements Chapter 4

29

Decision Steps in Algorithms

– 1. Display user instructions

Function: void instructUser()

Displays the used constants and prompts for input

– 2. Enter hours worked and hourly rate.

– 3. Compute gross pay

Function: float computeGross(float hours, money rate)

If worked hours exceed 40

compute and return overtime pay + regular pay

Else

compute and return hours * rate

– 4. Compute net pay

Function: money computeNet(money gross)

If gross pay is larger than $100

deduct the dues $15 from gross pay

Else

no deduction

– 5. Display gross pay and net pay.

Print instructions

Enter data

Compute gross pay

Compute net pay

Original Problem (stepwise refinement)

Print results

Page 30: Selection Structures: if and switch Statements Chapter 4

30

PayrollFunctions.cpp

// File: payrollFunctions.cpp

// Computes and displays gross pay and net pay

// given an hourly rate and number of hours

// worked. Deducts union dues of $15 if gross

// salary exceeds $100; otherwise, deducts no

// dues.

#include <iostream>

#include "myMoney.h"

Page 31: Selection Structures: if and switch Statements Chapter 4

31

PayrollFunctions.cpp

using namespace std;

// Functions used

void instructUser();

money computeGross(float, money);

money computeNet(money);

//Constants

const money MAX_NO_DUES = 100.00;

const money dues = 15.00;

const float MAX_NO_OVERTIME = 40.0;

const float OVERTIME_RATE = 1.5;

Page 32: Selection Structures: if and switch Statements Chapter 4

32

PayrollFunctions.cpp

int main ()

{

float hours;

float rate;

money gross;

money net;

// Display user instructions.

instructUser();

Page 33: Selection Structures: if and switch Statements Chapter 4

33

PayrollFunctions.cpp

// Enter hours and rate.

cout << "Hours worked: ";

cin >> hours;

cout << "Hourly rate: ";

cin >> rate;

// Compute gross salary.

gross = computeGross(hours, rate);

// Compute net salary.

net = computeNet(gross);

Page 34: Selection Structures: if and switch Statements Chapter 4

34

PayrollFunctions.cpp

// Print gross and net.

cout << "Gross salary is " << gross << endl;

cout << "Net salary is " << net << endl;

return 0;

}

Page 35: Selection Structures: if and switch Statements Chapter 4

35

PayrollFunctions.cpp

// Displays user instructions

void instructUser()

{

cout <<

"This program computes gross and net salary." <<

endl;

cout << "A dues amount of " << dues <<

" is deducted for" << endl;

cout << "an employee who earns more than " <<

MAX_NO_DUES << endl << endl;

cout << "Overtime is paid at the rate of " <<

OVERTIME_RATE << endl;

Page 36: Selection Structures: if and switch Statements Chapter 4

36

PayrollFunctions.cpp

cout <<

"times the regular rate for hours worked over "

<< MAX_NO_OVERTIME << endl << endl;

cout <<

"Enter hours worked and hourly rate" << endl;

cout <<

"on separate lines after the prompts. " << endl;

cout <<

"Press <return> after typing each number." <<

endl << endl;

} // end instructUser

Page 37: Selection Structures: if and switch Statements Chapter 4

37

PayrollFunctions.cpp

// FIND THE GROSS PAY

money computeGross (float hours, money rate)

{

// Local data ...

money gross;

money regularPay;

money overtimePay;

// Compute gross pay.

if (hours > MAX_NO_OVERTIME)

{

regularPay = MAX_NO_OVERTIME * rate;

Page 38: Selection Structures: if and switch Statements Chapter 4

38

PayrollFunctions.cpp

overtimePay = (hours - MAX_NO_OVERTIME) *

OVERTIME_RATE * rate;

gross = regularPay + overtimePay;

}

else

gross = hours * rate;

return gross;

} // end computeGross

Page 39: Selection Structures: if and switch Statements Chapter 4

39

PayrollFunctions.cpp

// Find the net paymoney computeNet (money gross) { money net; // Compute net pay. if (gross > MAX_NO_DUES) net = gross - DUES; else net = gross;

return net;} // end computeNet

Page 40: Selection Structures: if and switch Statements Chapter 4

40

Payroll.cpp

Program outputThis program computes gross and net salary.

A dues amount of $15.00 is deducted for an

employee who earns more than $100.00

Overtime is paid at the rate of 1.5 times the

regular rate on hours worked over 40

Enter hours worked and hourly rate on separate

lines after the prompts. Press <return> after

typing each number.

Page 41: Selection Structures: if and switch Statements Chapter 4

41

Payroll.cpp

Program output

Hours worked: 50

Hourly rate: 6

Gross salary is $330.00

Net salary is $315.00

Page 42: Selection Structures: if and switch Statements Chapter 4

42

4.6 Checking the Correctness of an Algorithm

Verifying the correctness of an algorithm is a critical step in algorithm design and often saves hours of coding and testing time.

We will now trace the execution of the refined algorithm for the payroll problem solved in the last section.

Page 43: Selection Structures: if and switch Statements Chapter 4

43

Checking the Correctness of an Algorithm

1. Display user instructions.

2. Enter hours worked and hourly rate.

3. Compute gross pay.

3.1. If the hours worked exceed 40.0 (max hours before overtime)

3.1.1. Compute regularPay.

3.1.2. Compute overtimePay.

3.1.3. Add regularPay to overtimePay to get gross.

else

Page 44: Selection Structures: if and switch Statements Chapter 4

44

Checking the Correctness of an Algorithm

3.1.4. Compute gross as hours * rate.

4. Compute net pay.

4.1. If gross is larger than $100.00

4.1.1. Deduct the dues of $15.00 from gross pay.

else

4.1.2. Deduct no dues.

5. Display gross and net pay.

Page 45: Selection Structures: if and switch Statements Chapter 4

45

Trace of the Payroll Algorithm

1. Display instructions ? ? ? ? Display

2. Enter data 30 10 Read

3. If hours > 40 False1. Gross gets hours*rate 300 False-Part

4. If gross > 100 True1. Deduct dues 285 Net pay

5. Display results 300 and 285

hours rate gross net Effect

Page 46: Selection Structures: if and switch Statements Chapter 4

46

4.7 Nested if Statements and Multiple Alternative Decisions

– Nested logic is one control structure containing another similar control structure.

– An if...else inside another if...else. e.g. (the 2nd if is placed on the same line as the 1st):

Page 47: Selection Structures: if and switch Statements Chapter 4

47

Example of nested logic

if(x > 0)

numPos = numPos + 1;

else

if(x < 0)

numNeg = NumNeg + 1;

else

numZero = numZero + 1;

3 Alternatives

Second “if” is the false-part of the first one

Page 48: Selection Structures: if and switch Statements Chapter 4

48

Example of nested logic

X numPos numNeg numZero

3.0 _______ _______ _______

-3.6 _______ _______ _______

0 _______ _______ _______

Assume all variables initialized to 0

Page 49: Selection Structures: if and switch Statements Chapter 4

49

Nested if Statements versus Seequence of if Statements

if(x > 0)

numPos = numPos + 1;

if(x < 0)

numNeg = NumNeg + 1;

if (x == 0)

numZero = numZero + 1;

Less readable Less efficient

Page 50: Selection Structures: if and switch Statements Chapter 4

50

Writing a Nested if as a Multiple-Alternative Decision

Nested if statements can become quite complex. If there are more than three alternatives and indentation is not consistent, it may be difficult to determine the logical structure of the if statement.

Page 51: Selection Structures: if and switch Statements Chapter 4

51

Improve readability for complex nested if-statements Form:

if(condition 1)

stat 1;

else if(condition 2)

stat 2;

….

else if(condition N)

stat N;

else

stat N+1;

Multiple-Alternative Decision

Our Example:

if(x > 0)

numPos = numPos + 1;

else if(x < 0)

numNeg = NumNeg + 1;

else

numZero = numZero + 1;

Page 52: Selection Structures: if and switch Statements Chapter 4

52

Function displayGrade

void displayGrade ( int score)

{

if (score >= 90)

cout << "Grade is A " << endl;

else if (score >= 80)

cout << "Grade is B " << endl;

else if (score >= 70)

cout << "Grade is C " << endl;

else if (score >= 60)

cout << "Grade is D " << endl;

else

cout << "Grade is F " << endl;

}

Page 53: Selection Structures: if and switch Statements Chapter 4

53

Order of Conditions

if (score >= 60)

cout << "Grade is D " << endl;

else if (score >= 70)

cout << "Grade is C " << endl;

else if (score >= 80)

cout << "Grade is B " << endl;

else if (score >= 90)

cout << "Grade is A " << endl;

else

cout << "Grade is F " << endl;

Page 54: Selection Structures: if and switch Statements Chapter 4

54

Implementing Decision TablesUsing Nested If Statements

SalaryTax

0.00-14,999.99 15%

15,000.00 to 29,999.99 16%

30,000.00 to 49,999.99 18%

50,000.00 to 79,999.99 20%

80,000.00 to 150,000.00 25%

money computeTax(money salary) {

if(salary < 0.00)

tax = -1;

else if(salary < 15000.00)

tax = 0.15 * salary;

else if(salary < 30000.00)

tax = 0.16 * salary;

else if(salary < 50000.00)

tax = 0.18 * salary;

else if(salary < 80000.00)

tax = 0.20 * salary;

else if(salary < 150000.00)

tax = 0.25 * salary;

else tax = -1;

return tax;

}

Page 55: Selection Structures: if and switch Statements Chapter 4

55

Short Circuit Evaluation

if (single == ‘y’ && gender == ‘m’ && age >= 18) – If single==‘y’ is false, gender and age are not evaluated

if (single == ‘y’ || gender == ‘m’ || age >= 18)– If single==‘y’ is true, gender and age are not evaluated

if (x != 0 && y/x> 18.0)– If x is 0, no division is performed– This avoids a potential run-time error (division by zero)

if (y/x > 18.0 && x != 0)– Reversing the two subexpressions leads to a run-time error!

Short Circuit Evaluation has two main advantages:• It can promote efficiency (not all parts have to be executed)• It may be used to avoid run-time errors

Page 56: Selection Structures: if and switch Statements Chapter 4

56

4.8 The switch Control Statement

If the condition in a nested if statement is based on a single variable, the switch statement can be used instead

Example:

if(momOrDad == ‘m’ || momOrDad == ‘M’)cout << “Hi Mom” << endl;

else if(momOrDad == ‘d’ || momOrDad == ‘D’)cout << “Hi Dad” << endl;

This may transformed to a switch statement, since the condition includes only one variable ‘momOrDad’

Page 57: Selection Structures: if and switch Statements Chapter 4

57

General Form of a switch Control Statement

switch ( switch-expression ) { case value-1 :

statement(s)-1

break ; ... // many cases are allowed

case value-n :

statement(s)-n

break ;

default : default-statement(s) }

Page 58: Selection Structures: if and switch Statements Chapter 4

58

Switch Control

– When a switch statement is encountered, the switch-expression is evaluated. This value is compared to each case value until switch-expression == case value. All statements after the colon ‘:‘ (and before the ‘break’) are executed

– It is important to include the break statement

Page 59: Selection Structures: if and switch Statements Chapter 4

59

Example switch Statement:

switch(momOrDad) {

case ‘m’: case ‘M’:

cout << “Hi Mom” << endl;

break;

case ‘d’: case ‘D’:

cout << “Hi Dad” << endl;

break;

}

No default is useddefault: cout << “invalid input!” << endl;

Page 60: Selection Structures: if and switch Statements Chapter 4

60

Example switch Statement

switch(watts) {

case 25: cout << " Life expectancy is 2500 hours. " << endl;

break; case 40: case 60: cout << " Life expectancy is 1000 hours. " << endl;

break; case 75: case 100:

cout << " Life expectancy is 750 hours. " << endl; break;default:

cout << "Invalid bulb !!" << endl;} // end switch

Page 61: Selection Structures: if and switch Statements Chapter 4

61

Trace the previous switch

– Show output when

• watts = '?' ____________?

• watts = ’40’ ____________?

• watts = ’10'____________?

• watts = ’200' ____________?

• watts = ’100' ____________?

Page 62: Selection Structures: if and switch Statements Chapter 4

62

Remarks to switch Statements

The types float and string are not allowed as labels!

Use switch statements to make your program more readable and not vice versa

For example, if your program tends to include many statements for each case, then pack these statements in different functions in order to promote readability (although sacrificing some efficiency).

Page 63: Selection Structures: if and switch Statements Chapter 4

63

Return vs break

Example:void f(int someVariable) {

switch(someVariable) {case value1: doSomething-1;

return;case value2: doSomething-2;

return;…

} // end switch statement(s); // only executed when break is used

return;} // end function f

return (within the switch) enforces an immediate return to the calling function (e.g. main()). The last statement(s) are NOT executed! If break is used instead, the last statement(s) are executed!

Page 64: Selection Structures: if and switch Statements Chapter 4

64

4.9 Common Programming Errors

Failing to use { and } if(Grade >= 3.5)

// The true-part is the first cout only

cout <<"You receive an A !!!";

cout <<"You made it by " << (Grade-3.5) << " points";

else <<<< Error >>>>

Page 65: Selection Structures: if and switch Statements Chapter 4

65

Common Programming Errors

There are no compile time errors next, but there is an intent error.

else cout << "Sorry, you missed an A. "; cout << "You missed it by " << 3.5-Grade << " points"; With the above false part, you could get this

confusing output (when Grade = 3.9): You received an A !!!. You made it by 0.4 points.You missed it by -0.4 points

Page 66: Selection Structures: if and switch Statements Chapter 4

66

Corrected Version:

if(Grade >= 3.5)

{

cout << "You received an A !!! " << endl;

cout << "You made it by " << (Grade-3.5) << " points";

// Do other things if desired

}

else

{

cout << " You did NOT receive an A !!! ";

cout << "You missed it by " << (3.5-Grade) <<" points";

}