From a9c5691dacda03f15d3ac823b2be4a5bba3e3cff Mon Sep 17 00:00:00 2001 From: "H. Saw" <73412182+buzz-lightsnack-2007@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:53:45 +0000 Subject: [PATCH] updated code --- src/xs_ibdpcompsci_javaintro/calculator.java | 108 ++++++++++++------- 1 file changed, 68 insertions(+), 40 deletions(-) diff --git a/src/xs_ibdpcompsci_javaintro/calculator.java b/src/xs_ibdpcompsci_javaintro/calculator.java index c6a9394..c90c1aa 100644 --- a/src/xs_ibdpcompsci_javaintro/calculator.java +++ b/src/xs_ibdpcompsci_javaintro/calculator.java @@ -1,5 +1,6 @@ package xs_ibdpcompsci_javaintro; import java.util.*; +import java.util.regex.Pattern; class RPN_Calculator { static void handle_error(int ERROR_TYPE) { @@ -8,7 +9,7 @@ class RPN_Calculator { switch (ERROR_TYPE) { case -1: // Delete the previous line to allow users to edit it. - System.out.println("\033[A"); + System.out.print("\r"); break; case -2: ERROR_MESSAGE = "Memory exceeded."; @@ -22,47 +23,60 @@ class RPN_Calculator { break; }; System.out.println(ERROR_MESSAGE); - } - + }; static ArrayList request_input() { - + Scanner input = new Scanner(System.in); + // Initialize variables. ArrayList USER_INPUTS = new ArrayList(); String USER_INPUT_CURRENT = ""; Boolean USER_INPUT_MORE = true; int USER_INPUT_LENGTH = 0; + + Pattern COMMANDENTRY_NUMBER = Pattern.compile("-?\\d+(\\.\\d+)?", Pattern.CASE_INSENSITIVE); + Pattern COMMANDENTRY_OPERATION = Pattern.compile("[-+\\/*×÷]", Pattern.CASE_INSENSITIVE); + Pattern COMMANDENTRY_EXIT = Pattern.compile("\\b([Ee]xit|[Qq]|[Tt]erminate|[Qq]uit)\\b", Pattern.CASE_INSENSITIVE); // Loop for input. do { - Scanner input = new Scanner(System.in); - - USER_INPUT_CURRENT = input.nextLine(); + // Determine the length of the existing list. USER_INPUT_LENGTH = USER_INPUTS.size(); + + // Ask for any input. + System.out.print("> "); + USER_INPUT_CURRENT = input.nextLine().trim(); - if (USER_INPUT_CURRENT.matches("-?\\d+(\\.\\d+)?")) { + // Acceptable Entries: + // - number + // - operations after two numbers + // - blank (exit) + if (COMMANDENTRY_NUMBER.matcher(USER_INPUT_CURRENT).find()) { + // number input USER_INPUTS.add(Double.parseDouble(USER_INPUT_CURRENT)); - } else if (USER_INPUTS.size() >= 2) { - if (USER_INPUT_CURRENT.matches("[-+\\/*×÷]") && (String.valueOf(USER_INPUTS.get(USER_INPUT_LENGTH-1)).matches("-?\\d+(\\.\\d+)?"))) { - USER_INPUTS.add(USER_INPUT_CURRENT); - } else if (USER_INPUT_CURRENT.isBlank()) { - if (String.valueOf(USER_INPUTS.get(USER_INPUT_LENGTH-1)).isBlank()) { - System.exit(0); - } else if (String.valueOf(USER_INPUTS.get(USER_INPUT_LENGTH-1)).matches("-?\\d+(\\.\\d+)?")) { - handle_error(-1); + } else if (USER_INPUT_LENGTH >= 2) { + if (COMMANDENTRY_OPERATION.matcher(USER_INPUT_CURRENT).find()) { + if (USER_INPUTS.get(USER_INPUT_LENGTH - 1).getClass() == Double.class) { + // mathematical symbol input + USER_INPUTS.add(USER_INPUT_CURRENT); } else { - USER_INPUT_MORE = false; + // Correct the mathematical operator. + System.out.print("\r\r"+ "> "+ USER_INPUT_CURRENT); + USER_INPUTS.set(USER_INPUT_LENGTH - 1, USER_INPUT_LENGTH); }; + } else if (USER_INPUT_CURRENT.isBlank() && USER_INPUTS.get(USER_INPUT_LENGTH - 1).getClass() == String.class) { + USER_INPUT_MORE = false; } else { handle_error(-1); - }; + } + } else if (COMMANDENTRY_EXIT.matcher(USER_INPUT_CURRENT).find()) { + System.exit(0); } else { // The user inputs a wrong code. Let the user edit it. handle_error(-1); }; } while (USER_INPUT_MORE == true); - return (USER_INPUTS); } @@ -81,29 +95,42 @@ class RPN_Calculator { 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)); - - OPERATION_RESULT = (OPERATION_ITERATIONS>0) ? OPERATION_RESULT : NUMBERS_CURRENT.get(0); - - for (int ENTRY_CURRENT_NUMBERS = 1; ENTRY_CURRENT_NUMBERS < NUMBERS_CURRENT.size(); ENTRY_CURRENT_NUMBERS++) { - if (OPERATION == "*" || OPERATION == "×") { - OPERATION_RESULT *= NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); - } else if (OPERATION == "/" || OPERATION == "÷") { - if (NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS) != 0) { - OPERATION_RESULT /= (float) ENTRIES_LIST.get(ENTRY_CURRENT - 1); - } else { - handle_error(-3); - break; + if (OPERATION_ITERATIONS <= 0) {OPERATION_RESULT = NUMBERS_CURRENT.get(0); NUMBERS_CURRENT.remove(0);}; + + switch (OPERATION) { + case "*": + case "×": + for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { + OPERATION_RESULT *= NUMBER_CURRENT; }; - } else if (OPERATION == "+") { - OPERATION_RESULT += NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); - } else if (OPERATION == "-") { - OPERATION_RESULT -= NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); - }; - - OPERATION_ITERATIONS++; + break; + case "/": + case "÷": + for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { + 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; + }; + break; + case "-": + for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { + OPERATION_RESULT -= NUMBER_CURRENT; + }; + break; + default: + break; }; - NUMBERS_CURRENT.clear(); + OPERATION_ITERATIONS++; + NUMBERS_CURRENT.clear(); } else { NUMBERS_CURRENT.add((double) ENTRIES_LIST.get(ENTRY_CURRENT)); }; @@ -119,7 +146,8 @@ class RPN_Calculator { ArrayList NUMBERS_INPUT = new ArrayList(); double NUMBER_RESULT; while (true) { - NUMBERS_INPUT = request_input(); + NUMBERS_INPUT = request_input(); + System.out.println("Solving: "+NUMBERS_INPUT); NUMBER_RESULT = calculate(NUMBERS_INPUT); System.out.println(NUMBER_RESULT); }