updated code
This commit is contained in:
parent
3697c483d3
commit
a9c5691dac
1 changed files with 68 additions and 40 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue