Writing a computer program has been compared to telling a household robot what to do. You provide the computer a list of instructions, called statements, and these instructions are followed to the letter. You can tell the computer to work out some unpleasant mathematical formulas, and it will work them out for you. Tell it to display some information, and it will dutifully respond.
However, there are times when you need the computer to be more selective about what it does. For example, if you have written a program to balance your checkguide, you might want the computer to display a warning message if your account is overdrawn. The warning could be something along the lines of Hear that bouncing noise? It's your checks. The computer should display this message only if your account is overdrawn. If it isn't, the message would be both inaccurate and emotionally upsetting.
The way to accomplish this task in a Java program is to use a statement called a conditional. Conditionals cause something to happen in a program only if a specific condition is met. Country star Kenny Rogers sang with the hippie-rock group The First Edition in the late '60s, and one of the group's singles hit the top 5 in 1968: "Just Dropped In (To See What Condition My Condition Was In)". During this hour, you'll be dropping in to check the condition of several things in your Java programs using the conditional statements if, else, switch, case, and break. You also will be using several conditional operators: ==, !=, <, >, and ?. The following topics will be covered:
If you want to test a condition in a Java program, the most basic way is with an if statement. As you learned previously, the boolean variable type is used to store only two possible values: true or false. The if statement works along the same lines, testing to see whether a condition is true or false and taking action only if the condition is true.
You use if along with a condition to test, as in the following statement:
if (account < 0.01) System.out.println("Hear that bouncing noise? It's your checks");
Although this code is listed on two lines, it's one statement. The first part uses if to determine whether the account variable is less than 0.01 by using the < operator. The second part displays the text Hear that bouncing noise? It's your checks. The second part of the if statement will be run only if the first part is true. If the account variable has a value of 0.01 (1 cent) or higher, the println statement will be ignored. Note that the condition that you test with an if statement must be surrounded by parentheses, as in (account < 0.01).
If you're not sure why if (account < 0.01) is not a statement on its own, note that there is no semicolon at the end of the line. In Java programs, semicolons are used to show where one statement ends and the next one begins. In the preceding example, the semicolon does not appear until after the println portion of the statement. If you put a semicolon after the if portion, as in if (account < 0.01);, you'll cause an error in your program that can be hard to spot. Take care regarding semicolons when you start using the if statement.
The less than operator, <, is one of several different operators that you can use with conditional statements. You'll become more familiar with the if statement as you use it with some of the other operators.
In the preceding section, the < operator is used the same way it was used in math class, as a less-than sign. There also is a greater-than conditional operator, >. This operator is used in the following statements:
if (elephantWeight > 780) System.out.println("This elephant is too fat for your tightrope act."); if (elephantTotal > 12) cleaningExpense = cleaningExpense + 150;
The first if statement tests whether the value of the elephantWeight variable is greater than 780. The second if statement tests whether the elephantTotal variable is greater than 12.
One thing to learn about if statements is that they often cause nothing to happen in your programs. If the preceding two statements are used in a program where elephantWeight is equal to 600 and elephantTotal is equal to 10, the rest of the statements will be ignored. It's as though you are giving an order to a younger sibling who is subject to your whims: "Jerry, go to the store. If they have Everlasting Gobstopper candy, buy some for me. If not, do nothing and await further orders."
There will be times when you will want to determine whether something is less than or equal to something else. You can do this with the <= operator, as you might expect; use the >= operator for greater-than-or-equal-to tests. Here's an example:
if (account <= 0) System.out.println("Hear that bouncing noise? It's your checks");
This revision of the checkguide example mentioned previously should be a bit easier to understand. It tests whether account is less than or equal to the value 0 and taunts the user if it is.
Another condition to check on in a program is equality. Is a variable equal to a specific value? Is one variable equal to the value of another? These questions can be answered with the == value, as in the following statements:
if (answer == rightAnswer) studentGrade = studentGrade + 10; if (studentGrade == 100) System.out.println("Congratulations -- a perfect score!");
Caution: The operator used to conduct equality tests has two equal signs: ==. It's very easy to confuse this operator with the = operator, which is used to give a value to a variable. Always use two equal signs in a conditional statement.
You also can test inequality--whether something is not equal to something else. You do this with the != operator, as shown in the following example:
if (team != "New York Jets") chanceToWin = 50; if (answer != rightAnswer) score = score - 5;
You can use the == and != operators with every type of variable except for one, strings. To see whether one string has the value of another, use the equals() method described during Chapter 6, "Using Strings to Communicate."
Up to this point, all of the if statements have been followed with a single instruction, such as the println() method. In many cases, you will want to do more than one action in response to an if statement. To do this, you'll use the squiggly bracket marks { and } to create a block statement.
Block statements are statements that are organized as a group. Previously, you have seen how block statements are used to mark the beginning and end of the main() block of a Java program. Each statement within the main() block is handled when the program is run. Listing 7.1 is an example of a Java program with a block statement used to denote the main() block. The block statement begins with the opening bracket { on Line 2 and ends with the closing bracket } on Line 11. Load your word processor and enter the text of Listing 7.1 as a new file.
1: class Game { 2: public static void main(String[] arguments) { 3: int total = 0; 4: int score = 7; 5: if (score == 7) 6: System.out.println("You score a touchdown!"); 7: if (score == 3) 8: System.out.println("You kick a field goal!"); 9: total = total + score; 10: System.out.println("Total score: " + total); 11: } 12: }
Save this file as Game.java and compile it with the javac compiler
tool. The output should resemble Listing 7.2.
You score a touchdown!
Total score: 7 You can also use block statements in conjunction with if statements to make the computer do more than one thing if a conditional statement is true. The following is an example of an if statement that includes a block statement:
if (playerScore > 9999) { playerLives++; System.out.println("Extra life!"); difficultyLevel = difficultyLevel + 5; }
The brackets are used to group all statements that are part of the if statement. If the variable playerScore is greater than 9,999, three things will happen:
If the variable playerScore is not greater than 9,999, nothing will happen. All three statements inside the if statement block will be ignored.
There are times when you want to do something if a condition is true and do something else if the condition is false. You can do this by using the else statement in addition to the if statement, as in the following example:
if (answer == correctAnswer) { score += 10; System.out.println("That's right. You get 10 points."); } else { score -= 5; System.out.println("Sorry, that's wrong. You lose 5 points."); }
The else statement does not have a condition listed alongside it, unlike the if statement. Generally, the else statement is matched with the if statement that immediately comes before it in a Java program. You also can use else to chain several if statements together, as in the following example:
if (grade == "A") System.out.println("You got an A. Great job!"); else if (grade == "B") System.out.println("You got a B. Good work!"); else if (grade == "C") System.out.println("You got a C. You'll never get into a good college!"); else System.out.println("You got an F. You'll do well in Congress!");
By putting together several different if and else statements in this way, you can handle a variety of conditions. In the preceding example, a specific message is sent to A students, B students, C students, and future legislators.
The if and else statements are good for situations with only two possible conditions, but there are times when you have more than two options that need to be considered. With the preceding grade example, you saw that if and else statements can be chained to handle several different conditions.
Another way to do this is to use the switch statement. You can use it in a Java program to test for a variety of different conditions and respond accordingly. In the following example, the grade example has been rewritten with the switch statement to handle a complicated range of choices:
switch (grade) { case `A': System.out.println("You got an A. Great job!"); break; case `B': System.out.println("You got a B. Good work!"); break; case `C': System.out.println("You got a C. You'll never get into a good college!"); break; default: System.out.println("You got an F. You'll do well in Congress!"); }
The first line of the switch statement specifies the variable that will be tested--in this example, grade. Then the switch statement uses the { and } brackets to form a block statement.
Each of the case statements checks the test variable from switch against a specific value. In this example, there are case statements for values of A, B, and C. Each of these has one or two statements that follow it. When one of these case statements matches the variable listed with switch, the computer handles the statements after the case statement until it encounters a break statement. For example, if the grade variable has the value of B, the text You got a B. Good work! will be displayed. The next statement is break, so no other part of the switch statement will be considered. The break statement tells the computer to break out of the switch statement.
The default statement is used as a catch-all if none of the preceding case statements is true. In this example, it will occur if the grade variable does not equal A, B, or C. You do not have to use a default statement with every switch block statement that you use in your programs. If it is omitted, nothing will happen if none of the case statements has the correct value.
The most complicated conditional statement is one that you might not find reasons to use in your programs, the ternary operator. If you find it too confusing to implement in your own programs, take heart: You can use other conditionals to accomplish the same thing.
You can use the ternary operator when you want to assign a value or display a value based on a conditional test. For example, in a video game, you might need to set the numberOfEnemies variable based on whether the skillLevel variable is greater than 5. One way to do this is with an if-else statement:
if (skillLevel > 5) numberOfEnemies = 10; else numberOfEnemies = 5;
A shorter way to do this is to use the ternary operator, which is ?. A ternary operator has the following parts:
To use the ternary operator to set the value of numberOfEnemies based on skillLevel, you could use the following statement:
numberOfEnemies = ( skillLevel > 5) ? 10 : 5;
You can also use the ternary operator to determine what information to display. Consider the example of a program that displays the text Mr. or Ms. depending on the value of the gender variable. You could do this action with another if-else statement:
if (gender == "male") System.out.print("Mr."); else System.out.print("Ms.");
A shorter method is to use the ternary operator to accomplish the same thing, as in the following:
System.out.print( (gender == "male") ? "Mr." : "Ms." );
The ternary operator can be useful, but it's also the hardest element of conditional tests in Java to understand. Feel free to use the longer if and else statements if you want.
This hour's workshop gives you another look at each of the conditional tests you can use in your programs. For this project, you will use Java's built-in timekeeping feature, which keeps track of the current date and time, and will present this information in sentence form.
Run the word processor that you're using to create Java programs and give a new document the name ClockTalk.java. This program is long, but most of it consists of long conditional statements. Type the full text of Listing 7.3 into the word processor and save the file when you're done.
1: import java.util.*; 2: 3: class ClockTalk { 4: public static void main(String[] arguments) { 5: // get current time and date 6: GregorianCalendar now = new GregorianCalendar(); 7: int hour = now.get(Calendar.HOUROFDAY); 8: int minute = now.get(Calendar.MINUTE); 9: int month = now.get(Calendar.MONTH) + 1; 10: int day = now.get(Calendar.DAYOFMONTH); 11: int year = now.get(Calendar.YEAR); 12: 13: // display greeting 14: if (hour < 12) 15: System.out.println("Good morning.\n"); 16: else if (hour < 17) 17: System.out.println("Good afternoon.\n"); 18: else 19: System.out.println("Good evening.\n"); 20: 21: // begin time message by showing the minutes 22: System.out.print("It's"); 23: if (minute != 0) { 24: System.out.print(" " + minute + " "); 25: System.out.print( (minute != 1) ? "minutes" : 26: "minute"); 27: System.out.print(" past"); 28: } 29: 30: // display the hour 31: System.out.print(" "); 32: System.out.print( (hour > 12) ? (hour - 12) : hour ); 33: System.out.print(" o'clock on "); 34: 35: // display the name of the month 36: switch (month) { 37: case (1): 38: System.out.print("January"); 39: break; 40: case (2): 41: System.out.print("February"); 42: break; 43: case (3): 44: System.out.print("March"); 45: break; 46: case (4): 47: System.out.print("April"); 48: break; 49: case (5): 50: System.out.print("May"); 51: break; 52: case (6): 53: System.out.print("June"); 54: break; 55: case (7): 56: System.out.print("July"); 57: break; 58: case (8): 59: System.out.print("August"); 60: break; 61: case (9): 62: System.out.print("September"); 63: break; 64: case (10): 65: System.out.print("October"); 66: break; 67: case (11): 68: System.out.print("November"); 69: break; 70: case (12): 71: System.out.print("December"); 72: } 73: 74: // display the date and year 75: System.out.println(" " + day + ", " + year + "."); 76: } 77: }
Once you have saved the file, try to compile it by entering javac ClockTalk.java
at the command line. Correct any typos that cause error messages to occur during
the attempted compilation. After the program compiles correctly, look over Lines
14-75 before going over the description of the program. See whether you can get a
good idea about what is taking place in each of these sections and how the conditional
tests are being used.
The ClockTalk program is made up of the following sections:
When you run this program, the output should resemble the following code, with changes based on the current date and time. For example, if today's date is 4-13-1997 and the time is 8:30 a.m., your program would display the following text:
Good morning. It's 30 minutes past 8 o'clock on April 13, 1997.
Run the program several times to see how it keeps up with the clock.
The ClockTalk program uses the Gregorian calendar system that has been used throughout the Western world for many years to determine the date and time. It was introduced in 1582 when Pope Gregory XIII moved the Julian calendar system forward 10 days--turning Oct. 5, 1582, into Oct. 15, 1582. This was needed because the calendar was moving out of alignment with the seasons due to discrepancies in the Julian system. Changes introduced with version 1.1 of the Java language make it possible to create other calendar systems for use with Java programs. Check Gamelan at http://www.gamelan.com or other Java programming resources for these calendar systems as they become available.
Now that you can use conditional statements, the overall intelligence of your Java programs has improved greatly. Your programs can now evaluate information and use it to react differently in different situations, even if information changes as the program is running. They can decide between two or more alternatives based on specific conditions.
Using the if statement and other conditionals in programming also promotes a type of logical thinking that can reap benefits in other aspects of your life. ("If she's attractive, I'll take her to an expensive restaurant, else we're using my two-for-one Taco Barn burrito coupon.") Programming a computer forces you to break down a task into a logical set of steps to undertake and decisions that must be made, and it provides interesting insight.
One thing that conditional statements do not offer insight about is the thinking of the lyricist who penned "Just Dropped In (To See What Condition My Condition Was In)". There may be no rational explanation for lyrics such as, "I tred on a cloud, I fell eight miles high. Told my mind I'm gonna sky. I just dropped in to see what condition my condition was in."
The following questions will see what condition your knowledge of conditions is in.
To improve your conditioning in terms of Java conditionals, review the topics of this hour with the following activities: