decisions cs 21a: introduction to computing i department of information systems and computer science...
TRANSCRIPT
DecisionsCS 21a: Introduction to Computing IDepartment of Information Systems
and Computer ScienceAteneo de Manila University
(Chapter 5, Horstmann* text)
*Some slides taken from Horstmann’s notes
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 2
Conditional Execution Sometimes we want a statement
executed only when a condition is met Java structures for conditions
The if-statement boolean variables, operators, expressions,
and methods The ? Operator The switch-statement
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 3
The if-statement
Syntaxif (condition) statement
Notes parentheses are required around the
condition statement means any valid statement in
Java (including if-statements and blocks)
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 4
Example 1public class BankAccount{ private double balance; ... public void withdraw( double amount ) { if ( amount <= balance ) balance = balance - amount; System.out.println( “End of Transaction” ); // print statement executed unconditionally } ...}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 5
Example 2public class BankAccount{ private double balance; ... public void withdraw( double amount ) { if ( amount <= balance ) balance = balance - amount; if ( amount > balance )
balance = balance – OVERDRAFT_PENALTY; } ...}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 6
The optional else clause
If-statement syntax revisitedif (condition) statementelse statement
Use whenever an alternative statement should be executed when the condition is not met
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 7
Example 2, revised;Using the else
public class BankAccount{ private double balance; ... public void withdraw( double amount ) { if ( amount <= balance ) balance = balance - amount; else
balance = balance – OVERDRAFT_PENALTY; } ...}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 8
Example 3
public class BankAccount{ private double balance; ... public void withdraw( double amount ) { if ( amount <= balance ) balance = balance - amount; else System.out.println( “Insufficient Balance” ); System.out.println( “End of Transaction” ); } ...}
No penalty is appliedbut an error messageis printed when thecondition is not met
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 9
Example 4
Suppose two statements need to be conditionally executed
Incorrect attemptif ( amount <= balance )
balance = balance - amount;
System.out.println(“amount deducted”);
Print statement will be executed unconditionally
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 10
Block of Statements A block allows us to group several
statements into one place the statements in sequence and surround
them with { } Correct code
if ( amount <= balance )
{
balance = balance - amount;
System.out.println(“amount deducted”);
}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 11
Brace layout, White spaces and Indentation
In Java, spaces, tabs, and extra lines don’t affect the meaning of the program
A program could be written in diff ways; e.g., all in one line such that each word/symbol is in one line such that words/symbols are separated by 5
spaces each BUT … Spaces (indentation) help to clarify
intent
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 12
Brace layoutif (amount <= balance){double newBalance = balance – amount;balance = newBalance;
}OR
if (amount <= balance) {double newBalance = balance – amount;balance = newBalance;
}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 13
Indentation and tabspublic class BankAccount{ private int balance; ... public void withdraw( int amount ) { if ( amount <= balance )` balance = balance - amount; else
balance = balance – OVERDRAFT_PENALTY; } ...}
Two to three spaces per indentation
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 14
Indentation and tabs public class BankAccount{ private int balance; ... public void withdraw( int amount )
{ if ( amount <= balance ) balance = balance - amount; else
balance = balance – OVERDRAFT_PENALTY; } ...}
Eight spaces per indentation
You can use the space bar or the tab key to indent your code
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 15
Relational Operators
Compares two (usually numeric) operands >, >=, <, <=, == (equal), != (not equal) Example: >=
binary operation returns a boolean result
true if left operand is greater than or equal to right operand
false otherwise
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 16
Comparing floating-point numbers
Consider this code:double r = Math.sqrt(2); double d = r * r - 2; if (d == 0) System.out.println( "sqrt(2)squared minus 2 is 0" );
else System.out.println(
"sqrt(2)squared minus 2 is not 0 but " + d );
It prints:sqrt(2)squared minus 2 is not 0but 4.440892098500626E-16
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 17
Comparing floating-point numbers
To avoid roundoff errors, don't use == to compare floating-point numbers
To compare floating-point numbers, test whether they are close enough: |x - y| ≤ ε final double EPSILON = 1E-14;
if (Math.abs(x - y) <= EPSILON)
// x is approximately equal to y
ε is a small number such as 10-14
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 18
Comparing strings Don't use == for strings! if (input == "Y") // WRONG!!!
Use equals method: if (input.equals("Y"))
== tests identity, equals() tests forequal contents
Case insensitive test ("Y" or "y") if (input.equalsIgnoreCase("Y"))
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 19
Comparing strings (cont.)
s.compareTo(t) < 0 means:s comes before t in the dictionary
"car" comes before "cargo" All uppercase letters come before
lowercase: "Hello" comes before "car"
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 20
Lexicographic comparison
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 21
Comparing objects Since object variables contain references,
== tests for identity,not for identical object content
BankAccount b = new BankAccount( 1000 );BankAccount c = new BankAccount( 1000 );
Object references are not the same b != c
But contents are equal b.getBalance() == c.getBalance()
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 22
null reference refers means no object String middleInitial = null; // Not set if ( . . . ) middleInitial = middleName.substring(0, 1);
Can be used in tests: if (middleInitial == null) System.out.println(firstName + " " + lastName); else System.out.println(firstName + " " + middleInitial + ". " + lastName);
Use ==, not equals(), to test for null Note that null is not the same as the empty string
""
Testing for null
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 23
Sequences of comparisons
if (condition1) statement1; else if (condition2) statement2; . . . else statementn;
-The statementthat correspondsto the first matching conditionis executed-Also called anif-else chain
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 24
Example 5if ( score >= 92 )
System.out.println( “A” );
else if ( score >= 80 )
System.out.println( “B” );
else if ( score >= 70 )
System.out.println( “C” );
else if ( score >= 60 )
System.out.println( “D” );
else
System.out.println( “F” );
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 25
About the if-else chain Order matters
if (score >= 60) System.out.println( “D” );else if (score >= 70) System.out.println( “C” );…// most students will get D’s
See richter’s scale example in the textbook for another if-else chain
The if-else chain is an example of a nested branch
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 26
Nested branches
Branch inside another branchif (condition0) if (condition1) statement1a; else statement1b; else statement2;
else portion couldalso contain anested branch; e.g., if (condition2) statement2a; else statement2b;
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 27
Example 6
Movie ticket price example Premium movie (first week of release):
P120 Regular movie (second week of release or
later): P100 Senior citizen discount: 20%
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 28
Example 6public double TicketPrice( int customerAge, int daysShowing ){
double cost;
if (customerAge >= 60)if ( daysShowing < 8 ) cost = 100.0 * 0.80;
else cost = 120.0 * 0.80;
elseif ( daysShowing < 8 ) cost = 100.0;
else cost = 120.0;
return cost; }
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 29
The boolean Data Type
Only two possible values true and false
Literals true, false lowercase (reserved words in Java)
Operations relational operators logical operators
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 30
Logical Operators
Boolean operands && (and), || (or), ! (unary not) Example
((x>=0) && (x<=9))
Truth table depicts semantics of the operation similar to a multiplication/addition table
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 31
! (NOT)
Unary operation Returns a boolean result
true when the operand is false false when the operand is true
Example alternative to != (a != 5) same as (!(a == 5))
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 32
&& (AND) Returns a boolean result
true whenever both operands are true
false otherwise Example:
testing whether a number is between 0 and 9
if ((num >= 0) && (num <= 9)) ... // inclusive
Truth Table?
A B A && Bfalse falsefalse truetrue falsetrue true
falsefalsefalsetrue
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 33
|| (OR) Returns a boolean result
true when at least one operand is true
false otherwise Example
if ((num % 2 == 0) || (num % 3 == 0)) …
condition will evaluate to true if the number is a even or if it is a multiple of 3
Truth Table?
A B A || Bfalse falsefalse truetrue falsetrue true
falsetruetruetrue
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 34
Short-Circuit Evaluation Sometimes, we know the result of a boolean
expression without checking all the conditions AND (&&): If first condition is false, then result is
false regardless of second condition( x < y ) && ( a < b )
OR (||): If first condition is true, then result is true regardless of second condition
( x < y ) || ( a < b ) Short-circuit evaluation can prevent errors
( x < 0 ) || ( Math.sqrt( x ) > 20 )( x != 0 ) && ( y/x > 20 )
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 35
Boolean Variables
Boolean variables are convenient for long conditions
Exampleboolean withinRange;
…
withinRange = ( num >= 0 ) && ( num <= 9 );
if ( withinRange ) ...
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 36
Methods with boolean return values
Methods can return boolean-type values
Allows you to encapsulate complex conditions, or conditions that depend on the state of an object
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 37
Example 7public class BankAccount
{
...
public static final double MINBAL = 10000;
...
public boolean isBelowMinBalance()
{
if ( balance < MINBAL )
return true;
else
return false;
}...
}
It is common and recommended practice to give boolean-type methods names starting with isXXX
Is there a shorter way to write this?
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 38
Example 7, revised
public class BankAccount
{
...
public static final double MINBAL = 10000;
...
public boolean isBelowMinBalance()
{
return (balance < MINBAL);
}
...
}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 39
Calling a boolean-type method
public class BankSystem
{
public static void main( String args[] )
{
BankAccount b = new BankAccount();
...
boolean below = b.isBelowMinBalance();
if ( below )
System.out.println( “account is below balance” );
else
System.out.println( “account is OK” );
...
}
}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 40
Calling a boolean-type method within the same class
public class BankAccount
{ ...
public void withdraw( double amount )
{
if ( amount <= balance )
{
balance = balance - amount;
if ( isBelowMinBalance() )
balance = balance – 50; // subtract penalty
}
else
System.out.println( “Insufficient Balance” );
} ...
}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 41
Advanced Topics
Dangling Else The ? operator The switch statement
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 42
Dangling Else
if ( num > 10 )
if ( num > 100 )
System.out.println( “Large” );
else
System.out.println( “Small” );
What gets printed out when num = 150? when num = 80? when num = 5?
Which if does the else clause match?
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 43
Dangling Else, continued
Rule in Java: an else clause matches the nearest enclosing if
Use { } to match the outer ifif ( num > 10 ) { if ( num > 100 ) System.out.println( “Large” );}else System.out.println( “Small” );
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 44
The ? operator Syntax: condition ? then-value : else-value Use this as a one-line replacement for if Instead of
String s;if ( x % 2 == 0 ) s = “even”;else s = “odd”;
We can sayString s = (x%2 == 0) ? “even” : “odd”;
Commonly used in C programs Use sparingly, since it can lead to cryptic code
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 45
The if-else chain revisited If the conditions in an if-else chain are exact
comparisons (using ==) on integral (or char) values, consider using a switch statement
Example: print “One” if the value is 1,print “Two” if the value if 2, …
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 46
Example 8 if (num == 1){ System.out.println(“One”);} else if (num == 2){ System.out.println(“Two”);} else if (num == 3){ System.out.println(“Three”);} else{ System.out.println(“Other number”);}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 47
Example 8, revised;using a switchswitch(num) { case 1: System.out.println(“One”); break; case 2: System.out.println(“Two”); break; case 3: System.out.println(“Three”); break; default: System.out.println(“Other number”);}
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 48
The switch statement
Use a switch statement whenever the conditions in an if-else chain are designed to check for
constant values representing a finite number of cases Switch-case statement
switch( exp ) exp must be a “countable” primitive type (i.e., byte, int, char,
etc., but not float or double) CANNOT be a String
case literal serves as “entry-point” label for case when exp==literal
break; statement that causes control to exit the block if there’s no break, control “falls-through” until we see a
break
Copyright 2008, by the authors of these slides, and Ateneo de Manila University. All rights reserved
DecisionsSlide 49
Using (or not using) break
switch( letter ) { case ‘a’: case ‘e’: case ‘i’: case ‘o’: case ‘u’: System.out.println(“Vowel”); break; default: System.out.println(“Consonant”);}