# Lab goals

Goals for this problem set:

• use `if/else` statements to select between multiple code actions
• factor out common redundant code between `if/else` statements

# `if/else` Statements

An if/else statement lets your program choose between 2 or more options.

```if (test) {
statement(s);
} else {
statement(s);
}
```

Example:

```if (gpa >= 2.0) {
System.out.println("Welcome to Mars University!");
} else {
}
```

# Exercise : `if`/`else` mystery

Consider the following Java code. Fill in the boxes with the output produced by each of the method calls.

```public static void mystery(int n) {
System.out.print(n + " ");
if (n > 10) {
n = n / 2;
} else {
n = n + 7;
}
if (n * 2 < 25) {
n = n + 10;
}
System.out.println(n);
}
```
 `mystery(40);` `40 20` `mystery(8);` `8 15` `mystery(0);` `0 17` `mystery(12);` `12 16` `mystery(20);` `20 20`

# Exercise 2: numUnique

Write a method named `numUnique` that accepts three integers as parameters and that returns the number of unique integers among the three. For example, the call `numUnique(18, 3, 4)` should return 3 because the parameters have 3 different values. By contrast, the call `numUnique(6, 7, 6)` would return 2 because there are only 2 unique numbers among the three parameters: 6 and 7.

Compare your solution to your neighbors'. Did you all solve it the same way?

• (Try solving this problem in Practice-It by clicking the icon above.)

Write a method `quadrant` that accepts a pair of real numbers x and y and returns the quadrant for that point: For example, `quadrant(-2.3, 14.2)` returns 2. If the point falls directly on either axis, return 0.

• (Try solving this problem in Practice-It by clicking the icon above.)

# `if`/`else` factoring

• It's easy to introduce redundancy in the branches of an `if`/`else`. For example:
```if (x < 30) {
a = 2;
x++;
System.out.println("CSE 142 TAs are awesome! " + x);
} else {
a = 2;
System.out.println("CSE 142 TAs are awesome! " + x);
}
```
• The code can be factored out to become: (notice that the `else` went away!)
```a = 2;
if (x < 30) {
x++;
}
System.out.println("CSE 142 TAs are awesome! " + x);
```

# Exercise : `if`/`else` Factoring

• Download the following program FactorExample.java to your machine and open it with jGrasp.
• The program's method is redundant. Factor the method, restructuring the code to eliminate unnecessary statements while retaining the same behavior.
• Insert some test calls of the method in `main` and run it to make sure it works properly.

# Exercise : Syntax errors

• The following Java program has 7 errors. Can you find all of them?  ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ``` ```public class IfOops { public static void main(String[] args) { int a = 7, b = 42; minimum(a, b); if {smaller = a} { System.out.println("a is the smallest!"); } } public static void minimum(int a, int b) { // returns which int is smaller if (a < b) { int smaller = a; } else (a => b) { int smaller = b; } return int smaller; } } ```
• Copy and paste the code into jGrasp and see if you can fix the errors.

1. line 5: `if` statement should use `()` parentheses, not `{}` brackets
2. line 5: `=` should be `==`
3. line 5: `smaller` is out of scope here
4. line 10: `void` should be `int`
5. line 13: `=>` should be `>=` (or better yet, no `if` test is needed)
6. line 16: should not write variable's type of `int` when returning it
7. line 16: `int smaller` is out of scope here (declare outside `if` or return directly)

# Exercise - Corrected version

• ```public class IfOops {
public static void main(String[] args) {
int a = 7, b = 42;
int smaller = minimum(a, b);
if (smaller == a) {
System.out.println("a is the smallest!");
}
}

public static void int minimum(int a, int b) {  // returns which int is smaller
int smaller;
if (a < b) {
int smaller = a;
} else if (a >= b) {
int smaller = b;
}
return int smaller;
}
}
```

# Exercise : AgeCheck

• Copy/paste and save the following program in jGRASP, then see the instructions on the next slide.
```public class AgeCheck {
public static void main(String[] args) {
int myAge = 19;   // I am 19; let me see if I can drive
message(myAge);
}

// Displays message about driving to user based on given age
public static void message(int age) {
if (myAge >= 16) {
System.out.println("I'm old enough to drive!");
}
if (myAge <= 16) {
System.out.println("Not old enough yet... :*(");
}
}
}
```

# Exercise - things to fix

• The program has a few syntax errors. Fix them until it compiles.
• The code has a logic problem. (For some value(s), it prints the wrong answer.) Find any such problems and fix them. (You may need to run the program a few times and try different values to see which ones fail.)
• The program uses `if` and `else` in a clumsy way. Improve the style of the code.

• The following is a corrected version of the program:
```public class AgeCheck {
public static void main(String[] args) {
int myAge = 19;   // I am 19; let me see if I can drive
message(myAge);
}

// Displays a message about driving to user based on given age
public static void message(int age) {
if (age >= 16) {
System.out.println("I'm old enough to drive!");
} else {
System.out.println("Not old enough yet... :*(");
}
}
}
```

# Exercise : AgeCheck2

• Now replace your previous `AgeCheck` program's `message` method with:
```    // Possibly prints some message(s) to the user based on the given age
public static void message(int age) {
if (age >= 21) {
System.out.println("I can legally purchase alcohol!");
} else if (age >= 17) {
System.out.println("I can purchase a ticket to an R-rated movie.");
} else if (age >= 16) {
System.out.println("I can get my driver's license!");
}
}
```
• For some age(s), the message(s) printed are not accurate. (In some cases, it should print no messages; in some cases, one message; and in others, many messages.) Improve the usage of `if`s and `else`s in this method to behave properly.

# Exercise 8: seeMovie

You're thinking about going with your friends to a movie. Write a Java method `seeMovie` that accepts two parameters: the cost of a ticket in dollars, and the rating number of stars the movie received out of 5. The method should print how interested you are (very, sort-of, or not). Use the following criteria:

• You like bargains. Any movie that costs less than \$5.00 is one that you want to see very much.
• You dislike expensive movies. You are not interested in seeing any movie that costs \$12.00 or more, unless it got 5 stars (and even then, you are only sort-of interested).
• You like quality. You are very interested in seeing 5-star movies that cost under \$12.00.
• You are sort-of interested in seeing movies costing between \$5.00 - \$11.99 that also got between 2-4 stars inclusive.
• You are not interested in seeing any other movies not described previously.