### 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
]