Conditional Statements: Unit 5
Conditional Statements: Unit 5
Conditional statements
Summary
• The if-else and if statements
• Block of statements
• Conditional expression
• Comparison between objects
• The switch statement
if (condition )
then-statement
else
else-statement
• condition is an expression of type boolean, i.e., a conditional expression that is evaluated to true or
false
• then-statement is a single statement (also called the then-branch of the if-else statement)
• else-statement is a single statement (also called the else-branch of the if-else statement)
1
2 UNIT 5
Semantics:
First, the condition is evaluated. If the result of the evaluation is the value true, the then-statement is
executed, otherwise the else-statement is executed. In both cases, the execution continues with the statement
immediately following the if-else statement.
Example:
int a, b;
...
if (a > b)
System.out.println("bigger value = " + a);
else
System.out.println("bigger value = " + b);
When this if-else statement is executed, the string "bigger value = " followed by the bigger one among a
and b is printed on the output channel (the monitor).
boolean finished;
...
if (finished)
...
• one of the comparison operators (==, !=, >, <, >=, or <=) applied to variables (or expressions) of a primitive
type;
Example:
int a, b, c;
...
if (a > b + c)
...
• a call to a predicate (i.e., a method that returns a value of type boolean);
Example:
String answer;
...
if (answer.equalsIgnoreCase("YES"))
...
• a complex boolean expression, obtained by applying the boolean operators !, &&, and || to simpler
expressions;
Example:
int a, b, c, d;
String answer;
...
if ((a > (b+c)) || (a == d) && !answer.equalsIgnoreCase("YES"))
...
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 3
if (condition )
then-statement
• condition is an expression of type boolean
• then-statement is a single statement (also called the then-branch of the if statement)
Semantics:
First, the condition is evaluated. If the result of the evaluation is the value true, the then-statement is
executed, and the execution continues with the statement immediately following the if statement. Otherwise,
the execution continues directly with the statement following the if statement.
Example:
boolean found;
...
if (!found)
System.out.println("element not found");
When this if statement is executed, the string "element not found" is printed on the output channel, provided
the value of the boolean variable found is false.
{
statement
...
statement
}
• statement is an arbitrary Java statement
Semantics:
The statements in the block are executed in sequence. The variables declared inside the block are not visible
outside the block itself.
Example:
int a, b, bigger;
...
if (a > b) {
bigger = a;
System.out.println("smaller = " + b);
}
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
4 UNIT 5
int i = 1;
{
System.out.println(a);
// OK. a is visible - prints Hello
//int i;
// ERROR. i is visibile and cannot be redeclared
{
double r = 5.5; // OK
i = i + 1; // OK. i is still visible
System.out.println(r); // OK. r is visible - prints 5.5
}
{
int r = 4; // OK. previous r is not visible anymore
System.out.println(a);
// OK. a is still visibile - prints Hello
}
}
i = i + 1; // OK. i is visible
System.out.println(i); // OK. i is visible - prints 3
}
}
5.9 Nested if ’s
We have a nested if when the then-branch or the else-branch of an if-else statement is again an if-else or
an if statement.
Example: Given day, month, and year, compute day, month, and year of the next day.
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 5
nextYear = year;
}
} else {
...
}
if (a > 0)
if (b > 0)
System.out.println("b positive");
else
System.out.println("b negative");
It is always possible to use a block (i.e., {..}) to disambiguate nested if-else statements. In particular, if we
want that an else refers to an if that is not the immediately preceding one, we have to enclose the immediately
preceding if in a block. For example:
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
6 UNIT 5
if (a > 0) {
if (b > 0)
System.out.println("b positive");
} else
System.out.println("a negative");
String s;
...
if (s != null && s.length() > 0) {
System.out.println(s);
}
In this case, when the value of s is null then s.length()>0 is not evaluated and the method length() is not
called. Note that, if Java evaluated s.length()>0 also when s is null, then the above code would be wrong,
since it would cause trying to access via s a nonexistent object.
Note: In general, if-else statements that make use of complex boolean conditions could be rewritten by
making use of nested if-else statements. However, to do so, it may be necessary to duplicate code. We
illustrate this in the following separately for && and ||.
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 7
if (x < y)
if (y < z)
System.out.println("y is between x and z");
else
System.out.println("y is not between x and z");
else
System.out.println("y is not between x and z");
In this case, by eliminating the complex condition, the code of the else-branch must be duplicated.
Note that, due to shortcut evaluation, the second condition in the && is not evaluated if the first condition is
false. And this holds also for the corresponding nested if-else statements.
if ((x == 1) || (x == 2))
System.out.println("x equal to 1 or to 2");
else
System.out.println("x different from 1 and from 2");
corresponds to
if (x == 1)
System.out.println("x equal to 1 or to 2");
else if (x == 2)
System.out.println("x equal to 1 or to 2");
else
System.out.println("x different from 1 and from 2");
In this case, by eliminating the complex condition, the code of the then-branch must be duplicated.
Again, due to shortcut evaluation, the second condition in the || is not evaluated if the first condition is true.
And this holds also for the corresponding nested if-else statements.
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
8 UNIT 5
The statement in the example, which makes use of a conditional expression, is equivalent to:
if (a > b)
System.out.println("bigger value = " + a);
else
System.out.println("bigger value = " + b);
Note that the selection operator is similar to the if-else statement, but it works at a different syntactic level:
• The selection operator combines expressions and returns another expression. Hence it can be used wher-
ever an expression can be used.
• The if-else statement groups statements, and the result is a composite statement.
String input;
...
if (input == "YES") { ... } // This is WRONG!!!
if (input.equals("YES")) { ... } // This is CORRECT!!!
Indeed, == tests the equality between two references to an object, and this corresponds to test the identity of
the two objects (i.e., that the two objects are in fact the same object). Instead, equals tests that the two
objects have the same content (i.e., that the two strings are constituted by the same sequences of characters).
Example:
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 9
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
10 UNIT 5
// constructor
public TimeOfDay(int h, int m, int s)
// adds a time
public void add(TimeOfDay t)
// subtracts a time
public void subtract(TimeOfDay t)
// predicate to test for precedence
public boolean precedes(TimeOfDay t)
// predicate to test for equality
public boolean equalTo(TimeOfDay t)
// method toString
public String toString()
Example of usage:
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 11
// we represent a time of the day by the total number of seconds since midnight
private int totsec;
switch (expression ) {
case label-1 : statements-1
break;
...
case label-n : statements-n
break;
default: default-statements
}
• expression is an expression of an integer type or of type char
• label-1 ,. . . , label-n are constant integer (or character) expressions; in other words, the expressions can
contain only integer (or character) literals or constants that are initialized with constant expressions; the
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
12 UNIT 5
int i;
...
switch (i) {
case 0: System.out.println("zero"); break;
case 1: System.out.println("one"); break;
case 2: System.out.println("two"); break;
default: System.out.println("less than zero or greater than two");
}
When i is equal to 0 (respectively, 1, 2) then "zero" (respectively "one", "two") is printed; when i is less than
0 or greater than two, then "less than zero or greater than two" is printed.
Note: If we have more than one values of the expression for which we want to execute the same statements,
we can group together different cases:
case 2:
daysOfMonth = 28;
break;
default:
daysOfMonth = 0;
System.out.println("Month is not valid");
}
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 13
The values specified by the various case label s must be constant expressions, i.e., their value must be known
at compile time. In particular, they cannot be expressions that refer to variables.
The following code fragment is wrong:
int a;
...
switch (a) {
case a<0: System.out.println("negative");
// ERROR! a<0 is not a constant expression
case 0: System.out.println("zero");
case a>0: System.out.println("positive");
// ERROR! a>0 is not a constant expression
}
It follows that the usefulness of the switch statement is limited.
switch (expression ) {
case label-1 : statements-1
...
case label-n : statements-n
default: default-statements
}
• expression is an expression of an integer type or of type char
• label-1 ,. . . , label-n are constant integer (or character) expressions; in other words, the expressions can
contain only integer (or character) literals or constants that are initialized with constant expressions; the
values of two different labels cannot coincide
• statements-1 ,. . . , statements-n and default-statements are arbitrary sequences of statements
• the default part is optional
Semantics:
1. First, expression is evaluated.
2. Then, the first i is found for which the value of label-i is equal to the value of expression .
3. If there is such an i , then statements-i , statements-i+1 , . . . are executed in sequence until the first
break statement or the end of the switch statement;
otherwise default-statements are executed.
4. The execution continues with the statement immediately following the switch statement.
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
14 UNIT 5
Exercises
Exercise 5.1. Write a program that reads a real number and prints a message according to the following
table:
alcohol content g message
40 < g extra strong liquor
20 < g ≤ 40 strong liquor
15 < g ≤ 20 liquor
12 < g ≤ 15 strong vine
10.5 < g ≤ 12 normal vine
g ≤ 10.5 light vine
Exercise 5.2. Write a program that reads from input the lengths of the three sides of a triangle and determines
the type of the triangle according to the following algorithm:
compare each pair of sides and count home many pairs are equal
if (the number of equal pairs is 0 )
it is irregular
else if (the number of equal pairs is 1 )
it is symmetric
else
it is regular
Exercise 5.3. Write a program that reads from input the lengths of the three sides of a triangle and determines
the type of the triangle by using if-else statements with complex conditions.
Exercise 5.4. Realize a Java class to represent triangles, on which the following functionalities are defined:
• creation of a triangle, given the lenghts of the three sides;
• return of the length of the longest side, the intermediate side, and the shortest side;
• test whether the three sides can actually be the sides of a triangle; i.e., they respect the triangular
inequality, which states that the longest side is shorter than the sum of the other two;
• return of the perimeter of the triangle;
• return of the area of the triangle; notice that, given
p the lengths a, b, and c of the three sides of a triangle,
the area A can be computed according to A = s · (s − a) · (s − b) · (s − c), where s = (a + b + c)/2 is
the semiperimeter;
• return of a string representing the type of the triangle, which may be either regular, symmetric, or irregular.
Write also a program to test all functionalities of the class representing triangles.
Exercise 5.5. Write a program that reads from input the coefficients a, b, c of the quadratic equation
a · x2 + b · x + c = 0 and computes the zeroes of the equation.
Depending on the sign of the discriminant b2 − 4 · a · c, the program should print the two distinct real solutions,
the real double solution, or the two complex solutions.
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05
Conditional statements 15
Exercise 5.6. Write a program that reads from input a line of text containing a YES/NO question (without
final question mark) and prints an answer to the question according to the following rules:
1. if the line starts with a vocal, the answer is "MAYBE".
2. if the last letter of the line is "a", "i", or "u", the answer is "YES";
3. if the last letter of the line is "e" or "o", the answer is "NO";
4. if the last letter of the line is a character different from "a", "e", "i", "o", "u", the answer is
"DON’T KNOW";
Note: When two rules can be applied, the answer is obtained by concatenating the answers for the two rules.
Exercise 5.7. Realize a Java class to represent dates, on which the following functionalities are defined:
• creation of a date, given day, month, and year;
• return of day, month, and year;
• test whether two dates are equal;
• test whether a date precedes another date;
• test whether the year of a date is a leap year;
• compute the date of the next day.
Write also a program to test all functionalities of the class representing dates.
c
°Diego Calvanese Lecture Notes for Introduction to Programming A.A. 2004/05