Title: Decisions, decisions, decisions
1Decisions, decisions, decisions
- Chapter 5
- Fall 2005
- CS 101
- Aaron Bloomfield
2Background
- Our problem-solving solutions so far have the
straight-line property - They execute the same statements for every run of
the program - public class DisplayForecast
- // main() application entry point
- public static void main(String args)
- System.out.print("I think there is a
world") - System.out.print(" market for maybe five
") - System.out.println("computers. )
- System.out.print(" Thomas Watson, IBM, )
- System.out.println("1943.)
-
3Background
- For general problem solving we need more
capabilities - The ability to control which statements are
executed - The ability to control how often a statement is
executed - We will concentrate first on controlling which
statements are executed - Java provides the if and switch conditional
constructs to control whether a statement list is
executed - The if constructs use logical expressions to
determine their course of action - Examination begins with logical expressions
4Logical expressions
- The branch of mathematics dealing with logical
expressions is Boolean algebra - Developed by the British mathematician George
Boole
5Logical expressions
- A logical expression has either the value logical
true or logical false - Some expressions whose values are logical true
- The year 2004 is a leap year
- A meter equals 100 centimeters
- Some expressions whose values are logical false
- A triangle has four sides
- The area of square is always equal to twice its
perimeter
6Logical expressions
- There are three primary logical operators for
manipulating logical values - Logical and
- Logical or
- Logical not
- The operators work as most of us would expect
7Truth tables
- We use truth tables to give formal specifications
of the operators - It works as most of us would expect allows for
ambiguity of interpretation - Jim is smiling or Patty is smiling
- Can both Jim and Patty both be smiling?
- Truth tables
- Lists all combinations of operand values and the
result of the operation for each combination
8Or and not truth tables
9Boolean algebra
- Can create complex logical expressions by
combining simple logical expressions - not (p and q)
10DeMorgans laws
- not (p and q) equals (not p) or (not q)
11DeMorgans laws
- not (p or q) equals (not p) and (not q)
12End of lecture on 14 September 2005
- Next section was gone over on 26 Sep (due to the
midterm review, then the midterm itself)
13Todays demotivators
14Boolean expressions
15DeMorgans laws
- If you remember nothing else about the Boolean
operators, remember that - not (a and b) (not a) or (not b)
- not (a or b) (not a) and (not b)
16A boolean type
- Java has the logical type boolean
- Type boolean has two literal constants
- true
- false
- Operators
- The and operator is
- Dont use
- The or operator is
- Dont use
- The not operator is !
17Defining boolean variables
- Local boolean variables are uninitialized by
default - boolean isWhitespace
- boolean receivedAcknowledgement
- boolean haveFoundMissingLink
18Defining boolean variables
- Local boolean variables with initialization
- boolean canProceed true
- boolean preferCyan false
- boolean completedSecretMission true
19Assignment vs. comparison
- is the assignment operator
- It copies the value on the right to the location
on the left - Consider
- int x
- x 5
- The value 5 is copied to the spot x in memory
- is the comparison operator
- Returns a boolean (true or false) if the two
sides are equal - Consider
- int x 5
- System.out.println (x 5)
- System.out.println (x 6)
- Prints out true, false
20Other operators
- Equality operators and !
- Operator
- Returns true if the operands have the same value
otherwise, returns false - This is not the assignment operator!
- Operator !
- Returns true if the operands have different
values otherwise, returns false - The operators work with all types of values
21Evaluating boolean expressions
- Suppose
- boolean p true
- boolean q false
- boolean r true
- boolean s false
- What is the value of
- p p s
- !s p q
- q q ! r
- p r r s
- q s q ! s
22Evaluating boolean expressions
- Suppose
- int i 1
- int j 2
- int k 2
- char c ''
- char d ''
- char e ''
- What is the value of
- j k i ! k
- i j j ! k
- c e d ! e
- c d c ! e
23Floating point comparison
24Floating point precission
- What gets printed?
- class FloatTest
- public static void main (String args)
- double y 0.1 0.1 0.1 0.1 0.1 0.1
0.1 0.1 0.1 0.1 - System.out.println (y)
-
-
There are 10 0.1s
25Program demo
26A bit of humor
27Take care with floating-point values
- Consider
- double a 1
- double b 0.1 0.1 0.1 0.1 0.1 0.1
- 0.1 0.1 0.1 0.1
- double c .9999999999999999
- Two true expressions!
- c b b ! a
- Two false expressions!
- a b b ! c
- Problem lies with the finite precision of the
floating-point types - Instead with the ordering operators for closeness
28How to solve this
- Dont compare floating-point values if you can
help it! - Both doubles and floats
- Need to test if the two doubles are close in
value - final double EPSILON 0.000001
- boolean foo Math.abs (a-b) lt EPSILON
29More on evaluating expressions
30Ordering operators
- Java provides ordering operators for the
primitive types - Four ordering operators, lt, gt, lt, and gt
- They correspond to mathematical operators of lt,
gt, , and - Together the equality and ordering operators are
known as the relational operators - False is less than true
31Evaluation boolean expressions
- Suppose
- int i 1
- int j 2
- int k 2
- What is the value of
- i lt j
- j lt k
- i lt k
- j gt k
- i gt k
32Unicode values
- Character comparisons are based on their Unicode
values - Characters 0, 1, 9 have expected order
- Character 0 has the encoding 48
- Character 1 has the encoding 49, and so on.
- Upper case Latin letters A, B, Z have
expected order - Character A has the encoding 65, character B
has the encoding 66, and so on. - Lower case Latin letters a, b, z have
expected order - Character a has the encoding 97
- Character b has the encoding 98, and so on.
33Evaluation boolean expressions
- Suppose
- char c '2'
- char d '3'
- char e '2'
- What is the value of
- c lt d
- c lt e
- c lt e
- d gt e
- c gt e
34Operator precedence revisited
- Highest to lowest
- Parentheses
- Unary operators
- Multiplicative operators
- Additive operators
- Relational ordering
- Relational equality
- Logical and
- Logical or
- Assignment
35Expressions vs. statements
- A statement is a single command for Java to do,
and always ends in a semi-colon (for now, at
least) - System.out.println (hello world)
- int x 4
- x
- An expression returns a value, and does not have
a semi-colon - 5
- circle.getRadius()
- x
- Note the difference between the following
- i is an expression
- i is a statement
36Conditional constructs
- Provide
- Ability to control whether a statement list is
executed - Two constructs
- If statement
- if
- if-else
- if-else-if
- Switch statement
37Sand Castles
38if statement
39Basic if statement
- Syntax
- if (Expression)
- Action
- If the Expression is true then execute Action
- Action is either a single statement or a group of
statements within braces - For us, it will always be a group of statements
within braces
40Example
- if (value lt 0)
- value -value
-
41Sorting two values
- System.out.print("Enter an integer number ")
- int value1 stdin.nextInt()
- System.out.print("Enter another integer number
") - int value2 stdin.nextInt()
- // rearrange numbers if necessary
- if (value2 lt value1)
- // values are not in sorted order
- int rememberValue1 value1
- value1 value2
- value2 rememberValue1
-
-
- // display values
- System.out.println("The numbers in sorted order
are " - value1 " and then " value2)
What happens if the user enters 11 and 28? What
happens if the user enters 11 and 4?
42If semantics
43What an if statement executes
- An if statement executes the next block of code
- A block is either
- A single statement without curly brackets
- if (a b)
- System.out.println (ab!!!)
- A number of statements enclosed by curly
brackets - if (a b)
- System.out.print (a)
- System.out.print ()
- System.out.print (b)
- System.out.println (!!!)
44Why we always use braces
- What is the output?
- int m 5
- int n 10
- if (m lt n)
- m
- n
- System.out.println(" m " m " n " n)
45if-else statement
46The if-else statement
- Syntax
-
- if (Expression)
- Action1 else Action2
- If Expression is true then execute Action1
otherwise execute Action2 -
- The actions are either a single statement or a
list of statements within braces
47Finding the maximum of two values
- System.out.print("Enter an integer number ")
- int value1 stdin.nextInt()
- System.out.print("Enter another integer number
") - int value2 stdin.nextInt()
- int maximum
- if (value1 lt value2) // is value2 larger?
- maximum value2 // yes value2 is larger
-
- else // (value1 gt value2)
- maximum value1 // no value2 is not
larger -
- System.out.println("The maximum of " value1
- " and " value2 " is " maximum)
But is it initialized?
48Finding the maximum of two values
- System.out.print("Enter an integer number ")
- int value1 stdin.nextInt()
- System.out.print("Enter another integer number
") - int value2 stdin.nextInt()
- int maximum
- if (value1 lt value2) // is value2 larger?
- maximum value2 // yes value2 is larger
-
- System.out.println("The maximum of " value1
- " and " value2 " is " maximum)
But is it initialized?
49Finding the maximum of two values
50Why we use whitespace
- What does the following do?
- System.out.print("Enter an integer number ")
- int value1 stdin.nextInt()
- System.out.print("Enter another integer number
") - int value2 stdin.nextInt()
- if (value2 lt value1)
- int rememberValue1 value1
- value1 value2
- value2 rememberValue1
-
- System.out.println("The numbers in sorted order
are " - value1 " and then " value2)
51How do you like your braces?
if (a b) //... else //...
if (a b) //... else //...
if (a b) //... else //...
if (a b) //... else //...
if (a b) //... else //...
52If-then-else precedence
- if (number ! 0)
- if (number gt 0)
- System.out.println("positive")
- else
- System.out.println("negative")
Which if does this else refer to?
53If-then-else precedence without whitespace
- if (number ! 0)
- if (number gt 0)
- System.out.println("positive")
- else
- System.out.println("negative")
- else
- System.out.println("zero")
54Program demo
55Todays demotivators
56if-else-if statement
57If-else-if
We can change the whitespace of the code
if (number 0) System.out.println("zero")
else
These braces arent needed
if (number gt 0)
System.out.println("positive") else
System.out.println("negative")
Same results as previous segment but this
segment better expresses the meaning of what is
going on
58Sorting three values
- For sorting values n1, n2, and n3 there are six
possible orderings - n1 n2 n3
- n1 n3 n2
- n2 n1 n3
- n2 n3 n1
- n3 n1 n2
- n3 n2 n1
- Suppose s1, s2, s3 are to be a sorted version of
n1, n2, and n3
59Sorting three values
- if ((n1 lt n2) (n2 lt n3)) // n1 lt n2
lt n3 - s1 n1 s2 n2 s3 n3
-
- else if ((n1 lt n3) (n3 lt n2)) // n1 lt n3
lt n2 - s1 n1 s2 n3 s3 n2
-
- else if ((n2 lt n1) (n1 lt n3)) // n2 lt n1
lt n3 - s1 n2 s2 n1 s3 n3
-
- else if ((n2 lt n3) (n3 lt n1)) // n2 lt n3
lt n1 - s1 n2 s2 n3 s3 n1
-
- else if ((n3 lt n1) (n1 lt n2)) // n3 lt n1
lt n2 - s1 n3 s2 n1 s3 n2
-
- else // n3 lt n2 lt n1
- s1 n3 s2 n2 s3 n1
60? notation
61Finding the minimum value
- Consider
- // z is to hold the minimum of x and y
- if ( x lt y )
- z x
- else
- z y
- Another way to do this
- z (xlty) ? x y
Notice no braces!
62The ? notation
- Only works when both cases return a value!
- Meaning when both cases are expressions
- Example z (xlty) ? x y
- Thus, you cant put a print statement in there!
- Can be difficult to read
- System.out.println ((number ! 0) ? ((number gt 0)
? "positive "negative") "zero) - if (number ! 0)
- if (number gt 0)
- System.out.println("positive")
- else
- System.out.println("negative")
- else
- System.out.println("zero")
63switch statement
64Switch statement
- Software engineers often confronted with
programming tasks where required action depends
on the values of integer expressions - The if-else-if construct can be used
- Separately compare the desired expression to a
particular value - If the expression and value are equal, then
perform the appropriate action - Because such programming tasks occur frequently
- Java includes a switch statement
- The task is often more readable with the switch
then with the if-else-if
65A switch statement example
switch (a) case 0 System.out.println
(zero) break case 1 System.out.println
(one) break case 2 System.out.println
(two) break case 3 System.out.println
(three) break case 4 System.out.print
ln (four) break default System.out.print
ln (five) break
- if (a 0)
- System.out.println (zero)
- else if (a 1)
- System.out.println (one)
- else if (a 2)
- System.out.println (two)
- else if (a 3)
- System.out.println (three)
- else if (a 4)
- System.out.println (four)
- else
- System.out.println (five)
66Switch statement
67End of lecture on 26 September 2005
- But am going to start the next lecture 3 slides
back (at the beginning of the switch statement)
68Testing for vowel-ness
- switch (ch)
- case 'a'
- case 'A'
- case 'e'
- case 'E'
- case 'i'
- case 'I'
- case 'o'
- case 'O'
- case 'u'
- case 'U' System.out.println("vowel)
- break
- default System.out.println("not a vowel)
69Testing for vowel-ness
- switch (ch)
- case 'a' case 'A'
- case 'e' case 'E'
- case 'i' case 'I'
- case 'o' case 'O'
- case 'u' case 'U' System.out.println("vowel)
- break
- default System.out.println("not a vowel)
The break causes an exiting of the switch
Handles all of the other cases
70A better way to format that switch statement
- switch (ch)
- case 'a'
- // FALL THRU
- case 'A'
- // FALL THRU
- case 'e'
- // FALL THRU
- case 'E'
- // FALL THRU
- case 'i'
- // FALL THRU
- case 'I'
- // FALL THRU
- ...
71Processing a request
- System.out.print("Enter a number ")
- int n1 stdin.nextInt()
- System.out.print("Enter another number ")
- int n2 stdin.nextInt()
- System.out.print("Enter desired operator ")
- char operator stdin.nextLine().charAt(0)
- switch (operator)
- case '' System.out.println(n1 n2) break
- case '-' System.out.println(n1 - n2) break
- case '' System.out.println(n1 n2) break
- case '/' System.out.println(n1 / n2) break
- default System.out.println(Illegal request)
-
72Survey
- How many people feel they understand the switch
statement?
73Biggest software errors
- Ariane 5 rocket explosion (1996)
- Due to loss of precision converting 64-bit double
to 16-bit int - Pentium division error (1994)
- Due to incomplete look-up table (like an array)
- Patriot-Scud missile error (1991)
- Rounding error on the time
- The missile did not intercept an incoming Scud
missile, leaving 28 dead and 98 wounded - Mars Climate Orbiter (1999)
- Onboard used metric units ground computer used
English units - ATT long distance (1990)
- Wrong break statement in C code
- Therac-25, X-ray (1975-1987)
- Badly designed software led to radiation overdose
in chemotherapy patients - NE US power blackout (2003)
- Flaw in GE software contributed to it
- References http//www5.in.tum.de/huckle/bugse.ht
ml, http//en.wikipedia.org/wiki/Computer_bug,
http//www.cs.tau.ac.il/nachumd/verify/horror.htm
l
74Object equality
75Testing variables for equality
- Consider
- System.out.print("Enter an integer number ")
- int n1 stdin.nextInt()
- System.out.print("Enter another integer number
") - int n2 stdin.nextInt()
- if (n1 n2)
- System.out.println("Same")
-
- else
- System.out.println(Different")
What is the output if the user enters 88 and
3? What is the output if the user enters 88 both
times?
76Program Demo
77Testing objects for equality
- Consider
- String s1 pastel
- String s2 s1
- if (s1 s2)
- System.out.println("Same")
-
- else
- System.out.println("Different")
78Testing objects for equality
- Memory looks like
- The comparison is between the references!
- Thus, s1 and s2 are the same (they refer to the
same object)
79Testing objects for equality
- Consider
- System.out.print("Enter a string ")
- String s1 stdin.nextLine()
- System.out.print("Enter another string ")
- String s2 stdin.nextLine()
- if (s1 s2)
- System.out.println("Same")
-
- else
- System.out.println("Different")
What is the output if the user enters "pastel"
both times?
80Program Demo
81Testing objects for equality
- When it is executed
- System.out.print("Enter a string ")
- String s1 stdin.nextLine()
- System.out.print("Enter another string ")
- String s2 stdin.nextLine()
- Memory looks like
- As a result no matter what is entered s1 and s2
are not the same - They refer to different objects
82Comparing strings for equality
- Consider
- String s "hello"
- String t "hello"
- System.out.println (s t)
- What gets printed?
- true
- Consider
- String u new String("hello")
- String v new String("hello")
- System.out.println (u v)
- What gets printed?
- false
- Huh?
83Program Demo
84Testing operators for equality
- Consider
- System.out.print("Enter a string ")
- String s1 stdin.nextLine()
- System.out.print("Enter another string ")
- String s2 stdin.nextLine()
- if (s1.equals(s2))
- System.out.println("Same")
-
- else
- System.out.println("Different")
Tests whether s1 and s2 represent the same object
All classes have a method equals(). Their
implementation is class-specific. The String
equals() method like many others tests for
equivalence in representation
85Short-circuit evaluation
86Becoming an IEEE author
87Short-circuit evaluation
- The value of a logical expression can be known
before all the operands have been considered - If left operand of is false, then the value
must be false - If right operand of is true, then the value
must be true - Java uses these properties to make logical
operations efficient - Evaluates left operand before it evaluates right
operand - If the operator value is determined from the left
operand, then the right operand is not evaluated - The operation is short-circuited
88Short-circuit evaluation
- Short-circuit evaluation is useful when some
property must be true for some other expression
to be evaluated - Suppose you are interested in knowing whether
scoreSum divided by nbrScores is greater than
value - The condition can be evaluated only if nbrScores
is nonzero - The following expression correctly represents the
condition - (nbrScores ! 0) ((scoreSum / nbrScores) gt
value)
89Short-circuit evaluation
Output
returnsFalse() called returnsTrue()
called returnsFalse() called returnsFalse()
called returnsTrue() called returnsTrue() called
- Assume we have a returnsFalse() method from a
foo object - It returns false
- And it prints returnsFalse() called
- And a returnsTrue() method
- Consider
- if ( foo.returnsFalse() foo.returnsTrue() )
-
- if ( foo.returnsTrue() foo.returnsFalse() )
-
- if ( foo.returnsFalse() foo.returnsTrue() )
-
- if ( foo.returnsTrue() foo.returnsFalse() )
-
90Quick survey
- How comfortable do you feel with ifs and
switches?
91Todays demotivators