190 likes | 291 Views
Conditional Execution – Sections 4.2, 4.3 , 4.4 and 4.7. Up to now, we have seen that instructions are executed unconditionally one after another. What if you want to execute an instruction depending on a condition? Selection: choose from among many options according to a criteria
E N D
Conditional Execution – Sections 4.2, 4.3, 4.4 and 4.7 • Up to now, we have seen that instructions are executed unconditionally one after another. • What if you want to execute an instruction depending on a condition? • Selection: choose from among many options according to a criteria • E.g. If response is yes do this, else do that • E.g. • If year is a leap year, number of days is 366, else 365 • if else statements
Syntax if (condition) statementtrue; else statementfalse; • If condition is TRUE then statementtrue is executed, if FALSE statementfalse is executed. • else and statementfalse are optional if (condition) statementtrue; • if condition is FALSE then nothing will be executed and execution continues with the next statement in the program
More Syntax • Condition must be in brackets • What happens if you have several statements to execute? • write your statements within curly brackets • book recommends using this all the time even if you have only one statement (defensive programming) if (condition) { ... statementtrue list; ... } else { ... statementfalse list; ... } Definiton Compound block: Statements written within matching curly brackets
Example (not in the book) • Write a program that inputs two integer numbers and displays the minimum one. • Two solutions • using if and else together • using only if (no else)
Solution 1 – with_if_else.cpp int main () { int num1, num2, min; cout << "Enter two numbers: "; cin >> num1 >> num2; if (num1 < num2) //check if first number is smaller than the second one { min = num1; //if so minimum is the first number } else { min = num2; //otherwise minimum is the second number } cout << "minimum of these two numbers is: " << min << endl; return 0; }
Solution 2 – with_if.cpp (no else) int main () { int num1, num2, min; cout << "Enter two numbers: "; cin >> num1 >> num2; min = num1; // default assignment - minimum is the first number if (num2 < min) //check if second number is smaller than the first one { min = num2; //if so update the minimum, if not do nothing } cout << "minimum of these two numbers is: " << min << endl; return 0; }
Boolean type and expressions • The condition in an if statement must be a Boolean expression (named for George Boole) • Values are true and false • bool is a built-in type like int, double int degrees; bool isHot = false; cout << "enter temperature: "; cin >> degrees; if (degrees > 35) { isHot = true; } • Boolean values have numeric equivalents • false is 0, true is any nonzero value if (3*4 –8) cout << "hello"; else cout << "bye"; • prints hello on sreen • boolean output yields 0 (for false) or 1 (for true) cout << (4 < 5); • prints 1 on screen cout << (5 == 7-2+1); • prints 0on screen
Relational Operators • Relational operators are used to compare values: < less than <= less than or equal > greater than >= greater than or equal == equality check != inequality check • They take two operands • operands can be literals, variables or expressions • Used for many types • numeric comparisons • string comparisons (lexicographical, i.e. alphabetical) • boolean comparisons (false is less than true)
Examples • I used literals in the following numeric examples to see the results quickly. You can compare variables as well. 23 >= 45 false 49.0 == 7*7 true 34-3 != 30+1 false • Let’s see some string comparison examples string s1= "elma", s2= "armut", s3= "Elma"; s1 < s2false s3 < s2true • Why s3 < s2 is true? • ‘E’ has a smaller code than ‘a’ • Uppercase letters have smaller codes than lowercase letters
Logical operators • Boolean expressions can be combined using logical operators: AND, OR, NOT • In C++ we use && || ! respectively
Example • Range check: between and including 0 and 100,or not? If so, display a message saying that the number is in the range. If not, the message should say “out of the range”. • Solution 1: using logical AND operator if (num >= 0 && num <= 100) cout << "number in the range"; else cout << "number is out of the range"; • Solution 2: using logical AND and NOT operators if (!(num >= 0 && num <= 100)) cout << "number is out of the range"; else cout << "number is in the range"; • Solution 3: using logical OR operator if (num < 0 || num > 100) cout << "number is out of the range"; else cout << "number is in the range";
De Morgan’s Rules (Section 4.7) • Compare solution 2 and 3 • two conditions are equivalent (!(num >= 0 && num <= 100)) (num < 0 || num > 100) • De Morgan’s Rules (assume a and b are two boolean expressions) ! (a && b) = !a || !b ! (a || b) = !a && !b • De Morgan’a Rules can be generalized to several expressions (e.g. 4 boolean expressions case) ! (a && b && c && d) = !a || !b || !c || !d ! (a || b || c || d) = !a && !b && !c && !d
Operator Precedence - Revisited • Upper operator groups have precedence
Operator Precedence Examples cout << num1 < year; • syntax error (very cryptic) • the problem is that << has precedence over < • does not compile as intended • Solution: cout << (num1 < year); • Advice: use parenthesized expressions in cout • What about (0 <= num <= 100) for range check? • not a syntax error • but that expression does not makea range check. It is always true. Why? • What is the value of !12+5&&32/35 ? • result is 0
Nested if statements • if/else statements are inside other if/else statements • Method to select from multiple choices • Example: input a numeric grade and display messages according to its value 0 .. 50 low 51 .. 70 average 71 .. 100 good otherwise invalid grade • Several solutions exist (we’ll see three) – not in the book • first two solution: ifs are after elses • see if_after_else.cpp and if_after_else2.cpp • third solution: ifs are after ifs • see if_after_if.cpp
Short-circuit Evaluation • Some subexpressions in Boolean expressions are not evaluated if the entire expression’s value is already known using the subexpression evaluated so far • Rule: Evaluate the first (leftmost) boolean subexpression. If its value is sufficient to judge about the value of the entire expression, then stop there. Otherwise continue evaluation towards right. if (count != 0 && scores/count < 60) { cout << "low average" << endl; } • In this example, if the value of count is zero, then first subexpression becomes false and the second one is not evaluated. • In this way, we avoid “division by zero” error (that would cause to crash the execution of the program) • Alternative method to avoid division by zero without using short-circuit evaluation: if (count != 0) { if (scores/count < 60) { cout << "low average warning" << endl; } }
Dangling Else Problem if ( x % 2 == 0) if ( x < 0 ) cout << x << " is an even, negative number" << endl; else cout << x << "is an odd number << endl; • Do the above messages make sense? • The problem is that it displays “odd number” for positive even numbers and zero. • Reason is that, although indentation says the reverse, else belongs to second (inner) if • Solution: use braces (see next slide)
Solution to Dangling Else Problem if ( x % 2 == 0) { if ( x < 0 ) cout << x << " is an even, negative number"<< endl; } else { cout << x << "is an odd number << endl; } • Now else belongs to first if
if – else matching rule • Each else belongs to the nearest if for which there is no else and in the same compound block