I am trying to develop a calculator program that inputs an arithmetic expression of the form number operator number =
and computes the result of the expression. The expression will be evaluated from left to right not considering regular operator precedence. For example, the expression 14 - 5 * 3 =
will produce 27.0
. The value =
displays the final result and terminates the program.
I’ve been trying to fix this for a couple of days now, but it outputs the wrong answer whenever I enter an expression with more than two numbers. For instance, 2.8 + 2 - 9.5
should equal -4.7
but the program outputs -6.7
. Any idea why that is the case?
import java.util.Scanner; public class Calculator { // Compute an arithmetic expression public static void main(String[] args) { // Declare the identifiers final String END = "="; String input; double num1 = 0; double num2 = 0; char operator = 0; Scanner scnr = new Scanner (System.in); System.out.println("Enter your numeric expression in the following form: "); System.out.println("number operator number operator number = "); System.out.println("Leave a blank space after each number or operator."); System.out.println("Example: 3.5 * 3 - 5 / 2.5 ="); // Input the first item System.out.print("> "); input = scnr.next(); // Process the first item and input and process the rest of the items while (!input.equals(END)){ switch (input){ case "+": operator = '+'; System.out.println("> Operator is: " + operator); break; case "-": operator = '-'; System.out.println("> Operator is: " + operator); break; case "*": operator = '*'; System.out.println("> Operator is: " + operator); break; case "/": operator = '/'; System.out.println("> Operator is: " + operator); break; default: // a number was entered if (num1 == 0) { num1 = Double.parseDouble(input); System.out.println("> Num1 is: " + num1); } else { num2 = Double.parseDouble(input); System.out.println("> Num2 is: " + num2); } } // end of switch if (num1 != 0 && num2 != 0) { System.out.println("Num2 before calc is " + num2); switch (operator) { case '+': num2 = num1 + num2; break; case '-': num2 = num1 - num2; break; case '*': num2 = num1 * num2; break; case '/': num2 = num1 / num2; break; default: } } input = scnr.next(); } // end of while-loop // Display the answer System.out.println("> Answer is: " + num2); System.out.println("Have a nice day!"); } }
Advertisement
Answer
In order to make it work, try to:
- in your 2nd switch statement, change
num2 = num1 + num2;
intonum1 = num1 + num2;
. Do this for all cases; - I added an
isOperator
boolean to skip computing the operation if input is an operator.
Full code below:
import java.util.Scanner; public class Calculator { // Compute an arithmetic expression public static void main(String[] args) { // Declare the identifiers final String END = "="; String input; double num1 = 0; double num2 = 0; char operator = 0; boolean isOperator; Scanner scnr = new Scanner (System.in); System.out.println("Enter your numeric expression in the following form: "); System.out.println("number operator number operator number = "); System.out.println("Leave a blank space after each number or operator."); System.out.println("Example: 3.5 * 3 - 5 / 2.5 ="); // Input the first item System.out.print("> "); input = scnr.next(); // Process the first item and input and process the rest of the items while (!input.equals(END)){ isOperator = true; switch (input){ case "+": operator = '+'; System.out.println("> Operator is: " + operator); break; case "-": operator = '-'; System.out.println("> Operator is: " + operator); break; case "*": operator = '*'; System.out.println("> Operator is: " + operator); break; case "/": operator = '/'; System.out.println("> Operator is: " + operator); break; default: // a number was entered isOperator = false; if (num1 == 0) { num1 = Double.parseDouble(input); System.out.println("> Num1 is: " + num1); } else { num2 = Double.parseDouble(input); System.out.println("> Num2 is: " + num2); } } // end of switch // do not compute the operation if the input is an operator and num1,num2 != 0 if (num1 != 0 && num2 != 0 && !isOperator) { System.out.println("Num2 before calc is " + num2); switch (operator) { case '+': num1 = num1 + num2; break; case '-': num1 = num1 - num2; break; case '*': num1 = num1 * num2; break; case '/': num1 = num1 / num2; break; default: } } input = scnr.next(); } // end of while-loop // Display the answer System.out.println("> Answer is: " + num1); System.out.println("Have a nice day!"); } }
Edit: As mentioned in the comments, the code does not treat the cases when the user inputs 0
. Below, I removed the if(num1 == 0)
and if (num1 != 0 && num2 != 0)
conditions:
import java.util.Scanner; public class Calculator { // Compute an arithmetic expression public static void main(String[] args) { // Declare the identifiers final String END = "="; String input; double result = 0; double num = 0; char operator = 0; boolean isOperator; Scanner scnr = new Scanner (System.in); System.out.println("Enter your numeric expression in the following form: "); System.out.println("number operator number operator number = "); System.out.println("Leave a blank space after each number or operator."); System.out.println("Example: 3.5 * 3 - 5 / 2.5 ="); // Input the first item System.out.print("> "); input = scnr.next(); // Process the first item and input and process the rest of the items while (!input.equals(END)){ isOperator = true; switch (input){ case "+": operator = '+'; System.out.println("> Operator is: " + operator); break; case "-": operator = '-'; System.out.println("> Operator is: " + operator); break; case "*": operator = '*'; System.out.println("> Operator is: " + operator); break; case "/": operator = '/'; System.out.println("> Operator is: " + operator); break; default: // a number was entered isOperator = false; num = Double.parseDouble(input); System.out.println("> Num is: " + num); } // end of switch // do not compute the operation if the input is an operator if (!isOperator) { System.out.println("Result before calc is " + result); switch (operator) { case '+': result += num; break; case '-': result -= num; break; case '*': result *= num; break; case '/': result /= num; break; default: result += num; } } input = scnr.next(); } // end of while-loop // Display the answer System.out.println("> Answer is: " + result); System.out.println("Have a nice day!"); } }