CS 177
E N D
Presentation Transcript
Conditional execution • So far we have only considered Java programs that do one thing after another, in sequence • Our programs have not had the ability to choose between different possibilities • Now, they will!
The if-statement • The if-statement: • “x is small” will only print if x is less than 5 • In this case, we know that it is, but x could come from user input or a file or elsewhere intx = 4; if( x < 5 ) System.out.println(“x is small!”);
Anatomy of an if Any boolean expression The if part if( condition ) statement; Any single executable statement
Conditions in the if • Any expression that evaluates to a boolean is legal in an if-statement • Examples: • x == y • mass > 21.75 • Character.isDigit(gender) • s.equals(“help”) && (z < 4)
Comparison • The most common condition you will find is a comparison between two things • In Java, that comparison can be: • == equals • != does not equal • < less than • <= less than or equal to • > greater than • >= greater than or equal to
Equals • You can use the == operator to compare any two things of the same type • Different numerical types can be compared as well (3 == 3.0) • Be careful with double types, 0.33333333 is not equal to 0.33333332 int x = 3; if( x == 4 ) System.out.println(“This doesn’t print”);
Not Equals • Any place you could have used the == operator, you can use the != operator • If == gives true, the != operator will always give false, and vice versa • If you want to negate a condition, you can always use the ! as a not is the same as if( x != 4 ) if( !(x == 4) )
= != == • Remember, a single equal sign (=) is the assignment operator (think of a left-pointing arrow) • A double equals (==) is a comparison operator if( y = 6 ) //compiler error! • if( y == 6 ) //how to test if y is 6!
Less Than (or Equal To) • Inequality is very important in programming • You may want to take an action as long as a value is below a certain threshold • For example, you might want to keep bidding at an auction until the price is greater than what you can afford • if( x <= 4 ) • if( x < 4 ) // what is the difference?
Greater Than (or Equal To) • Just like less than or equal to, except the opposite • Note that the opposite of <= is > and the opposite of >= is < • Thus, • !( x <= y ) is equivalent to ( x > y ) • !( x >= y ) is equivalent to ( x < y )
Either/Or • Sometimes you have to make a decision • If a condition is true, you go one way, if not, you go the other • For example: • If I pass CS177, • Then I throw a party to celebrate • Otherwise, • I take it again and go to class next time
Exclusivity • Notice the nature of this kind of condition • Both outcomes cannot happen • Either a party gets thrown or you take CS 177 again • For these situations, we use the else construct
Anatomy of an if-else if( condition ) statement1; else statement2; Two different outcomes
else example doublebalance = …; if( balance < 0 ) System.out.println(“You are in debt!”); else • System.out.println(“You have $” + balance);
What if you need to do several things conditionally? • No problem • Use braces to treat a group of statements like a single statement if( x == 4 ) { System.out.println(“I hate 4”); • System.out.println(“Let’s change x.”); • x = 10; • }
An if with multiple statements if( condition ) { statement1; statement2; … statementn; } A whole bunch of statements
Nesting • Sometimes you want to make one set of decisions based on another set of decisions • if-statements can be nested inside the bodies of other if-statements • You can put if-statements inside of if-statements inside of if-statements… going arbitrarily deep
Nested ifs if( condition1 ) { statement1; if( condition2 ) { if( condition3 ) statement2; … } }
An example using quadrants • For the next example, recall the 4 quadrants of the Cartesian coordinate system y 2 1 (0,0) -x x 3 4 -y
Nesting example • Find which quadrant the point (x,y) is in if( x >= 0.0 ) { if( y >= 0.0 ) System.out.println(“Quadrant 1”); else • System.out.println(“Quadrant 4”); } else { • if( y >= 0.0 ) • System.out.println(“Quadrant 2”); • else • System.out.println(“Quadrant 3”); • }
if and else if • You can list a sequence of exclusive possibilities using nesting: if( index == 1 ) System.out.println(“First”); else if( index == 2 ) • System.out.println(“Second”); else if( index == 3 ) • System.out.println(“Third”); • else • System.out.println(“Oops. Problem”); • }
Watch out! • Now you are controlling the flow of execution in your program • There is a wider range of mistakes you can make when giving instructions • Huge chunks of code can be executed or skipped by mistake • Here are a few things to watch out for…
Empty statements • Remember that an if-statement is not an executable statement • It does not end with a semicolon if( balance < 0 ); // empty statement { // this block always runs System.out.println(“You owe a fee!”); balance -= 15; • }
Confusing indentation • In some languages, indentation actually matters • Java ignores whitespace • “Negotiate!”prints no matter what if( enemies > 2 ) System.out.println(“Run away!”); else • defense = true; • System.out.println(“Negotiate!”);
Imprecise conditions • It’s easy to make logical errors when writing conditions • If an airline allows two or fewer bags on the plane, someone might code that as: • But this is too restrictive. It should be: if( bags < 2 ) // only allows 1 or 0 boarding = true; if( bags <= 2 ) boarding = true;
Reversed conditions • Sometimes it’s easy to get a condition backwards • Try not to assume you wrote the condition correctly • Always test your code if( number % 3 == 0 ) System.out.println(“Not divisible by 3!”); else • System.out.println(“Divisible by 3!”);
Speed limit • Sometimes you probably break the speed limit • But, there’s one speed limit you can never break • The speed of light c is about 3 x 108 miles/second • Given a variable named speed of type double, what’s an if-statement that will print an error message if speed is larger than c?
Speed limit answer • The simplest answer: • What if we want to add a message if the speed is legal? if( speed > 3.0e8 ) System.out.println(“Not so fast!”); if( speed > 3.0e8 ) System.out.println(“Not so fast!”); else System.out.println(“That speed is fine.”);
DNA • Assume that you have a variable called base of type char • Let base contain one of: ‘A’, ‘C’, ‘G’, ‘T’ • Write a series of if- and else-statements that will print out the chemical name of the base denoted by the corresponding character • A -> Adenine • C -> Cytosine • G -> Guanine • T -> Thymine
Printing DNA bases if( base == ‘A’ ) System.out.println(“Adenine”); else if( base == ‘C’ ) System.out.println(“Cytosine”); • else if( base == ‘G’ ) • System.out.println(“Guanine”); • else if( base == ‘T’ ) • System.out.println(“Thymine”); • else • System.out.println(“Base is not correct”); • What if you want to take care of upper and lower cases?
Upper and lower case bases using logic • if( base == ‘A’ || base == ‘a’ ) System.out.println(“Adenine”); • else if( base == ‘C’ || base == ‘c’ ) System.out.println(“Cytosine”); • else if( base == ‘G’ || base == ‘g’ ) • System.out.println(“Guanine”); • else if( base == ‘T’ || base == ‘t’ ) • System.out.println(“Thymine”); • else • System.out.println(“Base is not correct”); • Is there a simpler way?
Upper and lower case bases using character conversion • base = Character.toUpperCase( base ); • if( base == ‘A’ ) System.out.println(“Adenine”); • else if( base == ‘C’ ) System.out.println(“Cytosine”); • else if( base == ‘G’ ) • System.out.println(“Guanine”); • else if( base == ‘T’ ) • System.out.println(“Thymine”); • else • System.out.println(“Base is not correct”);
if statements are okay… • But, didn’t that DNA example seem a little clunky? • Surely, there is a cleaner way to express a list of possibilities • Yes! It is the switch statement
Anatomy of a switch statement switch( data ) { case value1: statements 1; case value2: statements 2; … case valuen: statements n; default: default statements; }
DNA hittin’ switches • switch( base ) • { • case‘A’: System.out.println(“Adenine”); • break; • case‘C’: System.out.println(“Cytosine”); • break; • case‘G’: System.out.println(“Guanine”); • break; • case‘T’: System.out.println(“Thymine”); • break; • default:System.out.println(“Base is not correct”); • break; // unnecessary • }
Peculiarities of switch Both “Three” and “Four” are printed int data = 3; switch( data ) { case 3: System.out.println(“Three”); case 4: System.out.println(“Four”); break; case 5: System.out.println(“Five”); } The break is optional The default is optional too
Rules for switch • The data that you are performing your switch on must be either an int or a char • The value for each case must be a literal • Execution will proceed to the case that matches • Execution will continue until it hits a break • If no case matches, it will go to default • If there is no default, it will skip the whole switch block
DNA with upper and lower case • switch( base ) • { • case‘A’: • case‘a’: • System.out.println(“Adenine”); • break; • case‘C’: • case‘c’: • System.out.println(“Cytosine”); • break; • case‘G’: • case‘g’: • System.out.println(“Guanine”); • break; • case‘T’: • case‘t’: • System.out.println(“Thymine”); • break; • default:System.out.println(“Base is not correct”); • break; // unnecessary • }
A caution about switch • Using if-statements is usually safer • if-statements are generally clearer and more flexible • switch statements are only for long lists of specific cases • Be careful about inconsistent use of break
Input • Input can be a messy thing • So far, the only input you have used are the arguments passed into the program • Sometimes a program needs to get input several times from a user
StdIn • To do this, we are going to use the StdIn library, created by the author of the textbook • Read pages 126 – 130 in Sedgewick • Java provides several other ways of doing input • However, StdIn is simpler than most • The only painful thing is that you have to have another class file in the directory with your program to make it work
Downloading StdIn • The location of the StdIn library is: http://www.cs.princeton.edu/introcs/15inout/StdIn.java • This is just a regular Java file • Look through it if you are curious • When you compile code that uses StdIn methods, StdIn.java will automatically be compiled, as long as it is in the same directory
Purpose of StdIn • The purpose of StdIn is to let you read stuff that the user types in • If the user is running the program from the command line, he or she will enter input there • If the user is running the program from DrJava, he or she will enter input in the Interactions pane
DrJava vs. Command Line DrJava Command Line
StdIn methods • For now, we are only going to focus on a few methods in StdIn
Now we can make decisions before we read in more data • System.out.println(“How many sides does your shape have?”); • intsides = StdIn.readInt(); • if( sides == 3 ) • { • System.out.println(“Enter the base and the height:”); • double base = StdIn.readDouble(); • double height = StdIn.readDouble(); • System.out.println(“The area of your triangle is “ + • (.5 * base * height )); • } • else if( sides == 4 ) • { • System.out.println(“Enter the length and the width:”); • double length = StdIn.readDouble(); • double width = StdIn.readDouble(); • System.out.println(“The area of your rectangle is “ + • (length * width)); • } • else • System.out.println(“I don’t know what the area “ + • “of your shape is.”);
A few notes about StdIn • StdIn is pretty smart • It can ignore whitespace when looking for the next int or double • It is not foolproof • If you try to read in an int and the user types “pigs”, your program will crash