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,10 +23,10 @@ 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>(); | ||||||
|  | @ -33,29 +34,43 @@ class RPN_Calculator { | ||||||
| 		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(); | ||||||
| 			 | 			 | ||||||
| 			if (USER_INPUT_CURRENT.matches("-?\\d+(\\.\\d+)?")) { | 			// Ask for any input.  | ||||||
|  | 			System.out.print("> "); | ||||||
|  | 			USER_INPUT_CURRENT = input.nextLine().trim(); | ||||||
|  | 
 | ||||||
|  | 			// 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); | ||||||
|  | @ -63,7 +78,6 @@ class RPN_Calculator { | ||||||
| 			 | 			 | ||||||
| 		} 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) { | ||||||
| 					 | 						case "*": | ||||||
| 					for (int ENTRY_CURRENT_NUMBERS = 1; ENTRY_CURRENT_NUMBERS < NUMBERS_CURRENT.size(); ENTRY_CURRENT_NUMBERS++) { | 						case "×": | ||||||
| 						if (OPERATION == "*" || OPERATION == "×") { | 							for (Double NUMBER_CURRENT : NUMBERS_CURRENT) { | ||||||
| 							OPERATION_RESULT *= NUMBERS_CURRENT.get(ENTRY_CURRENT_NUMBERS); | 								OPERATION_RESULT *= NUMBER_CURRENT; | ||||||
| 						} 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; |  | ||||||
| 							}; | 							}; | ||||||
| 						} 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)); | ||||||
| 				}; | 				}; | ||||||
|  | @ -120,6 +147,7 @@ class RPN_Calculator { | ||||||
| 		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