RU beehive logo ITEC dept promo banner
ITEC 120
2010fall
ibarland

homeinfolectslabsexamshws
tutor/PIsjava.lang docsjava.util docs

lect03b
booleans and if-else

Boolean expressions

The type boolean is much simpler than (say) int, because rather than 4+ billion ints, there are only two boolean values: true, and false. Note that these two names aren't variables; they're values, just like 17 and -34 are.

There are some functions in Java which take two numbers, and return a boolean. ==, >, >=, ==, !=, etc.. Type the following boolean expressions into BlueJ's Code Pad:

(2+2 == 4)
2+2 == 5
2+2 != 5
2+2 != 4  // "Is it true, that 2+2 is not four?"

5 > 4
5 > 99
5 > 5
5 >= 5

double x = 5;
double y = 43.2;
(x+y)/2 >= Math.sqrt(x*y) // is the arith.avg less than geom.avg., for the current value of x,y?

Pizzeria.pizzaArea(20) > Pizzeria.pizzaArea(15) + Pizzeria.pizzaArea(12);  // true or false?

There are only three built-in Java statements which really use booleans: for now we'll learn the if-else statement. Syntax:

if (condition) {
  statements…
  } 
else {
  statements…
  }
Practice: Write a function myMax which takes in two numbers, and returns the bigger. (What should be returned, if the two inputs are equal?)
As always, remember the steps of the design recipe.

Example: Write a program for the following:

  /** Given how many slices of (say) mushroom pizza are
   * currently available, create a nice tempting message
   * to advertise (shout out, or post, or put on a 
   * LED sign...)
   *
   * @param topping The type of pizza (e.g. "pepperoni")
   * @param piecesReady The number of currently ready-to-serve
   *    slices with the given topping.
   * @return A complete sentence describing the inventory.
   * For example:
   * slicesReadyMsg( "mushroom", 3 ) 
   *   = "There are 3 piping hot pieces of mushroom pizza, ready to eat!"
   * slicesReadyMsg( __________, __ )
   *   = ______________________________________________
   * slicesReadyMsg( __________, __ )
   *   = ______________________________________________
   */
By writing out some test cases, we realize that there is a need for an if. This then gives rise to our first version:
  String slicesReadyMsg( String topping, int slicesReady ) {

    String slogan;                // Declare; initialize in *both* branches of if-else.
    if (slicesReady == 1) {
      slogan =   "There is "
                + slicesReady
                + " piping hot slice of "
                + topping
                + " pizza, ready to eat!";
      }
    else {   // slicesReady isn't equal to 1
      slogan =   "There are "
                + slicesReady
                + " piping hot slices of "
                + topping
                + " pizza, ready to eat!";
      }
      
    return slogan;
    }
This function works, but ech, it's full of repeated code. In particular -- if you later realize that (say) you forgot a space somewhere in the message, you might fix the code in place but forget to update the other copy. Or, if your boss decides that the message should read something like “Only 5 pizzas of pepperoni left -- get 'em while you can!” then you again need to remember to update multiple places in the code.

We can do better: Where do the two solutions differ? In only two places: “is” vs. “are”, and the suffix “s” vs. no suffix at all. We can factor out the common code, and let our if statement focus on just those differences:

  /* (Same comments as before; omitted for lecture presentation)
   */
  String slicesReadyMsg( String topping, int slicesReady ) {
    String verbForm;   // The correct verb for our result.
    String plurality;  // The noun-suffix, correctly plural or singular.
    
    if (slicesReady == 1) {
      verbForm = "is";
      plurality = "";
      }
    else {
      verbForm = "are";
      plurality = "s";
      }

    return   "There " + verbForm + " "
           + slicesReady +
           + " piping hot " 
           + ("slice" + plurality) 
           + " of "
           + topping  
           + " pizza, ready to eat!";
    }
One note: in our return statement, we had to add a "There " before verbForm. Should we just have had verbForm include that "There ", assigning it to either "There is " and "There are "? What about the trailing space, after verbForm? Discuss.

teacher::I reached here in sect.04. Sect.03 finished through highwayDrivingTime, but I had skipped writing myMax.

Using if-else for initializing, return

We used to have a rule that immediately after declaring a variable, you should initialize it. We still have that rule! Sometimes it's an if-else or if-else-if statement which is doing the initialization, but that's fine. Just be careful:

Guideline: When using an if statement for initializing a variable, make sure each branch of the if initializes that variable.
(Even if you have an unreachable catch-all statement, you'll need to appease the compiler by initializing the variable there, too.)

Similarly, if you have a return inside a branch of an if statement, consider writing your code so that every branch of the if statement has a return.
This rule is less important; because it's clear that the first branch without a return essentially starts an else block which lasts for the rest of the function.

Booleans as inputs

/** Give an estimate of how far it will take to travel a given distance, on the highway.
 * @param miles How far to travel, in miles.
 * @param isRoadClear  Is the road in good condition (true), or is it icy/foggy/accidented (false)?
 * @return The estimated time of driving that far, in hours.
 *   highwayDrivingTime(   0, true  ) = 0
 *   highwayDrivingTime(   0, false ) = 0
 *   highwayDrivingTime(  65, true  ) = 1.0
 *   highwayDrivingTime(  65, false ) = 1.6
 *   highwayDrivingTime( 130, true  ) = 2.0
 *   highwayDrivingTime( 130, false ) = 3.2
 */
double highwayDrivingTime( double miles, boolean isRoadClear ) {
  int SPEED_LIMIT = 65;  // posted limit, in MPH.  (We can declare and initialize, all on one line.)

  double DELAY_FACTOR = 1.60;  
  // If road isn't clear, how much does that slow us down?  
  // 2.0 means twice as long; 1.0 is no slowdown (and less than 1.0 would be a speedup).


  if (isRoadClear) {
    return (miles / SPEED_LIMIT);
    }
  else {
    return (miles / SPEED_LIMIT) * DELAY_FACTOR;
    }
  }
Observe how, in if (isRoadClear) , that single variable isRoadClear is a true/false expression.

Booleans as outputs (predicates)

We can also return a true/false answer from a function:

/**
 * @param age The age (in years) of the person in question.  E.g., 18months is age 1.
 * @return whether or not the person must register with Selective Service.
 *   mustRegisterForDraft(22) == true
 *   mustRegisterForDraft(14) == false
 */
boolean mustRegisterForDraft( int age ) {
  return (age >= 18);
  }
Note that the first impulse is to write this function as
  if (age >= 18) {
    return true;
    }
  else {
    return false;
    }
This is certainly acceptable, and you might even find it clearer than return (age >= 18);. But you'll find that as you really internalize the idea of booleans as values, the short version really will feel more natural.

By the way, is this a silly function to write? Why, anybody who wants to call this function could more simply write the comparison against 18 directly. So what do we gain, by writing this as a separate function? We'll revisit this function soon.

A function which returns a boolean value is called a predicate function (or just, “predicate”). Often, predicates' names start with “is” or “has”: For example “isHappy”, “hasEaten”, etc.. So if these names happened to be methods for PizzaServer, our code might naturally have lines like

if (hasEatenSince( Fred, 2007, 01, 20 )) {
  return "I am stuffed!" 
  } 
else { 
  return "Is anybody else hungry?"; 
  }

homeinfolectslabsexamshws
tutor/PIsjava.lang docsjava.util docs


©2010, Ian Barland, Radford University
Last modified 2010.Sep.17 (Fri)
Please mail any suggestions
(incl. typos, broken links)
to iba�rlandrad�ford.edu
Powered by PLT Scheme