diff --git a/src/tse/LR_1.java b/src/tse/LR_1.java index 8b44f92..81e3869 100644 --- a/src/tse/LR_1.java +++ b/src/tse/LR_1.java @@ -1,7 +1,6 @@ package tse; -import tse.lr1.ImageScaleDown; -import tse.lr1.Triangle; +import tse.lr1.*; /** * @author aNNiMON @@ -18,6 +17,7 @@ public class LR_1 implements ILabRab { public void execute(int index) { switch(index) { case 0: + Calculator.main(); break; case 1: Triangle.main(); diff --git a/src/tse/lr1/Calculator.java b/src/tse/lr1/Calculator.java new file mode 100644 index 0000000..b05d14d --- /dev/null +++ b/src/tse/lr1/Calculator.java @@ -0,0 +1,121 @@ +package tse.lr1; + +import java.util.Scanner; + +/** + * Калькулятор + * @author aNNiMON + */ +public class Calculator { + + public static void main() { + double result = 0.0d; + + Scanner scanner = new Scanner(System.in); + System.out.println("Введите данные:"); + do { + String line = scanner.nextLine().trim(); + if (line.equalsIgnoreCase("quit")) return; + + char operation = '+'; + double operandA = 0, operandB = 0; + + // Блок парсинга + String[] items = line.split(" "); + switch(items.length) { + case 1: + String param1 = items[0].trim(); + if (isNumber(param1)) { + // Если пришло число, складываем с предыдущим результатом + operandA = result; + operandB = getNumber(param1); + } else if (isOperator(param1)) { + // Если оператор, то выполняем операцию (res oper res) + operandA = result; + operandB = result; + operation = getOperator(param1); + } + break; + case 2: + param1 = items[0].trim(); + String param2 = items[1].trim(); + if (isOperator(param1) && isNumber(param2)) { + operandA = result; + operandB = getNumber(param2); + operation = getOperator(param1); + } + break; + case 3: + param1 = items[0].trim(); + param2 = items[1].trim(); + String param3 = items[2].trim(); + if (isNumber(param1) && isOperator(param2) && isNumber(param3)) { + operandA = getNumber(param1); + operandB = getNumber(param3); + operation = getOperator(param2); + } + break; + default: + // Принимается максимум три параметра (a oper b) + System.out.println("Error"); + return; + } + + // Блок расчёта + switch(operation) { + case '+': + result = operandA + operandB; + break; + case '-': + result = operandA - operandB; + break; + case '*': + result = operandA * operandB; + break; + case '/': + if (operandB == 0.0) { + System.out.println("Error: ∞"); + } else result = operandA / operandB; + break; + case '^': + result = Math.pow(operandA, operandB); + break; + } + + System.out.println("Результат: " + result); + + } while (true); + } + + private static Double getNumber(String text) { + try { + return Double.parseDouble(text); + } catch (Exception ex) { + return 0.0d; + } + } + + private static boolean isNumber(String text) { + try { + Double.parseDouble(text); + return true; + } catch (Exception ex) { + return false; + } + } + + private static char getOperator(String text) { + return text.charAt(0); + } + + private static boolean isOperator(String text) { + if (text.length() != 1) return false; + + char symbol = text.charAt(0); + char[] operations = "+-*/^".toCharArray(); + for (char ch : operations) { + if (ch == symbol) return true; + } + return false; + } +}