diff --git a/src/xs_ibdpcompsci_javaintro/calculator.java b/src/xs_ibdpcompsci_javaintro/calculator.java index c90c1aa..3c00d2c 100644 --- a/src/xs_ibdpcompsci_javaintro/calculator.java +++ b/src/xs_ibdpcompsci_javaintro/calculator.java @@ -3,13 +3,27 @@ import java.util.*; import java.util.regex.Pattern; class RPN_Calculator { + static void line_clear(int TIMES) { + TIMES = Math.abs(TIMES); + + if (TIMES > 0) { + for (int CLEAR_INSTANCES = 0; CLEAR_INSTANCES < TIMES; CLEAR_INSTANCES++) { + System.out.print(String.format("\033[2K",2)); + System.out.print(String.format("\033[%dA",2)); // Move up + System.out.print(String.format("\033[2K",2)); + System.out.print("\n"); + }; + }; + } + + static void handle_error(int ERROR_TYPE) { String ERROR_MESSAGE = ""; switch (ERROR_TYPE) { case -1: // Delete the previous line to allow users to edit it. - System.out.print("\r"); + line_clear(1); break; case -2: ERROR_MESSAGE = "Memory exceeded."; @@ -61,10 +75,12 @@ class RPN_Calculator { USER_INPUTS.add(USER_INPUT_CURRENT); } else { // Correct the mathematical operator. - System.out.print("\r\r"+ "> "+ USER_INPUT_CURRENT); - USER_INPUTS.set(USER_INPUT_LENGTH - 1, USER_INPUT_LENGTH); + line_clear(1); + System.out.print("> "+ USER_INPUT_CURRENT); + USER_INPUTS.set(USER_INPUT_LENGTH - 1, USER_INPUT_CURRENT); }; } else if (USER_INPUT_CURRENT.isBlank() && USER_INPUTS.get(USER_INPUT_LENGTH - 1).getClass() == String.class) { + line_clear(1); USER_INPUT_MORE = false; } else { handle_error(-1); @@ -75,7 +91,6 @@ class RPN_Calculator { // The user inputs a wrong code. Let the user edit it. handle_error(-1); }; - } while (USER_INPUT_MORE == true); return (USER_INPUTS); @@ -88,49 +103,47 @@ class RPN_Calculator { String OPERATION = ""; double OPERATION_RESULT = 0; - ArrayList NUMBERS_CURRENT = new ArrayList(); + Queue NUMBERS_CURRENT = new ArrayDeque(); // TO DO: fix entries search if (ENTRIES_LIST_LENGTH > 1) { for (int ENTRY_CURRENT = 0; ENTRY_CURRENT < ENTRIES_LIST_LENGTH; ENTRY_CURRENT++) { if (String.valueOf(ENTRIES_LIST.get(ENTRY_CURRENT)).matches("[-+\\/*×÷]")) { OPERATION = String.valueOf(ENTRIES_LIST.get(ENTRY_CURRENT)); - if (OPERATION_ITERATIONS <= 0) {OPERATION_RESULT = NUMBERS_CURRENT.get(0); NUMBERS_CURRENT.remove(0);}; + if (OPERATION_ITERATIONS <= 0) {OPERATION_RESULT = NUMBERS_CURRENT.poll();}; switch (OPERATION) { case "*": case "×": - for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { - OPERATION_RESULT *= NUMBER_CURRENT; - }; + do { + OPERATION_RESULT *= NUMBERS_CURRENT.poll(); + } while (!NUMBERS_CURRENT.isEmpty()); break; case "/": case "÷": - for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { - if (NUMBER_CURRENT != 0) { - OPERATION_RESULT /= NUMBER_CURRENT; - } else { - handle_error(-3); - break; - }; - }; + Double NUMBER_CURRENT = NUMBERS_CURRENT.poll(); + if (NUMBER_CURRENT != 0) { + OPERATION_RESULT /= NUMBER_CURRENT; + } else { + handle_error(-3); + break; + }; break; case "+": - for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { - OPERATION_RESULT += NUMBER_CURRENT; - }; + do { + OPERATION_RESULT += NUMBERS_CURRENT.poll(); + } while (!NUMBERS_CURRENT.isEmpty()); break; case "-": - for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { - OPERATION_RESULT -= NUMBER_CURRENT; - }; + do { + OPERATION_RESULT -= NUMBERS_CURRENT.poll(); + } while (!NUMBERS_CURRENT.isEmpty()); break; default: break; }; OPERATION_ITERATIONS++; - NUMBERS_CURRENT.clear(); } else { NUMBERS_CURRENT.add((double) ENTRIES_LIST.get(ENTRY_CURRENT)); }; @@ -140,7 +153,6 @@ class RPN_Calculator { return (OPERATION_RESULT); }; - public static void main(String[] args) { // Initialize the input numbers. ArrayList NUMBERS_INPUT = new ArrayList();