Building Java Programs
Chapter 4
Conditional Execution
Copyright © 2017, Pearson Education, Ltd. All Rights Reserved
The if statement
Executes a block of statements only if a test is true
if (test) {
statement;
...
statement;
}
• Example:
double gpa = console.nextDouble();
if (gpa >= 2.0) {
System.out.println("Application accepted.");
}
The if/else statement
Executes one block if a test is true, another if false
if (test) {
statement(s);
} else {
statement(s);
}
• Example:
double gpa = console.nextDouble();
if (gpa >= 2.0) {
System.out.println("Welcome to Mars University!");
} else {
System.out.println("Application denied.");
}
Relational expressions
• if statements and for loops both use logical tests.
for (int i = 1; i <= 10; i++) { ...
if (i <= 10) { ...
• These are boolean expressions, seen in Ch. 5.
Operator Meaning Example Value
• Tests use relational
== operators:
equals 1 + 1 == 2 true
!= does not equal 3.2 != 2.5 true
< less than 10 < 5 false
> greater than 10 > 5 true
<= less than or equal to 126 <= 100 false
>= greater than or equal to 5.0 >= 5.0 true
Misuse of if
• What's wrong with the following code?
Scanner console = new Scanner(System.in);
System.out.print("What percentage did you earn? ");
int percent = console.nextInt();
if (percent >= 90) {
System.out.println("You got an A!");
}
if (percent >= 80) {
System.out.println("You got a B!");
}
if (percent >= 70) {
System.out.println("You got a C!");
}
if (percent >= 60) {
System.out.println("You got a D!");
}
if (percent < 60) {
System.out.println("You got an F!");
}
...
Nested if/else
Chooses between outcomes using many tests
if (test) {
statement(s);
} else if (test) {
statement(s);
} else {
statement(s);
}
• Example:
if (x > 0) {
System.out.println("Positive");
} else if (x < 0) {
System.out.println("Negative");
} else {
System.out.println("Zero");
}
Nested if/else/if
• If it ends with else, exactly one path must be taken.
• If it ends with if, the code might not execute any path.
if (test) {
statement(s);
} else if (test) {
statement(s);
} else if (test) {
statement(s);
}
• Example:
if (place == 1) {
System.out.println("Gold medal!");
} else if (place == 2) {
System.out.println("Silver medal!");
} else if (place == 3) {
System.out.println("Bronze medal.");
}
Nested if structures
• exactly 1 path (mutually exclusive) • 0 or 1 path (mutually exclusive)
if (test) { if (test) {
statement(s); statement(s);
} else if (test) { } else if (test) {
statement(s); statement(s);
} else { } else if (test) {
statement(s); statement(s);
} }
• 0, 1, or many paths (independent tests; not exclusive)
if (test) {
statement(s);
}
if (test) {
statement(s);
}
if (test) {
statement(s);
}
Which nested if/else?
• (1) if/if/if (2) nested if/else (3) nested if/else if
• Whether a user is lower, middle, or upper-class based on income.
• (2) nested if / else if / else
• Whether you made the dean's list (GPA ≥ 3.8) or honor roll (3.5-3.8).
• (3) nested if / else if
• Whether a number is divisible by 2, 3, and/or 5.
• (1) sequential if / if / if
• Computing a grade of A, B, C, D, or F based on a percentage.
• (2) nested if / else if / else if / else if / else
Nested if/else question
BMI Weight class
below 18.5 underweight
Formula for bodyweight
mass index (BMI): 18.5 - 24.9 normal
BMI = 2
703 25.0 - 29.9 overweight
height
30.0 and up obese
• Write a program that produces output like the following:
This program reads data for two people and
computes their body mass index (BMI).
Enter next person's information:
height (in inches)? 70.0
weight (in pounds)? 194.25
Enter next person's information:
height (in inches)? 62.5
weight (in pounds)? 130.5
Person 1 BMI = 27.868928571428572
overweight
Person 2 BMI = 23.485824
normal
Difference = 4.3831045714285715
Nested if/else answer
// This program computes two people's body mass index (BMI) and
// compares them. The code uses Scanner for input, and parameters/returns.
import java.util.*; // so that I can use Scanner
public class BMI {
public static void main(String[] args) {
introduction();
Scanner console = new Scanner(System.in);
double bmi1 = person(console);
double bmi2 = person(console);
// report overall results
report(1, bmi1);
report(2, bmi2);
System.out.println("Difference = " + Math.abs(bmi1 - bmi2));
}
// prints a welcome message explaining the program
public static void introduction() {
System.out.println("This program reads data for two people and");
System.out.println("computes their body mass index (BMI).");
System.out.println();
}
...
Nested if/else, cont'd.
// reads information for one person, computes their BMI, and returns it
public static double person(Scanner console) {
System.out.println("Enter next person's information:");
System.out.print("height (in inches)? ");
double height = console.nextDouble();
System.out.print("weight (in pounds)? ");
double weight = console.nextDouble();
System.out.println();
double bodyMass = bmi(height, weight);
return bodyMass;
}
// Computes/returns a person's BMI based on their height and weight.
public static double bmi(double height, double weight) {
return (weight * 703 / (height * height));
}
// Outputs information about a person's BMI and weight status.
public static void report(int number, double bmi) {
System.out.println("Person " + number + " BMI = " + bmi);
if (bmi < 18.5) {
System.out.println("underweight");
} else if (bmi < 25) {
System.out.println("normal");
} else if (bmi < 30) {
System.out.println("overweight");
} else {
System.out.println("obese");
}
}
}
Scanners as parameters
• If many methods need to read input, declare a Scanner in main and pass
it to the other methods as a parameter.
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
int sum = readSum3(console);
System.out.println("The sum is " + sum);
}
// Prompts for 3 numbers and returns their sum.
public static int readSum3(Scanner console) {
System.out.print("Type 3 numbers: ");
int num1 = console.nextInt();
int num2 = console.nextInt();
int num3 = console.nextInt();
return num1 + num2 + num3;
}
Logical operators
• Tests can beOperator
combined using logical operators:
Description Example Result
&& and (2 == 3) && (-1 < 5) false
|| or (2 == 3) || (-1 < 5) true
! not !(2 == 3) true
p q p && q p || q p !p
• "Truth tables"
truefortrue
each,true
used with
true logical valuestrue
p andfalse
q:
true false false true false true
false true false true
false false false false
Evaluating logic expressions
• Relational operators have lower precedence than math.
5 * 7 >= 3 + 5 * (7 - 1)
5 * 7 >= 3 + 5 * 6
35 >= 3 + 30
35 >= 33
true
• Relational operators cannot be "chained" as in algebra.
2 <= x <= 10 2<=x && x<=10
true <= 10 (assume that x is 15)
error!
• Instead, combine multiple tests with && or ||
2 <= x && x <= 10
true && false
false
Logical questions
• What is the result of each of the following expressions?
int x = 42;
int y = 17;
int z = 25;
• y < x && y <= z
• x % 2 == y % 2 || x % 2 == z % 2
• x <= y + z && x >= y + z
• !(x < y && x < z)
• (x + y) % 2 == 0 || !((z - y) % 2 == 0)
• Answers: true, false, true, true, false
• Exercise: Write a program that prompts for information about a person and uses
it to decide whether to befriend them.
Factoring if/else code
• factoring: Extracting common/redundant code.
• Can reduce or eliminate redundancy from if/else code.
• Example:
if (a == 1) {
System.out.println(a);
x = 3;
b = b + x; System.out.println(a);
} else if (a == 2) { x = 3 * a;
System.out.println(a); if (a == 2) {
x = 6;
y = y + 10; y = y + 10;
b = b + x; }
} else { // a == 3 b = b + x;
System.out.println(a);
x = 9;
b = b + x;
}