updated code

This commit is contained in:
H. Saw 2024-01-16 10:53:45 +00:00
parent 3697c483d3
commit a9c5691dac

View file

@ -1,5 +1,6 @@
package xs_ibdpcompsci_javaintro; package xs_ibdpcompsci_javaintro;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
class RPN_Calculator { class RPN_Calculator {
static void handle_error(int ERROR_TYPE) { static void handle_error(int ERROR_TYPE) {
@ -8,7 +9,7 @@ class RPN_Calculator {
switch (ERROR_TYPE) { switch (ERROR_TYPE) {
case -1: case -1:
// Delete the previous line to allow users to edit it. // Delete the previous line to allow users to edit it.
System.out.println("\033[A"); System.out.print("\r");
break; break;
case -2: case -2:
ERROR_MESSAGE = "Memory exceeded."; ERROR_MESSAGE = "Memory exceeded.";
@ -22,47 +23,60 @@ class RPN_Calculator {
break; break;
}; };
System.out.println(ERROR_MESSAGE); System.out.println(ERROR_MESSAGE);
} };
static ArrayList<Object> request_input() { static ArrayList<Object> request_input() {
Scanner input = new Scanner(System.in);
// Initialize variables. // Initialize variables.
ArrayList<Object> USER_INPUTS = new ArrayList<Object>(); ArrayList<Object> USER_INPUTS = new ArrayList<Object>();
String USER_INPUT_CURRENT = ""; String USER_INPUT_CURRENT = "";
Boolean USER_INPUT_MORE = true; Boolean USER_INPUT_MORE = true;
int USER_INPUT_LENGTH = 0; 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. // Loop for input.
do { do {
Scanner input = new Scanner(System.in); // Determine the length of the existing list.
USER_INPUT_CURRENT = input.nextLine();
USER_INPUT_LENGTH = USER_INPUTS.size(); 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)); USER_INPUTS.add(Double.parseDouble(USER_INPUT_CURRENT));
} else if (USER_INPUTS.size() >= 2) { } else if (USER_INPUT_LENGTH >= 2) {
if (USER_INPUT_CURRENT.matches("[-+\\/*×÷]") && (String.valueOf(USER_INPUTS.get(USER_INPUT_LENGTH-1)).matches("-?\\d+(\\.\\d+)?"))) { if (COMMANDENTRY_OPERATION.matcher(USER_INPUT_CURRENT).find()) {
USER_INPUTS.add(USER_INPUT_CURRENT); if (USER_INPUTS.get(USER_INPUT_LENGTH - 1).getClass() == Double.class) {
} else if (USER_INPUT_CURRENT.isBlank()) { // mathematical symbol input
if (String.valueOf(USER_INPUTS.get(USER_INPUT_LENGTH-1)).isBlank()) { USER_INPUTS.add(USER_INPUT_CURRENT);
System.exit(0);
} else if (String.valueOf(USER_INPUTS.get(USER_INPUT_LENGTH-1)).matches("-?\\d+(\\.\\d+)?")) {
handle_error(-1);
} else { } 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 { } else {
handle_error(-1); handle_error(-1);
}; }
} else if (COMMANDENTRY_EXIT.matcher(USER_INPUT_CURRENT).find()) {
System.exit(0);
} else { } else {
// The user inputs a wrong code. Let the user edit it. // The user inputs a wrong code. Let the user edit it.
handle_error(-1); handle_error(-1);
}; };
} while (USER_INPUT_MORE == true); } while (USER_INPUT_MORE == true);
return (USER_INPUTS); return (USER_INPUTS);
} }
@ -81,29 +95,42 @@ class RPN_Calculator {
for (int ENTRY_CURRENT = 0; ENTRY_CURRENT < ENTRIES_LIST_LENGTH; ENTRY_CURRENT++) { for (int ENTRY_CURRENT = 0; ENTRY_CURRENT < ENTRIES_LIST_LENGTH; ENTRY_CURRENT++) {
if (String.valueOf(ENTRIES_LIST.get(ENTRY_CURRENT)).matches("[-+\\/*×÷]")) { if (String.valueOf(ENTRIES_LIST.get(ENTRY_CURRENT)).matches("[-+\\/*×÷]")) {
OPERATION = String.valueOf(ENTRIES_LIST.get(ENTRY_CURRENT)); OPERATION = String.valueOf(ENTRIES_LIST.get(ENTRY_CURRENT));
if (OPERATION_ITERATIONS <= 0) {OPERATION_RESULT = NUMBERS_CURRENT.get(0); NUMBERS_CURRENT.remove(0);};
OPERATION_RESULT = (OPERATION_ITERATIONS>0) ? OPERATION_RESULT : NUMBERS_CURRENT.get(0);
switch (OPERATION) {
for (int ENTRY_CURRENT_NUMBERS = 1; ENTRY_CURRENT_NUMBERS < NUMBERS_CURRENT.size(); ENTRY_CURRENT_NUMBERS++) { case "*":
if (OPERATION == "*" || OPERATION == "×") { case "×":
OPERATION_RESULT *= NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); for (Double NUMBER_CURRENT : NUMBERS_CURRENT) {
} else if (OPERATION == "/" || OPERATION == "÷") { OPERATION_RESULT *= NUMBER_CURRENT;
if (NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS) != 0) {
OPERATION_RESULT /= (float) ENTRIES_LIST.get(ENTRY_CURRENT - 1);
} else {
handle_error(-3);
break;
}; };
} else if (OPERATION == "+") { break;
OPERATION_RESULT += NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); case "/":
} else if (OPERATION == "-") { case "÷":
OPERATION_RESULT -= NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); for (Double NUMBER_CURRENT : NUMBERS_CURRENT) {
}; if (NUMBER_CURRENT != 0) {
OPERATION_RESULT /= NUMBER_CURRENT;
OPERATION_ITERATIONS++; } 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 { } else {
NUMBERS_CURRENT.add((double) ENTRIES_LIST.get(ENTRY_CURRENT)); NUMBERS_CURRENT.add((double) ENTRIES_LIST.get(ENTRY_CURRENT));
}; };
@ -119,7 +146,8 @@ class RPN_Calculator {
ArrayList<Object> NUMBERS_INPUT = new ArrayList<Object>(); ArrayList<Object> NUMBERS_INPUT = new ArrayList<Object>();
double NUMBER_RESULT; double NUMBER_RESULT;
while (true) { while (true) {
NUMBERS_INPUT = request_input(); NUMBERS_INPUT = request_input();
System.out.println("Solving: "+NUMBERS_INPUT);
NUMBER_RESULT = calculate(NUMBERS_INPUT); NUMBER_RESULT = calculate(NUMBERS_INPUT);
System.out.println(NUMBER_RESULT); System.out.println(NUMBER_RESULT);
} }