290 likes | 348 Views
Chapter 5. Decisions. Figure 1 A Decision. if statement. if( condition ) statement if (amount <= balance) balance = balance - amount; statement block: if(amount <= balance) { double newBalance = balance - amount; balance = newBalance }. Figure 2 Alternative Conditions.
E N D
Chapter 5 Decisions
Figure 1 A Decision
if statement • if(condition)statement • if (amount <= balance) balance = balance - amount; • statement block:if(amount <= balance){ double newBalance = balance - amount; balance = newBalance}
Figure 2 Alternative Conditions
if/else statement • if(condition)statementelse statement • if (amount <= balance) balance = balance - amount;else balance = balance - OVERDRAFT_PENALTY;
Relational operators • < > like in math • <= >= correspond to £ ³ • == != correspond to = ¹ • == is not the same as =:if (x == 5) . . .x = 5;
Comparing floating-point numbers • Roundoff errors:double r = Math.sqrt(2)r * r is 2.0000000000000004, not 2r * r == 2 is false • Test if x and y are close enough:|x - y| £ e, e a small value (e.g. 10-14.) • Not good enough for very small or large values. Use |x - y| £ e max(|x|, |y|)
String comparison • Don't use == for strings!if (input == "Y") // WRONG!!! • Use equals method:if (input.equals("Y")) • == tests identity, equals tests equal contents • Case insensitive test ("Y" or "y")if (input.equalsIgnoreCase ("Y"))
Comparing Objects • == tests for identity, equals for identical content • Rectangle a = new Rectangle(5, 10, 20, 30);Rectangle b = new Rectangle(5, 10, 20, 30); • a != b, but a.equals(b) • Caveat: equals must be defined for the class (see chapter 9)
Figure 4 Comparing Objects
Lexicographic Comparison • s.compareTo(t) < 0 means: s comes before t in the dictionary • "car"comes before "cargo" comes before x"cathode". • All uppercase letters come before lowercase: "Hello" comes before "car"
Figure 3 Lexicographic Comparison
Multiple alternatives • if (condition1)statement1;else if (condition2)statement2;else if (condition3)statement3;elsestatement4; • The first matching condition is executed.Order matters.
Program Richter.java public class Richter { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.println ("Enter a magnitude on the Richter scale:"); double magnitude = console.readDouble(); Earthquake quake = new Earthquake(magnitude); System.out.println(quake.getDescription()); } } class Earthquake { public Earthquake(double magnitude) { richter = magnitude; }
public String getDescription() { String r; if (richter >= 8.0) r = "Most structures fall"; else if (richter >= 7.0) r = "Many buildings destroyed"; else if (richter >= 6.0) r = "Many buildings considerably damaged, some collapse"; else if (richter >= 4.5) r = "Damage to poorly constructed buildings"; else if (richter >= 3.5) r = "Felt by many people, no destruction"; else if (richter >= 0) r = "Generally not felt by people"; else r = "Negative numbers are not valid"; return r; } private double richter; }
Nested branches • if (condition1){ if (condition1a)statement1a; elsestatement1b;}
Figure 7 Income Tax Computation
Program Tax.java public class Tax { public static void main(String[] args) { ConsoleReader console = new ConsoleReader(System.in); System.out.println("Please enter your income:"); double income = console.readDouble(); System.out.println("Please enter S for single, " + "M for married:"); String status = console.readLine(); TaxReturn aTaxReturn = new TaxReturn(income, status); System.out.println("The tax is " + aTaxReturn.getTax()); } }
class TaxReturn { public TaxReturn(double anIncome, String aStatus) { income = anIncome; status = aStatus; } public double getTax() { double tax = 0; final double RATE1 = 0.15; final double RATE2 = 0.28; final double RATE3 = 0.31; final double SINGLE_CUTOFF1 = 21450; final double SINGLE_CUTOFF2 = 51900;
final double SINGLE_BASE2 = 3217.50; final double SINGLE_BASE3 = 11743.50; final double MARRIED_CUTOFF1 = 35800; final double MARRIED_CUTOFF2 = 86500; final double MARRIED_BASE2 = 5370; final double MARRIED_BASE3 = 19566; if (status.equalsIgnoreCase("S")) { if (income <= SINGLE_CUTOFF1) tax = RATE1 * income; else if (income <= SINGLE_CUTOFF2) tax = SINGLE_BASE2 + RATE2 * (income - SINGLE_CUTOFF1); else tax = SINGLE_BASE3 + RATE3 * (income - SINGLE_CUTOFF2); }
else { if (income <= MARRIED_CUTOFF1) tax = RATE1 * income; else if (income <= MARRIED_CUTOFF2) tax = MARRIED_BASE2 + RATE2 * (income - MARRIED_CUTOFF1); else tax = MARRIED_BASE3 + RATE3 * (income - MARRIED_CUTOFF2); } return tax; } private double income; private String status; }
The boolean type • George Boole (1815-1864): pioneer in the study of logic • value of expression x < 10 is true or false. • boolean type: one of these 2 truth values • equals method has return type xboolean
Boolean operators • && and|| or! not • if (tday == bday && tmonth == bmonth)... • if (tmonth == 4 || tmonth == 6 || tmonth == 9 || tmonth == 11)... • if (tmonth > bmonth || (tmonth == bmonth && tday > bday))...
Figure 8 Flowcharts for && and || Combinations
Truth tables • A B A&&Btrue true truetrue false falsefalse any false • A B A||Btrue any truefalse true truefalse false false • A !Atrue falsefalse true
De Morgan's Law • !(A && B)x is the same as !A || !B • !(A || B)x is the same as !A && !B • if (!(country.equals("USA") && !state.equals("AK) && !state.equals("HI")))... • if (!country.equals("USA") ||!!state.equals("AK) ||!!state.equals("HI"))...
Boolean Variables • boolean shipByAir = false;if (!country.equals("USA")) shipByAir = true;else if (state.equals("AK") || state.equals("HI")) shipByAir = true;if (shipByAir) ... else ... • Boolean variables are sometimes called flags
Boolean do's and don'ts • don't: if (shipByAir == true)...if (shipByAir != false)... • do:if (shipByAir)... • don't:if (balance < 0) return true; else return false; • do:return balance < 0;
Useful tips • Brace layout • Indentation and tabs • Copy and paste • Prepare test cases • Make a schedule