selection structures in c (ii) h&k chapter 4

Post on 24-Feb-2016

45 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Selection structures in C (II) H&K Chapter 4. Instructor – Gokcen Cilingir Cpt S 121 (June 30 , 2011) Washington State University. You try it!. What will be the output of the code below? int x = 0; if (x = 3) printf (“x is %d\n”, x); else printf (“x is %d\n”, x);. You try it!. - PowerPoint PPT Presentation

TRANSCRIPT

Selection structures in C (II)H&K Chapter 4

Instructor – Gokcen CilingirCpt S 121 (June 30, 2011)

Washington State University

You try it! What will be the output of the code

below?int x = 0;if (x = 3) printf(“x is %d\n”, x);

else

printf(“x is %d\n”, x);

You try it! Explain the difference between the statements on the

left and the statements on the right. What will x be in each situation given that its initial value was 1?

if (x >= 0)x = x + 1;

else if (x >= 1)x = x + 2;

if (x >= 0)x = x + 1;

if (x >= 1)x = x + 2;

4C. Hundhausen, A.

O’Fallon

Nested if statements (1) Consider the following scenario:

A high school baseball team awards merit points to players based on their offensive performance. A single (encoded 's') is worth 1 point, a double (encoded 'd') is worth 2 points, a triple (encoded 't') is worth 3 points, and a home run (encoded 'h') is worth 4 points. Any at-bat that leads to an out (encoded 'o') worth 0 points. Write a C statement that, given an at-bat character, properly awards points.

5C. Hundhausen, A.

O’Fallon

Nested if statements (2) We can write a nested if statement to handle this situation:char at_bat;int points;printf("Enter the at-bat code (s,d,t,h,o): ");scanf(" %c",&at_bat);if (at_bat == 's') /* single */{

points = 1;} else if (at_bat == 'd') /* double */{

points = 2;} else if (at_bat == 't') /* triple */{

points = 3;} else if (at_bat == 'h') /* home run */{

points = 4;} else /* out */{

points = 0; }

6C. Hundhausen, A.

O’Fallon

Nested if statements (3) Consider the following updated scenario:

A high school baseball team awards merit points to players based on their offensive performance and the class standing ('f' = freshman, 'o' = sophomore, 'j' = junior, and 's' = senior). In particular, freshmen and sophomores earn an extra point for home runs, whereas juniors and seniors do not earn any points for singles. Write a C if-statement that, given an at-bat character and a class standing character, properly awards points.

7C. Hundhausen, A.

O’Fallon

Nested if statements (4) We can write an even more nested if statements to handle this situation:char at_bat, class_standing;int points;...if (at_bat == 's') /* single */{

if (class_standing == 'f') || (class_standing == 'o')points = 1;else points = 0;

} else if (at_bat == 'd') /* double */{

points = 2;} else if (at_bat == 't') /* triple */{

points = 3;} else if (at_bat == 'h') /* home run */{

if (class_standing == 'j') || (class_standing == 's') points = 4;else points = 5;

} else /* out */{

points = 0;}

8C. Hundhausen, A.

O’Fallon

Nested if statements (3) Nested if statements vs.

compound conditionals◦ Consider the following scenario:

