### Solution for Programming Exercise 3.3

THIS PAGE DISCUSSES ONE POSSIBLE SOLUTION to the following exercise from this on-line Java textbook.

Exercise 3.3: Write a program that will evaluate simple expressions such as 17 + 3 and 3.14159 * 4.7. The expressions are to be typed in by the user. The input always consist of a number, followed by an operator, followed by another number. The operators that are allowed are +, -, *, and /. You can read the numbers with TextIO.getDouble() and the operator with TextIO.getChar(). Your program should read an expression, print its value, read another expression, print its value, and so on. The program should end when the user enters 0 as the first number on the line.

Discussion

We need a loop to read and evaluate expressions. It's easiest to use a break statement to end the loop at the appropriate time:

```            Repeat indefinitely:
Get the user's input.
if the first number is 0:
Break out of the loop
Find the value of the expression
Display the value.
```

Getting the user's input involves reading three data values. We need three variables to store these values. It's best to test whether the first number is 0 right after we read it, so the user will just have to type a 0 to end the program, not a complete expression such as 0 + 0. "Repeat indefinitely" can be written as "while (true)":

```            while (true):
Let firstNum = TextIO.getDouble()
if firstNum is 0:
Break out of the loop
Let operator = TextIO.getChar()
Let secondNum = TextIO.getlnDouble()
Find the value of the expression
Display the value.
```

To evaluate the user's expression, we have to test the operator to find out which operation to compute. We can do this with either a multi-way if statement or with a switch statement. In the program below, I use a switch. The if statement would be:

```                 if ( operator == '+' )
value = firstNum + secondNum;
else if ( operator == '-' )
value = firstNum - secondNum;
else if ( operator == '*' )
value = firstNum * secondNum;
else if ( operator == '/' )
value = firstNum / secondNum;
else {
TextIO.putln("Unknown operator: " + operator);
continue;  // back to start of loop
}
```

The computer won't let you get away without the else part of the if statement or the default case in the switch, since that would leave a possibility that the variable, value, is not assigned a value before it is printed out.

This program could be improved by having it print out an error message if the user tries to divide by zero.

The Solution

```    public class SimpleCalculator {

/*  This program evaluates simple expressions such as 2 + 2
and 34.2 * 7.81, consisting of a number, an operator,
and another number.  The operators +, -, *, / are allowed.
The program will read and evaluate expressions until
the user inputs a line that starts with the number 0.
*/

public static void main(String[] args) {

double firstNum;    // First number in the expression.
double secondNum;   // Second number in the expression.
char operator;      // The operator in the expression.
double value;       // The value of the expression.

TextIO.putln("Enter expressions such as  2 + 2  or  34.2 * 7.81");
TextIO.putln("using any of the operators +, -, *, /.");
TextIO.putln("To end, enter a 0.");
TextIO.putln();

while (true) {

/* Get user's input, ending program if first number is 0. */

TextIO.put("? ");
firstNum = TextIO.getDouble();
if (firstNum == 0)
break;
operator = TextIO.getChar();
secondNum = TextIO.getlnDouble();

/* Compute the value of the expression. */

switch (operator) {
case '+':
value = firstNum + secondNum;
break;
case '-':
value = firstNum - secondNum;
break;
case '*':
value = firstNum * secondNum;
break;
case '/':
value = firstNum / secondNum;
break;
default:
TextIO.putln("Unknown operator: " + operator);
continue;  // Back to start of loop!
} // end switch

/* Display the value. */

TextIO.putln("Value is " + value);
TextIO.putln();

} // end while

TextIO.putln("Good bye");

}  // end main()

}  // end class
```

[ Exercises | Chapter Index | Main Index ]