Making Decisions Chapter 5 Thus far we have created classes and performed basic mathematical operations Consider our ComputeArea.java program to calculate the area of a circle given a specific radius: Area = π r2 If the radius is negative, we don't want the program to compute the area. How can you deal with this situation? Often in a program you need to compare two values, such as whether i is greater than j. Java provides six comparison operators (also known as relational operators) that can be used to compare two values. The result of the comparison is a Boolean value: true or false. boolean b = (1 > 2); Operator Name < less than <= less than or equal to > greater than >= greater than or equal to == equal to != not equal to Note that Java uses two equal signs (==) to perform equality testing: A single equal sign (=) is used only for assignment Specify a condition If condition is true one or more statements execute If condition is false these statements skipped Syntax if (condition) statement statement executes only if condition is true if statement Simplest statement to make decision Boolean expression appears within parentheses Space between keyword if and opening parentheses Execution always continues to next independent statement Use double equal sign (==) to determine equivalency if (radius >= 0) area = radius * radius * Math.PI; When if statement requires multiple statements to execute Enclose those multiple statements within braces { } after if (condition) if (radius >= 0) { area = radius * radius * Math.PI; System.out.println("The area" + " for the circle of radius " + radius + " is " + area); } When you wish to do one thing if the condition is true But you want to do something else when the condition is false Syntax if (condition) statement 1 else statement 2 Statement 1 executes only if condition is true Statement 2 executes only if condition is false Single-alternative if Only perform action, or not Dual-alternative if Based on one alternative Two possible courses of action if...else statement Performs one action when Boolean expression evaluates true Performs different action when Boolean expression evaluates false true Statement(s) for the true case Boolean Expression false Statement(s) for the false case if (radius >= 0) { area = radius * radius * Math.PI; System.out.println("The area for the " + "circle of radius " + radius + " is " + area); } else { System.out.println("Negative input"); } Nested if statements Statements in which if structure is contained inside of another if structure Use when two conditions must be met before some action is taken Pay careful attention to placement of else clauses else statements Always associated with if on “first in-last out” basis Grade Distribution Checks for grade “A” first If it is not an “A”, then checks for “B” If it is not a “B”, then checks for “C” If it is not a “C”, then checks for “D” Otherwise it is an “F” if (score >= 90.0) grade = 'A'; else if (score >= 80.0) grade = 'B'; else if (score >= 70.0) grade = 'C'; else if (score >= 60.0) grade = 'D'; else grade = ‘F'; if (score >= 90.0) grade = 'A'; else if (score >= 80.0) grade = 'B'; else if (score >= 70.0) grade = 'C'; else if (score >= 60.0) grade = 'D'; else grade = ‘F'; if (score >= 90.0) grade = 'A'; else if (score >= 80.0) grade = 'B'; else if (score >= 70.0) grade = 'C'; else if (score >= 60.0) grade = 'D'; else grade = ‘F'; Suppose score is 72.5 if (score >= 90.0) grade = 'A'; else if (score >= 80.0) grade = 'B'; else if (score >= 70.0) grade = 'C'; else if (score >= 60.0) grade = 'D'; else grade = ‘F'; The condition is false The condition is false The condition is true Grade is C Exit the if statement Adding a semicolon at the end of an if clause is a common mistake. Don’t do it if (radius >= 0) ; The semicolon will prematurely end the decision This mistake is hard to find, because it is not a compilation error or a runtime error, it is a logic error Write a program to see if a user input can correctly guess a number from 1 to 10 if (guess == number) System.out.println("You win"); else System.out.println("You lose"); import java.util.Scanner; class GuessingGame { public static void main(String[ ] args) { System.out.print("Enter an integer from 1 to 10: "); Scanner input = new Scanner(System.in); int guess = input.nextInt(); int number = ((int)(Math.random() * 10) % 10 +1); if (guess == number) System.out.println("* You Win! *"); else System.out.println("* You lose *"); System.out.println("The number was " + number); } } Logical AND operator Alternative to some nested if statements Used between two Boolean expressions to determine whether both are true Written as two ampersands (&&) Include complete Boolean expression on each side Both Boolean expressions that surround operator Must be true before action in statement can occur Logical OR operator Action to occur when at least one of two conditions is true Written as || Sometimes called pipes Suppose we would like to determine if it is a leap year Leap year follows the logic: Year is divisible by 4 but not by 100 Or it is divisible by 400 (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); if (score >= 90.0) grade = 'A'; else if (score >= 80.0) grade = 'B'; else if (score >= 70.0) grade = 'C'; else if (score >= 60.0) grade = 'D'; else grade = ‘F'; if (score >= 90.0) grade = 'A'; if (score >= 80.0 && score < 90.0) grade = 'B'; if (score >= 70.0 && score < 80.0) grade = 'C'; if (score >= 60.0 && score < 70.0) grade = 'D'; if (score < 60.0) grade = ‘F'; The switch statement is the only other kind of Java statement that implements multiway branching When a switch statement is evaluated, one of a number of different branches is executed The choice of which branch to execute is determined by a controlling expression enclosed in parentheses after the keyword switch The controlling expression must evaluate to a char, int, short, or byte The keyword break is optional, but it should be used at the end of each case in order to terminate the remainder of the switch statement. If the break statement is not present, the next case statement will be executed. ... switch (Controlling_Expression) { case (Boolean Expression 1): Statement 1 break; case (Boolean Expression 2): Statement 2 break; case (Boolean Expression n): Statement n break; default: Default Statement break; } The default case, which is optional, can be used to perform actions when none of the specified cases matches the switchexpression. int num = 1; switch (num) { case 1: System.out.println("You picked checking account"); break; case 2: System.out.println("You picked savings account"); break; default: System.out.println("That was an invalid entry."); }; Why use switch statements? Convenient when several alternative courses of action depend on single integer or character variable Use only when there are reasonable number of specific matching values to be tested Combine as many AND or OR operators as needed Operator’s precedence How expression is evaluated Order agrees with common algebraic usage Arithmetic done first Assignment done last AND operator evaluated before OR operator Statements in parentheses evaluated first