The National Weather Service would like to identify hourly weather reports in which the relative humidity is low (below 20%, the temperature is pleasant (between 75 and 85), and the winds are calm (0 to 10 m.p.h.). Assuming that the variables humidity, temp, and wind_speed hold those values, write an if statement that prints out a message when the conditions are met.

9C. Hundhausen, A.

O’Fallon

Nested if statements (4) Nested if statements vs.

compound conditionals (cont.)◦ Alternative 1: Nested if

if (humidity < 20)

if (temp >= 75) if (temp <= 85) if (wind_speed <= 10) printf("Perfect conditions!\n");

◦ Alternative 2: Compound if conditionalif ((humidity < 20) && (temp >= 75) && (temp <= 85) && (wind_speed <= 10))

printf("Perfect conditions!\n");

‘Dangling else’ problemTo which if statement does the

else belong to?if(y != 0 )

if (x != 0)result = x/y;

elseprintf(“Error: y is equal to 0\n”);

11C. Hundhausen, A.

O’Fallon

Nested if statements (5) Important to note that the C compiler

always matches an else with the most recent incomplete if◦ Example:

if (humidity < 20) if (temp <= 32) printf("It's a cool, dry day.") if (wind < 10) printf("Luckily, the winds are calm."); else printf("The humidity is low, it's above freezing."); else if (humidity < 60) if (temp <= 32) printf("It's cold, with moderate humidity."); else printf("It's above freezing, with moderate humidity.");

◦ Do you see a problem here? How would you fix it?

12C. Hundhausen, A.

O’Fallon

Nested if statements (6) Guidelines for using nested if statements

◦ Use braces to enclose all if branches, even if they contain only one statement This will help you avoid the problem of mismatching if and else branches

◦ If possible, structure conditions so each alternative falls on false branch of previous condition (else if…)

◦ If each if branch contains a return statement, there's no need for an else clause, and you can avoid deep nesting

◦ In conditionals, don't mistake = for == The C compiler won't be able to catch this error, and

you're condition will always evaluate to true!

13C. Hundhausen, A.

O’Fallon

Nested if statements (7) Example: Nested if with return

statementsint get_points(char at_bat) { if (at_bat == 's') /* single */

return 1; /* assertion: at_bat != 's' */ if (at_bat == 'd') /* double */ return 2; /* assertion: at_bat != 's' && at_bat != 'd' */ if (at_bat == 't') /* triple */ return 3; /* assertion: at_bat != 's' && at_bat != 'd' && at_bat != 't' */ if (at_bat == 'h') /* home run */ return 4; /* assertion: at_bat != 's' && at_bat != 'd' && at_bat != 't' && at_bat != 'h' */

return 0; /* out */}

14C. Hundhausen, A.

O’Fallon

switch Statements (1) One issue with nested if statements

is readability◦ The deeper the nesting, the more

difficult it can be to figure out what's happening

Another issue is that the programmer could mistakenly "mis-nest" if statements, as in the previous example

In cases in which the nesting is based on the value of a single variable, a switch statement may be a better alternative

15C. Hundhausen, A.

O’Fallon

switch Statements (2) Let's revisit the previous baseball scenario:

A high school baseball team awards merit points to players based on their offensive performance. A single (encoded 's') is worth 1 point, a double (encoded 'd') is worth 2 points, a triple (encoded 't') is worth 3 points, and a home run (encoded 'h') is worth 4 points. Any at-bat that leads to an out (encoded 'o') worth 0 points. Write a C statement that, given an at-bat character, properly awards points.

16C. Hundhausen, A.

O’Fallon

switch Statements (3) The switch statement provides a cleaner way to handle this scenario:

char at_bat;int points;points = 0;printf("Enter the at-bat code (s,d,t,h,o): ");scanf(" %c",&at_bat);

switch (at_bat) {

case 's': /* single */points = points + 1;

break;case 'd': /* double */points = points + 2;

break; case 't': /* triple */

points = points + 3; break; case 'h': /* home run */

points = points + 4;break;case 'o':points = points + 0;break;default: /* Anything but 's','d','t','h', 'o' */

printf("Unrecognized at-bat code.");break;

}

Don't forget to end each case with break

Don't forget the begin and end curly braces

If at_bat does not match any other case labels, the default case is executed

17C. Hundhausen, A.

O’Fallon

switch Statements (4) What if we also want to allow capital letter codes?

switch (at_bat) {

case 's': /* single */case 'S':points = points + 1;break;case 'd': /* double */case 'D':points = points + 2;break;case 't': /* triple */case 'T':points = points + 3;break;case 'h': /* home run */case 'H':points = points + 4;break;case 'o':case 'O':points = points + 0;break;default: /* Anything but 's','d','t','h' */printf("Unrecognized at-bat code.");break;

}

A single case can contain an arbitrary number of

case labels

18C. Hundhausen, A.

O’Fallon

switch Statements (5) Let's revisit the following scenario:

A high school baseball team awards merit points to players based on their offensive performance and the class standing ('f' = freshman, 'o' = sophomore, 'j' = junior, and 's' = senior). In particular, freshmen and sophomores earn an extra point for home runs, whereas juniors and seniors do not earn any points for singles. Write a C if-statement that, given an at-bat character and a class standing character, properly awards points.

19C. Hundhausen, A.

O’Fallon

switch Statements (6) We can write this more clearly as a switch statement with embedded if statements :

switch (at_bat) {

case 's': /* single */if (class_standing == 'f') || (class_standing == 'o') points = 1; break;case 'd': /* double */points = 2;break;case 't': /* triple */points = 3;break;case 'h': /* home run */if ((class_standing == 'f') || (class_standing == 'o')) points = 5;else points = 4;

break;case 'o':points = 0;

break;default: /* Anything but 's','d','t','h' */printf("Unrecognized at-bat code.");break;

}

20C. Hundhausen, A.

O’Fallon

switch Statements (7) Notes on switch statements

◦ You can only switch based on a value of char or int. You cannot switch based on the value of a double.

double era = 1.67; switch (era) { … /* can't do this */

An arbitrary number of statements can follow a case label It's a good idea always to define a default case A common mistake is to forget to end a case with break. If a break is forgotten, execution "falls" through to the next case label! (C can be cruel.)

21

ReferencesJ.R. Hanly & E.B. Koffman,

Problem Solving and Program Design in C (6th Ed.), Addison-Wesley, 2010

P.J. Deitel & H.M. Deitel, C How to Program (5th Ed.), Pearson Education , Inc., 2007.

top related