From d449e5f76a9abc01cf778477caf23d32191b5fc1 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 2 Mar 2017 01:10:55 +0300 Subject: [PATCH 1/8] 1 task --- homework-g596-narsia/pom.xml | 28 +++ .../g596/narsia/task1/MyCalculator.java | 228 ++++++++++++++++++ pom.xml | 1 + 3 files changed, 257 insertions(+) create mode 100644 homework-g596-narsia/pom.xml create mode 100644 homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java diff --git a/homework-g596-narsia/pom.xml b/homework-g596-narsia/pom.xml new file mode 100644 index 000000000..6f94e79f6 --- /dev/null +++ b/homework-g596-narsia/pom.xml @@ -0,0 +1,28 @@ + + + + mipt-java-2016 + ru.mipt.java2016 + 1.0.0 + + 4.0.0 + + homework-g596-narsia + + + ru.mipt.java2016 + homework-base + 1.0.0 + + + ru.mipt.java2016 + homework-tests + 1.0.0 + test + + + + + \ No newline at end of file diff --git a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java new file mode 100644 index 000000000..314d81ea7 --- /dev/null +++ b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java @@ -0,0 +1,228 @@ +package ru.mipt.java2016.homework.g596.narsia.task1; + +import ru.mipt.java2016.homework.base.task1.Calculator; +import ru.mipt.java2016.homework.base.task1.ParsingException; + +import java.util.*; + +public class MyCalculator implements Calculator{ + + private String NUMBERS = "0123456789."; + private String OPERATORS = "+-*/"; + + @Override + public double calculate(String Expression) throws ParsingException { + if (!isExpressionCorrect(Expression)) { + throw new ParsingException("Invalid expression"); + } + String PostfixExpression = getRPN(Expression); + return calculateRPN(PostfixExpression); + } + + private enum SymbolType { + OPENING_BRACKET, CLOSING_BRACKET, NUMBER, OPERATOR, NOTHING + } + + private boolean isExpressionCorrect(String Expression) { + if (Expression == null) { + return false; + } + + SymbolType previousSymbol; + SymbolType currentSymbol = SymbolType.NOTHING; + for (int cnt = 0; cnt < Expression.length(); ++cnt) { + char currentChar = Expression.charAt(cnt); + previousSymbol = currentSymbol; + if (currentChar == ' ' || currentChar == '\n' || currentChar == '\t') { + if (previousSymbol == SymbolType.NUMBER && cnt != Expression.length() - 1 + && NUMBERS.indexOf(Expression.charAt(cnt + 1)) != -1) { + return false; + } // цифра-пробел-цифра + } else { + if (NUMBERS.indexOf(currentChar) != -1) { + currentSymbol = SymbolType.NUMBER; + if (previousSymbol == SymbolType.CLOSING_BRACKET) { + return false; + } // закрывающая скобка-цифра + } else if (OPERATORS.indexOf(currentChar) != -1) { + currentSymbol = SymbolType.OPERATOR; //учитываем отрицательные числа + } else if (currentChar == '(') { + currentSymbol = SymbolType.OPENING_BRACKET; + if (previousSymbol == SymbolType.NUMBER || + previousSymbol == SymbolType.CLOSING_BRACKET) { + return false; //цифра-открывающая скобка, закрывающая-открывающая + } + } else if (currentChar == ')') { + currentSymbol = SymbolType.CLOSING_BRACKET; + if (previousSymbol == SymbolType.OPENING_BRACKET || + previousSymbol == SymbolType.OPERATOR) { + return false; //открывающая-закрывающая, оператор-закрывающая + } + } + } + } + return true; + } + + private static int getPriority(Character ch) throws ParsingException { + if (ch.equals('(') || ch.equals(')')) { + return 0; + } else if (ch.equals('+') || ch.equals('-')) { + return 1; + } else if (ch.equals('*') || ch.equals('/')) { + return 2; + } else if (ch.equals('~')) { + return 3; + } else { + throw new ParsingException("Invalid operator"); + } + } + + + private double getResultOfOperation(double number1, double number2, char operator) throws ParsingException { + if (operator == '+') { + return number1 + number2; + } else if (operator == '-') { + return number1 - number2; + } else if (operator == '*') { + return number1 * number2; + } else if (operator == '/') { + return number1 / number2; + } else { + throw new ParsingException("Wrong operator"); + } + } + + + private String getRPN(String expression) throws ParsingException { + StringBuilder result = new StringBuilder(); + Stack operators = new Stack<>(); + boolean flag = true; + + for (int i = 0; i < expression.length(); ++i) { + char currChar = expression.charAt(i); + if (currChar == ' ' || currChar == '\n' || currChar == '\t') { + continue; + } + if (NUMBERS.indexOf(currChar) != -1) { + flag = false; + result.append(currChar); + } else if (OPERATORS.indexOf(currChar) != -1) { + if (!flag) { + flag = true; + while (!operators.empty()) { + if (getPriority(currChar) <= getPriority(operators.lastElement())) { + result.append(' '); + result.append(operators.pop()); + } else { + break; + } + } + operators.push(currChar); + result.append(' '); + } else { + if (currChar == '+') { + flag = false; + result.append(' '); + } else if (currChar == '-') { + flag = false; + while (!operators.empty()) { + if (getPriority(operators.lastElement()) == 3) { + result.append(' '); + result.append(operators.pop()); + } else { + break; + } + } + operators.push('~'); + result.append(' '); + } else { + throw new ParsingException("Invalid expression"); + } + } + } else if (currChar == '(') { + flag = true; + operators.push('('); + result.append(' '); + } else if (currChar == ')') { + boolean openBracket = false; + flag = false; + result.append(' '); + while (!operators.empty()) { + char tempChar = operators.pop(); + if (tempChar == '(') { + openBracket = true; + break; + } else { + result.append(' '); + result.append(tempChar); + } + } + if (!openBracket) { + throw new ParsingException("Invalid expression"); + } + } else { + throw new ParsingException("Invalid expression"); + } + } + while (!operators.empty()) { + if (OPERATORS.indexOf(operators.lastElement()) != -1 || operators.lastElement().equals('~')) { + result.append(' '); + result.append(operators.pop()); + } else { + throw new ParsingException("Invalid expression"); + } + } + return result.toString(); + } + + private double calculateRPN(String expression) throws ParsingException { + Scanner in = new Scanner(expression); + Stack numbers = new Stack<>(); + while (in.hasNext()) { + String currInput = in.next(); + if (currInput.length() == 1) { + if (OPERATORS.indexOf(currInput.charAt(0)) != -1) { + if (numbers.size() >= 2) { + double number1 = numbers.pop(); + double number2 = numbers.pop(); + numbers.push(getResultOfOperation(number2, number1, currInput.charAt(0))); + } else { + throw new ParsingException("Parsing error"); + } + } else if (currInput.charAt(0) == '~') { + if (numbers.size() >= 1) { + double number = numbers.pop(); + numbers.push(-number); + } else { + throw new ParsingException("Parsing error"); + } + } else if (NUMBERS.indexOf(currInput.charAt(0)) != -1) { + Double currNumber; + try { + currNumber = Double.parseDouble(currInput); + numbers.push(currNumber); + } catch (NumberFormatException e) { + throw new ParsingException(e.getMessage(), e.getCause()); + } + } else { + throw new ParsingException("Parsing error"); + } + } else { + Double currNumber; + try { + currNumber = Double.parseDouble(currInput); + numbers.push(currNumber); + } catch (NumberFormatException e) { + throw new ParsingException(e.getMessage(), e.getCause()); + } + + } + } + if (numbers.size() == 1) { + return numbers.pop(); + } else { + throw new ParsingException("Parsing error"); + } + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index b507bc7ef..c33d22fd0 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ homework-base homework-tests homework-g596-ivanova + homework-g596-narsia homework-g597-povarnitsyn homework-g596-kupriyanov homework-g595-kryloff From 605a5a4498891c972960c41452703a6293154cf8 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 12 Mar 2017 20:18:15 +0300 Subject: [PATCH 2/8] Second attempt --- .../g596/narsia/task1/MyCalculator.java | 640 +++++++++++++----- .../g596/narsia/task1/MyCalculatorTest.java | 13 + 2 files changed, 474 insertions(+), 179 deletions(-) create mode 100644 homework-g596-narsia/src/test/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculatorTest.java diff --git a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java index 314d81ea7..d75425aaa 100644 --- a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java +++ b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java @@ -2,227 +2,509 @@ import ru.mipt.java2016.homework.base.task1.Calculator; import ru.mipt.java2016.homework.base.task1.ParsingException; - import java.util.*; -public class MyCalculator implements Calculator{ - private String NUMBERS = "0123456789."; - private String OPERATORS = "+-*/"; +public class MyCalculator implements Calculator{ - @Override - public double calculate(String Expression) throws ParsingException { - if (!isExpressionCorrect(Expression)) { - throw new ParsingException("Invalid expression"); + private String whatIsIt(Character Symbol) { + switch (Symbol) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + return "Digit"; + } + case '.': { + return "Point"; + } + case '+': + case '*': + case '/': { + return "Usual operator"; + } + case '-': { + return "Minus"; + } + case '(': { + return "Opening bracket"; + } + case ')': { + return "Closing bracket"; + } + case ' ': + case '\t': + case '\n': { + return "Space"; + } + case '~': { + return "First"; + } + default: { + return "Ochen` ploxo"; + } } - String PostfixExpression = getRPN(Expression); - return calculateRPN(PostfixExpression); } - private enum SymbolType { - OPENING_BRACKET, CLOSING_BRACKET, NUMBER, OPERATOR, NOTHING + + + private Integer getCode(Character first, Character second) { + switch (first) { + case '~': { + switch (second) { + case '+': + case '-': + case '*': + case '/': + case '(': { + return 1; + } + case '~': { + return 4; + } + case ')': { + return 5; + } + } + } + case '+': + case '-': { + switch (second) { + case '*': + case '/': + case '(': { + return 1; + } + case '~': + case ')': + case '+': + case '-': { + return 2; + } + } + } + case '*': + case '/': { + switch (second) { + case '(': { + return 1; + } + case '~': + case ')': + case '+': + case '-': + case '*': + case '/': { + return 2; + } + } + } + case '(': { + switch (second) { + case '(': + case '+': + case '-': + case '*': + case '/': { + return 1; + } + case ')': { + return 3; + } + case '~': { + return 5; + } + } + } + } + return 0; } - private boolean isExpressionCorrect(String Expression) { - if (Expression == null) { - return false; + + + + private void isAlmostValid(String expression) throws ParsingException { + if (expression == null) { + throw new ParsingException("Null"); } + Character PrevSymbol = '~'; + Character CurSymbol; + Character ImportantPrevSymbol = '~'; + int WasThereAPoint = 0; + Boolean flagForSpaces = false; + + for (int i = 0; i < expression.length(); ++i) { + CurSymbol = expression.charAt(i); + switch (whatIsIt(CurSymbol)) { + case "Digit": { + flagForSpaces = true; + switch (whatIsIt(PrevSymbol)) { + case "Space": { + switch (whatIsIt(ImportantPrevSymbol)) { + case "Digit": { + throw new ParsingException("Space between digits"); + } + case "Closing bracket": { + throw new ParsingException("Closing bracket before digit"); + } + } + break; + } + case "Closing bracket": { + throw new ParsingException("Closing bracket before digit"); + } + } + ImportantPrevSymbol = CurSymbol; + PrevSymbol = CurSymbol; + break; + } + + + case "Point": { + flagForSpaces = true; + switch (whatIsIt(PrevSymbol)) { + case "Space": { + throw new ParsingException("Space before point"); + } + case "Opening bracket": + case "Closing bracket": { + throw new ParsingException("Bracket before point"); + } + case "Usual operator": + case "Minus": { + throw new ParsingException("Operator before point"); + } + case "First": { + throw new ParsingException("Nothing before point"); + } + case "Point": { + throw new ParsingException("Double point"); + } + case "Digit": { + switch (WasThereAPoint) { + case 0: { + WasThereAPoint = 1; + break; + } + case 1: { + throw new ParsingException("2 points in one number"); + } + } + break; + } + } + ImportantPrevSymbol = CurSymbol; + PrevSymbol = CurSymbol; + break; + } - SymbolType previousSymbol; - SymbolType currentSymbol = SymbolType.NOTHING; - for (int cnt = 0; cnt < Expression.length(); ++cnt) { - char currentChar = Expression.charAt(cnt); - previousSymbol = currentSymbol; - if (currentChar == ' ' || currentChar == '\n' || currentChar == '\t') { - if (previousSymbol == SymbolType.NUMBER && cnt != Expression.length() - 1 - && NUMBERS.indexOf(Expression.charAt(cnt + 1)) != -1) { - return false; - } // цифра-пробел-цифра - } else { - if (NUMBERS.indexOf(currentChar) != -1) { - currentSymbol = SymbolType.NUMBER; - if (previousSymbol == SymbolType.CLOSING_BRACKET) { - return false; - } // закрывающая скобка-цифра - } else if (OPERATORS.indexOf(currentChar) != -1) { - currentSymbol = SymbolType.OPERATOR; //учитываем отрицательные числа - } else if (currentChar == '(') { - currentSymbol = SymbolType.OPENING_BRACKET; - if (previousSymbol == SymbolType.NUMBER || - previousSymbol == SymbolType.CLOSING_BRACKET) { - return false; //цифра-открывающая скобка, закрывающая-открывающая - } - } else if (currentChar == ')') { - currentSymbol = SymbolType.CLOSING_BRACKET; - if (previousSymbol == SymbolType.OPENING_BRACKET || - previousSymbol == SymbolType.OPERATOR) { - return false; //открывающая-закрывающая, оператор-закрывающая + + case "Usual operator": { + flagForSpaces = true; + switch (whatIsIt(ImportantPrevSymbol)) { + case "Usual operator": { + throw new ParsingException("Too many operators"); + } + case "Opening bracket": { + throw new ParsingException("Operator after opening bracket"); + } + case "First": { + throw new ParsingException("Nothing before operator"); + } + case "Point": { + throw new ParsingException("Operator after point"); + } + case "Digit": { + WasThereAPoint = 0; + break; + } } + ImportantPrevSymbol = CurSymbol; + PrevSymbol = CurSymbol; + break; + } + + + case "Minus": { + flagForSpaces = true; + switch (whatIsIt(ImportantPrevSymbol)) { + case "Point": { + throw new ParsingException("Operator after point"); + } + case "CLosing bracket": { + break; + } + case "First": + case "Opening bracket": { + break; + } + case "Digit": { + WasThereAPoint = 0; + break; + } + } + ImportantPrevSymbol = CurSymbol; + PrevSymbol = CurSymbol; + break; + } + + + case "Space": { + switch (whatIsIt(PrevSymbol)) { + case "Point": { + throw new ParsingException("Space after point"); + } + case "Digit": { + WasThereAPoint = 0; + break; + } + } + PrevSymbol = CurSymbol; + break; + } + + + case "Opening bracket": { + flagForSpaces = true; + switch (whatIsIt(ImportantPrevSymbol)) { + case "Point": { + throw new ParsingException("Point before opening bracket"); + } + case "Digit": { + throw new ParsingException("Digit before opening bracket"); + } + case "Closing bracket": { + throw new ParsingException("Nothing in brackets"); + } + } + ImportantPrevSymbol = CurSymbol; + PrevSymbol = CurSymbol; + break; + } + + + case "Closing bracket": { + flagForSpaces = true; + switch (whatIsIt(ImportantPrevSymbol)) { + case "Point": { + throw new ParsingException("Point before closing bracket"); + } + case "Digit": { + WasThereAPoint = 0; + break; + } + case "Opening bracket": { + throw new ParsingException("Nothing between brackets"); + } + case "First": { + throw new ParsingException("Closing bracket is first"); + } + case "Usual operator": + case "Minus": { + throw new ParsingException("Operator before closing bracket"); + } + } + ImportantPrevSymbol = CurSymbol; + PrevSymbol = CurSymbol; + break; + } + + + case "Ochen` ploxo": + case "First": { + throw new ParsingException("Invalid symbol"); } } } - return true; + if (!flagForSpaces) { + throw new ParsingException("Only spaces"); + } } - private static int getPriority(Character ch) throws ParsingException { - if (ch.equals('(') || ch.equals(')')) { - return 0; - } else if (ch.equals('+') || ch.equals('-')) { - return 1; - } else if (ch.equals('*') || ch.equals('/')) { - return 2; - } else if (ch.equals('~')) { - return 3; - } else { - throw new ParsingException("Invalid operator"); + + private String removeSpaces(String expression) { + String result = ""; + for (int cnt = 0; cnt < expression.length(); ++cnt) { + if (!whatIsIt(expression.charAt(cnt)).equals("Space")) { + result += expression.charAt(cnt); + } } + return result; } - private double getResultOfOperation(double number1, double number2, char operator) throws ParsingException { - if (operator == '+') { - return number1 + number2; - } else if (operator == '-') { - return number1 - number2; - } else if (operator == '*') { - return number1 * number2; - } else if (operator == '/') { - return number1 / number2; - } else { - throw new ParsingException("Wrong operator"); + private String removeUnaryMinuses(String expressionWithoutSpaces) { + expressionWithoutSpaces += '~'; + String result = ""; + Boolean flag = false; + for (int cnt = 0; cnt < expressionWithoutSpaces.length(); ++cnt) { + if (expressionWithoutSpaces.charAt(cnt) == '-') { + if (cnt == 0) { + result += '0'; + } + else { + switch (whatIsIt(expressionWithoutSpaces.charAt(cnt - 1))) { + case "Opening bracket": { + result += "0-"; + continue; + } + case "Usual operator": + case "Minus": { + result += "(0-"; + flag = true; + continue; + } + } + } + } + if ((!whatIsIt(expressionWithoutSpaces.charAt(cnt)).equals("Digit")) && + (!whatIsIt(expressionWithoutSpaces.charAt(cnt)).equals("Point")) && + (cnt > 0) && (flag)) { + result += ")"; + flag = false; + } + if (expressionWithoutSpaces.charAt(cnt) != '~') { + result += expressionWithoutSpaces.charAt(cnt); + } } + return result; } private String getRPN(String expression) throws ParsingException { - StringBuilder result = new StringBuilder(); - Stack operators = new Stack<>(); - boolean flag = true; + expression += '~'; + Character curSymbol; + Character prevSymbol = '~'; + Stack Texas = new Stack<>(); + String California = ""; + Texas.push('~'); - for (int i = 0; i < expression.length(); ++i) { - char currChar = expression.charAt(i); - if (currChar == ' ' || currChar == '\n' || currChar == '\t') { - continue; + Integer cnt = 0; + while (true) { + curSymbol = expression.charAt(cnt); + if (cnt > 0) { + prevSymbol = expression.charAt(cnt - 1); } - if (NUMBERS.indexOf(currChar) != -1) { - flag = false; - result.append(currChar); - } else if (OPERATORS.indexOf(currChar) != -1) { - if (!flag) { - flag = true; - while (!operators.empty()) { - if (getPriority(currChar) <= getPriority(operators.lastElement())) { - result.append(' '); - result.append(operators.pop()); - } else { + switch (whatIsIt(curSymbol)) { + case "Digit": + case "Point": { + switch (whatIsIt(prevSymbol)) { + case "Digit": + case "Point": + case "First": { + California += curSymbol; + ++cnt; break; } - } - operators.push(currChar); - result.append(' '); - } else { - if (currChar == '+') { - flag = false; - result.append(' '); - } else if (currChar == '-') { - flag = false; - while (!operators.empty()) { - if (getPriority(operators.lastElement()) == 3) { - result.append(' '); - result.append(operators.pop()); - } else { - break; - } + default: { + California += " "; + California += curSymbol; + ++cnt; + break; } - operators.push('~'); - result.append(' '); - } else { - throw new ParsingException("Invalid expression"); } + continue; } - } else if (currChar == '(') { - flag = true; - operators.push('('); - result.append(' '); - } else if (currChar == ')') { - boolean openBracket = false; - flag = false; - result.append(' '); - while (!operators.empty()) { - char tempChar = operators.pop(); - if (tempChar == '(') { - openBracket = true; - break; - } else { - result.append(' '); - result.append(tempChar); - } + } + + switch (getCode(Texas.peek(), curSymbol)) { + case 1: { + Texas.push(curSymbol); + ++cnt; + break; + } + case 2: { + California += " "; + California += Texas.peek(); + Texas.pop(); + break; + } + case 3: { + Texas.pop(); + ++cnt; + break; + } + case 4: { + return California; } - if (!openBracket) { - throw new ParsingException("Invalid expression"); + case 5: { + throw new ParsingException("Invalid bracket balance"); } - } else { - throw new ParsingException("Invalid expression"); } } - while (!operators.empty()) { - if (OPERATORS.indexOf(operators.lastElement()) != -1 || operators.lastElement().equals('~')) { - result.append(' '); - result.append(operators.pop()); - } else { - throw new ParsingException("Invalid expression"); + } + + + + private Double doOperation(Double first, Double second, Character operator) { + switch (operator) { + case '+': { + return first + second; + } + case '-': { + //сейчас будет костыль + if ((first == 0) && (second == 0)) { + return -0.0; + } + return first - second; + } + case '*': { + return first * second; + } + case '/': { + return first / second; } } - return result.toString(); + return -1.0; } - private double calculateRPN(String expression) throws ParsingException { - Scanner in = new Scanner(expression); - Stack numbers = new Stack<>(); - while (in.hasNext()) { - String currInput = in.next(); - if (currInput.length() == 1) { - if (OPERATORS.indexOf(currInput.charAt(0)) != -1) { - if (numbers.size() >= 2) { - double number1 = numbers.pop(); - double number2 = numbers.pop(); - numbers.push(getResultOfOperation(number2, number1, currInput.charAt(0))); - } else { - throw new ParsingException("Parsing error"); - } - } else if (currInput.charAt(0) == '~') { - if (numbers.size() >= 1) { - double number = numbers.pop(); - numbers.push(-number); - } else { - throw new ParsingException("Parsing error"); - } - } else if (NUMBERS.indexOf(currInput.charAt(0)) != -1) { - Double currNumber; - try { - currNumber = Double.parseDouble(currInput); - numbers.push(currNumber); - } catch (NumberFormatException e) { - throw new ParsingException(e.getMessage(), e.getCause()); - } - } else { - throw new ParsingException("Parsing error"); - } - } else { - Double currNumber; - try { - currNumber = Double.parseDouble(currInput); - numbers.push(currNumber); - } catch (NumberFormatException e) { - throw new ParsingException(e.getMessage(), e.getCause()); - } + + @Override + public double calculate(String expression) throws ParsingException { + isAlmostValid(expression); + String withoutSpaces = removeSpaces(expression); + String withoutSpacesAndUnaryMinuses = removeUnaryMinuses(withoutSpaces); + String RPN = getRPN(withoutSpacesAndUnaryMinuses); + Stack Numbers = new Stack<>(); + Double first, second; + String curNumber = ""; + Character curChar = '~'; + Character prevChar; + for (int cnt = 0; cnt < RPN.length(); ++cnt) { + prevChar = curChar; + curChar = RPN.charAt(cnt); + switch (whatIsIt(curChar)) { + case "Digit": + case "Point": { + curNumber += curChar; + break; + } + case "Usual operator": + case "Minus": { + second = Numbers.peek(); + Numbers.pop(); + first = Numbers.peek(); + Numbers.pop(); + Numbers.push(doOperation(first, second, curChar)); + break; + } + case "Space": { + switch (whatIsIt(prevChar)) { + case "Digit": { + Numbers.push(Double.parseDouble(curNumber)); + curNumber = ""; + } + } + } } } - if (numbers.size() == 1) { - return numbers.pop(); - } else { - throw new ParsingException("Parsing error"); - } + return Numbers.peek(); } -} \ No newline at end of file +} diff --git a/homework-g596-narsia/src/test/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculatorTest.java b/homework-g596-narsia/src/test/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculatorTest.java new file mode 100644 index 000000000..2f77629d7 --- /dev/null +++ b/homework-g596-narsia/src/test/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculatorTest.java @@ -0,0 +1,13 @@ +package ru.mipt.java2016.homework.g596.narsia.task1; + +import ru.mipt.java2016.homework.base.task1.Calculator; +import ru.mipt.java2016.homework.tests.task1.AbstractCalculatorTest; + + + +public class MyCalculatorTest extends AbstractCalculatorTest { + @Override + protected Calculator calc() { + return new MyCalculator(); + } +} From ed204141790b6a61f36f0752d0a3d3e92d1396b3 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 14 Mar 2017 06:33:08 +0300 Subject: [PATCH 3/8] String -> StringBuilder --- .../g596/narsia/task1/MyCalculator.java | 302 ++++++++---------- 1 file changed, 134 insertions(+), 168 deletions(-) diff --git a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java index d75425aaa..3c3c035f7 100644 --- a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java +++ b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java @@ -2,13 +2,14 @@ import ru.mipt.java2016.homework.base.task1.Calculator; import ru.mipt.java2016.homework.base.task1.ParsingException; + import java.util.*; -public class MyCalculator implements Calculator{ +public class MyCalculator implements Calculator { - private String whatIsIt(Character Symbol) { - switch (Symbol) { + private String whatIsIt(Character symbol) { + switch (symbol) { case '0': case '1': case '2': @@ -18,7 +19,8 @@ private String whatIsIt(Character Symbol) { case '6': case '7': case '8': - case '9': { + case '9': + { return "Digit"; } case '.': { @@ -26,7 +28,8 @@ private String whatIsIt(Character Symbol) { } case '+': case '*': - case '/': { + case '/': + { return "Usual operator"; } case '-': { @@ -40,20 +43,20 @@ private String whatIsIt(Character Symbol) { } case ' ': case '\t': - case '\n': { + case '\n': + { return "Space"; } case '~': { return "First"; } default: { - return "Ochen` ploxo"; + return "So bad"; } } } - private Integer getCode(Character first, Character second) { switch (first) { case '~': { @@ -62,7 +65,8 @@ private Integer getCode(Character first, Character second) { case '-': case '*': case '/': - case '(': { + case '(': + { return 1; } case '~': { @@ -71,6 +75,10 @@ private Integer getCode(Character first, Character second) { case ')': { return 5; } + default: + { + return -1; + } } } case '+': @@ -78,15 +86,20 @@ private Integer getCode(Character first, Character second) { switch (second) { case '*': case '/': - case '(': { + case '(': + { return 1; } case '~': case ')': case '+': - case '-': { + case '-': + { return 2; } + default: { + return -1; + } } } case '*': @@ -100,9 +113,13 @@ private Integer getCode(Character first, Character second) { case '+': case '-': case '*': - case '/': { + case '/': + { return 2; } + default: { + return -1; + } } } case '(': { @@ -111,7 +128,8 @@ private Integer getCode(Character first, Character second) { case '+': case '-': case '*': - case '/': { + case '/': + { return 1; } case ')': { @@ -120,243 +138,193 @@ private Integer getCode(Character first, Character second) { case '~': { return 5; } + default: { + return -1; + } } } + default: { + return -1; + } } - return 0; } - - private void isAlmostValid(String expression) throws ParsingException { if (expression == null) { - throw new ParsingException("Null"); + throw new ParsingException("Invalid expression"); } - Character PrevSymbol = '~'; - Character CurSymbol; - Character ImportantPrevSymbol = '~'; - int WasThereAPoint = 0; - Boolean flagForSpaces = false; + Character prevSymbol = '~'; + Character curSymbol; + Character importantPrevSymbol = '~'; + Boolean pointFlag = false; + Boolean spaceFlag = false; - for (int i = 0; i < expression.length(); ++i) { - CurSymbol = expression.charAt(i); - switch (whatIsIt(CurSymbol)) { + for (int cnt = 0; cnt < expression.length(); ++cnt) { + curSymbol = expression.charAt(cnt); + switch (whatIsIt(curSymbol)) { case "Digit": { - flagForSpaces = true; - switch (whatIsIt(PrevSymbol)) { + switch (whatIsIt(prevSymbol)) { case "Space": { - switch (whatIsIt(ImportantPrevSymbol)) { - case "Digit": { - throw new ParsingException("Space between digits"); - } - case "Closing bracket": { - throw new ParsingException("Closing bracket before digit"); + switch (whatIsIt(importantPrevSymbol)) { + case "Digit": + case "Closing bracket": + { + throw new ParsingException("Invalid expression"); } } break; } case "Closing bracket": { - throw new ParsingException("Closing bracket before digit"); + throw new ParsingException("Invalid expression"); } } - ImportantPrevSymbol = CurSymbol; - PrevSymbol = CurSymbol; break; } - case "Point": { - flagForSpaces = true; - switch (whatIsIt(PrevSymbol)) { - case "Space": { - throw new ParsingException("Space before point"); - } + switch (whatIsIt(prevSymbol)) { + case "Space": case "Opening bracket": - case "Closing bracket": { - throw new ParsingException("Bracket before point"); - } + case "Closing bracket": case "Usual operator": - case "Minus": { - throw new ParsingException("Operator before point"); - } - case "First": { - throw new ParsingException("Nothing before point"); - } - case "Point": { - throw new ParsingException("Double point"); + case "Minus": + case "First": + case "Point": + { + throw new ParsingException("Invalid expression"); } case "Digit": { - switch (WasThereAPoint) { - case 0: { - WasThereAPoint = 1; - break; - } - case 1: { - throw new ParsingException("2 points in one number"); - } + if (!pointFlag) { + pointFlag = true; + } else { + throw new ParsingException("2 points in one number"); } break; } } - ImportantPrevSymbol = CurSymbol; - PrevSymbol = CurSymbol; break; } - case "Usual operator": { - flagForSpaces = true; - switch (whatIsIt(ImportantPrevSymbol)) { - case "Usual operator": { - throw new ParsingException("Too many operators"); - } - case "Opening bracket": { - throw new ParsingException("Operator after opening bracket"); - } - case "First": { - throw new ParsingException("Nothing before operator"); - } - case "Point": { - throw new ParsingException("Operator after point"); + switch (whatIsIt(importantPrevSymbol)) { + case "Usual operator": + case "Opening bracket": + case "First": + case "Point": + { + throw new ParsingException("Invalid expression"); } case "Digit": { - WasThereAPoint = 0; + pointFlag = false; break; } } - ImportantPrevSymbol = CurSymbol; - PrevSymbol = CurSymbol; break; } - case "Minus": { - flagForSpaces = true; - switch (whatIsIt(ImportantPrevSymbol)) { + switch (whatIsIt(importantPrevSymbol)) { case "Point": { - throw new ParsingException("Operator after point"); - } - case "CLosing bracket": { - break; - } - case "First": - case "Opening bracket": { - break; + throw new ParsingException("Invalid expression"); } case "Digit": { - WasThereAPoint = 0; + pointFlag = false; break; } } - ImportantPrevSymbol = CurSymbol; - PrevSymbol = CurSymbol; break; } - case "Space": { - switch (whatIsIt(PrevSymbol)) { + switch (whatIsIt(prevSymbol)) { case "Point": { - throw new ParsingException("Space after point"); + throw new ParsingException("Invalid expression"); } case "Digit": { - WasThereAPoint = 0; + pointFlag = false; break; } } - PrevSymbol = CurSymbol; break; } - case "Opening bracket": { - flagForSpaces = true; - switch (whatIsIt(ImportantPrevSymbol)) { - case "Point": { - throw new ParsingException("Point before opening bracket"); - } - case "Digit": { - throw new ParsingException("Digit before opening bracket"); - } - case "Closing bracket": { - throw new ParsingException("Nothing in brackets"); + switch (whatIsIt(importantPrevSymbol)) { + case "Point": + case "Digit": + case "Closing bracket": + { + throw new ParsingException("Invalid expression"); } } - ImportantPrevSymbol = CurSymbol; - PrevSymbol = CurSymbol; break; } - case "Closing bracket": { - flagForSpaces = true; - switch (whatIsIt(ImportantPrevSymbol)) { - case "Point": { - throw new ParsingException("Point before closing bracket"); + switch (whatIsIt(importantPrevSymbol)) { + case "Point": + case "Opening bracket": + case "First": + case "Usual operator": + case "Minus": + { + throw new ParsingException("Invalid expression"); } case "Digit": { - WasThereAPoint = 0; + pointFlag = false; break; } - case "Opening bracket": { - throw new ParsingException("Nothing between brackets"); - } - case "First": { - throw new ParsingException("Closing bracket is first"); - } - case "Usual operator": - case "Minus": { - throw new ParsingException("Operator before closing bracket"); - } } - ImportantPrevSymbol = CurSymbol; - PrevSymbol = CurSymbol; break; } - - case "Ochen` ploxo": - case "First": { - throw new ParsingException("Invalid symbol"); + case "So bad": + case "First": + { + throw new ParsingException("Invalid expression"); } } + prevSymbol = curSymbol; + if (!whatIsIt(curSymbol).equals("Space")) { + importantPrevSymbol = curSymbol; + spaceFlag = true; + } } - if (!flagForSpaces) { - throw new ParsingException("Only spaces"); + if (!spaceFlag) { + throw new ParsingException("Invalid expression"); } } - private String removeSpaces(String expression) { - String result = ""; + private StringBuilder removeSpaces(String expression) { + StringBuilder result = new StringBuilder(expression.length()); for (int cnt = 0; cnt < expression.length(); ++cnt) { if (!whatIsIt(expression.charAt(cnt)).equals("Space")) { - result += expression.charAt(cnt); + result.append(expression.charAt(cnt)); } } return result; } - private String removeUnaryMinuses(String expressionWithoutSpaces) { - expressionWithoutSpaces += '~'; - String result = ""; + private StringBuilder removeUnaryMinuses(StringBuilder expressionWithoutSpaces) { + expressionWithoutSpaces.append('~'); + StringBuilder result = new StringBuilder(expressionWithoutSpaces.length()); Boolean flag = false; for (int cnt = 0; cnt < expressionWithoutSpaces.length(); ++cnt) { if (expressionWithoutSpaces.charAt(cnt) == '-') { if (cnt == 0) { - result += '0'; - } - else { + result.append('0'); + } else { switch (whatIsIt(expressionWithoutSpaces.charAt(cnt - 1))) { case "Opening bracket": { - result += "0-"; + result.append("0-"); continue; } case "Usual operator": case "Minus": { - result += "(0-"; + result.append("(0-"); flag = true; continue; } @@ -366,23 +334,23 @@ private String removeUnaryMinuses(String expressionWithoutSpaces) { if ((!whatIsIt(expressionWithoutSpaces.charAt(cnt)).equals("Digit")) && (!whatIsIt(expressionWithoutSpaces.charAt(cnt)).equals("Point")) && (cnt > 0) && (flag)) { - result += ")"; + result.append(")"); flag = false; } if (expressionWithoutSpaces.charAt(cnt) != '~') { - result += expressionWithoutSpaces.charAt(cnt); + result.append(expressionWithoutSpaces.charAt(cnt)); } } return result; } - private String getRPN(String expression) throws ParsingException { - expression += '~'; + private StringBuilder getRPN(StringBuilder expression) throws ParsingException { + expression.append('~'); Character curSymbol; Character prevSymbol = '~'; Stack Texas = new Stack<>(); - String California = ""; + StringBuilder California = new StringBuilder(expression.length()); Texas.push('~'); Integer cnt = 0; @@ -398,13 +366,13 @@ private String getRPN(String expression) throws ParsingException { case "Digit": case "Point": case "First": { - California += curSymbol; + California.append(curSymbol); ++cnt; break; } default: { - California += " "; - California += curSymbol; + California.append(" "); + California.append(curSymbol); ++cnt; break; } @@ -420,8 +388,8 @@ private String getRPN(String expression) throws ParsingException { break; } case 2: { - California += " "; - California += Texas.peek(); + California.append(" "); + California.append(Texas.peek()); Texas.pop(); break; } @@ -441,7 +409,6 @@ private String getRPN(String expression) throws ParsingException { } - private Double doOperation(Double first, Double second, Character operator) { switch (operator) { case '+': { @@ -465,25 +432,24 @@ private Double doOperation(Double first, Double second, Character operator) { } - @Override public double calculate(String expression) throws ParsingException { isAlmostValid(expression); - String withoutSpaces = removeSpaces(expression); - String withoutSpacesAndUnaryMinuses = removeUnaryMinuses(withoutSpaces); - String RPN = getRPN(withoutSpacesAndUnaryMinuses); + StringBuilder withoutSpaces = removeSpaces(expression); + StringBuilder withoutSpacesAndUnaryMinuses = removeUnaryMinuses(withoutSpaces); + StringBuilder rpn = getRPN(withoutSpacesAndUnaryMinuses); Stack Numbers = new Stack<>(); Double first, second; - String curNumber = ""; + StringBuilder curNumber = new StringBuilder(); Character curChar = '~'; Character prevChar; - for (int cnt = 0; cnt < RPN.length(); ++cnt) { + for (int cnt = 0; cnt < rpn.length(); ++cnt) { prevChar = curChar; - curChar = RPN.charAt(cnt); + curChar = rpn.charAt(cnt); switch (whatIsIt(curChar)) { case "Digit": case "Point": { - curNumber += curChar; + curNumber.append(curChar); break; } case "Usual operator": @@ -498,8 +464,8 @@ public double calculate(String expression) throws ParsingException { case "Space": { switch (whatIsIt(prevChar)) { case "Digit": { - Numbers.push(Double.parseDouble(curNumber)); - curNumber = ""; + Numbers.push(Double.parseDouble(curNumber.toString())); + curNumber.delete(0, curNumber.length()); } } } From 251fdf22a7329e26391941e45d1bc8107439c493 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 15 Mar 2017 06:03:07 +0300 Subject: [PATCH 4/8] Fixes in total + description file added --- homework-g596-narsia/src/description.pdf | Bin 0 -> 44790 bytes .../g596/narsia/task1/MyCalculator.java | 537 ++++++++---------- 2 files changed, 226 insertions(+), 311 deletions(-) create mode 100644 homework-g596-narsia/src/description.pdf diff --git a/homework-g596-narsia/src/description.pdf b/homework-g596-narsia/src/description.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dbfb9f55cfbc2f8bba898a45be874246eb1ac392 GIT binary patch literal 44790 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≠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 0) && (flag)) { + if ((!Character.isDigit(expressionWithoutSpaces.charAt(index))) && + (expressionWithoutSpaces.charAt(index) != '.') && (index > 0) && (bracketFlag)) { result.append(")"); - flag = false; + bracketFlag = false; + } + if (expressionWithoutSpaces.charAt(index) != '~') { + result.append(expressionWithoutSpaces.charAt(index)); + } + } + return result.toString(); + } + + + private int getCode(char first, char second) { + switch (first) { + case '~': { + if ((whatIsIt(second) == symbolType.USUAL_OPERATOR) || + (whatIsIt(second) == symbolType.MINUS) || + (whatIsIt(second)) == symbolType.OPENING_BRACKET) { + return 1; + } + if (second == '~') { + return 4; + } + if (second == ')') { + return 5; + } + } + case '+': + case '-': { + if ((second == '*') || (second == '/') || (second == '(')) { + return 1; + } + if ((second == '~') || (second == ')') || + (second == '+') || (second == '-')) { + return 2; + } + } + case '*': + case '/': { + if (second == '(') { + return 1; + } + if ((second == '~') || (second == ')') || + (whatIsIt(second) == symbolType.USUAL_OPERATOR) || + (second == '-')) { + return 2; + } + } + case '(': { + if ((second == '(') || (whatIsIt(second) == symbolType.USUAL_OPERATOR) || + second == '-') { + return 1; + } + if (second == ')') { + return 3; + } + if (second == '~') { + return 5; + } } - if (expressionWithoutSpaces.charAt(cnt) != '~') { - result.append(expressionWithoutSpaces.charAt(cnt)); + default: { + return -1; } } - return result; } - private StringBuilder getRPN(StringBuilder expression) throws ParsingException { - expression.append('~'); + private String getRPN(String expression) throws ParsingException { + expression = expression.concat("~"); Character curSymbol; Character prevSymbol = '~'; - Stack Texas = new Stack<>(); - StringBuilder California = new StringBuilder(expression.length()); - Texas.push('~'); + Stack texas = new Stack<>(); + StringBuilder california = new StringBuilder(expression.length()); + texas.push('~'); - Integer cnt = 0; + int index = 0; while (true) { - curSymbol = expression.charAt(cnt); - if (cnt > 0) { - prevSymbol = expression.charAt(cnt - 1); + curSymbol = expression.charAt(index); + if (index > 0) { + prevSymbol = expression.charAt(index - 1); } switch (whatIsIt(curSymbol)) { - case "Digit": - case "Point": { - switch (whatIsIt(prevSymbol)) { - case "Digit": - case "Point": - case "First": { - California.append(curSymbol); - ++cnt; - break; - } - default: { - California.append(" "); - California.append(curSymbol); - ++cnt; - break; - } + case DIGIT: + case POINT: { + if ((Character.isDigit(prevSymbol)) || (prevSymbol == '.') || + (prevSymbol == '~')) { + california.append(curSymbol); + ++index; + } else { + california.append(" "); + california.append(curSymbol); + ++index; + break; } continue; } + default: { + break; + } } - switch (getCode(Texas.peek(), curSymbol)) { + switch (getCode(texas.peek(), curSymbol)) { case 1: { - Texas.push(curSymbol); - ++cnt; + texas.push(curSymbol); + ++index; break; } case 2: { - California.append(" "); - California.append(Texas.peek()); - Texas.pop(); + california.append(" "); + california.append(texas.peek()); + texas.pop(); break; } case 3: { - Texas.pop(); - ++cnt; + texas.pop(); + ++index; break; } case 4: { - return California; + return california.toString(); } case 5: { throw new ParsingException("Invalid bracket balance"); @@ -409,7 +318,7 @@ private StringBuilder getRPN(StringBuilder expression) throws ParsingException { } - private Double doOperation(Double first, Double second, Character operator) { + private double doOperation(double first, double second, char operator) { switch (operator) { case '+': { return first + second; @@ -427,50 +336,56 @@ private Double doOperation(Double first, Double second, Character operator) { case '/': { return first / second; } + default: { + return -1.0; + } } - return -1.0; } @Override public double calculate(String expression) throws ParsingException { isAlmostValid(expression); - StringBuilder withoutSpaces = removeSpaces(expression); - StringBuilder withoutSpacesAndUnaryMinuses = removeUnaryMinuses(withoutSpaces); - StringBuilder rpn = getRPN(withoutSpacesAndUnaryMinuses); - Stack Numbers = new Stack<>(); - Double first, second; + String withoutSpaces = removeSpaces(expression); + String withoutSpacesAndUnaryMinuses = removeUnaryMinuses(withoutSpaces); + String rpn = getRPN(withoutSpacesAndUnaryMinuses); + Stack numbers = new Stack<>(); + Double first; + Double second; StringBuilder curNumber = new StringBuilder(); - Character curChar = '~'; - Character prevChar; + char curChar = '~'; + char prevChar; for (int cnt = 0; cnt < rpn.length(); ++cnt) { prevChar = curChar; curChar = rpn.charAt(cnt); switch (whatIsIt(curChar)) { - case "Digit": - case "Point": { + case DIGIT: + case POINT: { curNumber.append(curChar); break; } - case "Usual operator": - case "Minus": { - second = Numbers.peek(); - Numbers.pop(); - first = Numbers.peek(); - Numbers.pop(); - Numbers.push(doOperation(first, second, curChar)); + case USUAL_OPERATOR: + case MINUS: { + second = numbers.peek(); + numbers.pop(); + first = numbers.peek(); + numbers.pop(); + numbers.push(doOperation(first, second, curChar)); break; } - case "Space": { + case SPACE: { switch (whatIsIt(prevChar)) { - case "Digit": { - Numbers.push(Double.parseDouble(curNumber.toString())); + case DIGIT: { + numbers.push(Double.parseDouble(curNumber.toString())); curNumber.delete(0, curNumber.length()); } } } + default: { + break; + } } } - return Numbers.peek(); + return numbers.peek(); } } From 820b72391e9bff07d2333c6a4f72fecb4d7bbd1e Mon Sep 17 00:00:00 2001 From: David Date: Wed, 15 Mar 2017 19:18:50 +0300 Subject: [PATCH 5/8] Codestyle --- .../g596/narsia/task1/MyCalculator.java | 157 ++++++++---------- 1 file changed, 65 insertions(+), 92 deletions(-) diff --git a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java index b4443de55..9d4d4f355 100644 --- a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java +++ b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java @@ -10,36 +10,36 @@ public class MyCalculator implements Calculator { - private enum symbolType {DIGIT, POINT, USUAL_OPERATOR, MINUS, SPACE, - OPENING_BRACKET, CLOSING_BRACKET, FIRST, INVALID} + private enum SymbolType { DIGIT, POINT, USUAL_OPERATOR, MINUS, SPACE, + OPENING_BRACKET, CLOSING_BRACKET, FIRST, INVALID } - private symbolType whatIsIt(Character symbol) { + private SymbolType whatIsIt(Character symbol) { if (Character.isDigit(symbol)) { - return symbolType.DIGIT; + return SymbolType.DIGIT; } if (symbol.equals('.')) { - return symbolType.POINT; + return SymbolType.POINT; } if ((symbol.equals('+')) || (symbol.equals('*')) || (symbol.equals('/'))) { - return symbolType.USUAL_OPERATOR; + return SymbolType.USUAL_OPERATOR; } if (symbol.equals('-')) { - return symbolType.MINUS; + return SymbolType.MINUS; } if (Character.isWhitespace(symbol)) { - return symbolType.SPACE; + return SymbolType.SPACE; } if (symbol.equals('(')) { - return symbolType.OPENING_BRACKET; + return SymbolType.OPENING_BRACKET; } if (symbol.equals(')')) { - return symbolType.CLOSING_BRACKET; + return SymbolType.CLOSING_BRACKET; } if (symbol.equals('~')) { - return symbolType.FIRST; + return SymbolType.FIRST; } - return symbolType.INVALID; + return SymbolType.INVALID; } @@ -56,21 +56,20 @@ private void isAlmostValid(String expression) throws ParsingException { for (int index = 0; index < expression.length(); ++index) { curSymbol = expression.charAt(index); switch (whatIsIt(curSymbol)) { - case DIGIT: { - if (whatIsIt(prevSymbol) == symbolType.SPACE) { - if ((whatIsIt(importantPrevSymbol) == symbolType.DIGIT) || - (whatIsIt(importantPrevSymbol) == symbolType.CLOSING_BRACKET)) { - throw new ParsingException("Invalid expression"); + case DIGIT: + if (whatIsIt(prevSymbol) == SymbolType.SPACE) { + if ((whatIsIt(importantPrevSymbol) == SymbolType.DIGIT) || + (whatIsIt(importantPrevSymbol) == SymbolType.CLOSING_BRACKET)) { + throw new ParsingException("Invalid expression"); } } - if (whatIsIt(prevSymbol) == symbolType.CLOSING_BRACKET) { - throw new ParsingException("Invalid expression"); + if (whatIsIt(prevSymbol) == SymbolType.CLOSING_BRACKET) { + throw new ParsingException("Invalid expression"); } break; - } - case POINT: { - if (whatIsIt(prevSymbol) == symbolType.DIGIT) { + case POINT: + if (whatIsIt(prevSymbol) == SymbolType.DIGIT) { if (!pointFlag) { pointFlag = true; } else { @@ -80,67 +79,60 @@ private void isAlmostValid(String expression) throws ParsingException { throw new ParsingException("Invalid expression"); } break; - } - case USUAL_OPERATOR: { - if ((whatIsIt(importantPrevSymbol) == symbolType.USUAL_OPERATOR) || + case USUAL_OPERATOR: + if ((whatIsIt(importantPrevSymbol) == SymbolType.USUAL_OPERATOR) || (importantPrevSymbol == '(') || (importantPrevSymbol == '~') || (importantPrevSymbol == '.')) { throw new ParsingException("Invalid expression"); } - if (whatIsIt(importantPrevSymbol) == symbolType.DIGIT) { + if (whatIsIt(importantPrevSymbol) == SymbolType.DIGIT) { pointFlag = false; } break; - } - case MINUS: { + case MINUS: if (importantPrevSymbol == '.') { throw new ParsingException("Invalid expression"); } - if (whatIsIt(importantPrevSymbol) == symbolType.DIGIT) { + if (whatIsIt(importantPrevSymbol) == SymbolType.DIGIT) { pointFlag = false; } break; - } - case SPACE: { + case SPACE: if (prevSymbol == '.') { throw new ParsingException("Invalid expression"); } - if (whatIsIt(prevSymbol) == symbolType.DIGIT) { + if (whatIsIt(prevSymbol) == SymbolType.DIGIT) { pointFlag = false; } break; - } - case OPENING_BRACKET: { - if ((whatIsIt(importantPrevSymbol) == symbolType.DIGIT) || + case OPENING_BRACKET: + if ((whatIsIt(importantPrevSymbol) == SymbolType.DIGIT) || (importantPrevSymbol == '.') || (importantPrevSymbol == ')')) { throw new ParsingException("Invalid expression"); } break; - } - case CLOSING_BRACKET: { - if (whatIsIt(importantPrevSymbol) == symbolType.DIGIT) { + case CLOSING_BRACKET: + if (whatIsIt(importantPrevSymbol) == SymbolType.DIGIT) { pointFlag = false; } if ((importantPrevSymbol == '.') || (importantPrevSymbol == '(') || (importantPrevSymbol == '~') || - (whatIsIt(importantPrevSymbol) == symbolType.USUAL_OPERATOR) || + (whatIsIt(importantPrevSymbol) == SymbolType.USUAL_OPERATOR) || (importantPrevSymbol == '-')) { - throw new ParsingException("Invalid expression"); + throw new ParsingException("Invalid expression"); } break; - } - default: { + default: throw new ParsingException("Invalid expression"); - } } prevSymbol = curSymbol; - if (whatIsIt(curSymbol) != symbolType.SPACE) { + if (whatIsIt(curSymbol) != SymbolType.SPACE) { importantPrevSymbol = curSymbol; spaceFlag = true; } @@ -172,19 +164,16 @@ private String removeUnaryMinuses(String expressionWithoutSpaces) { result.append('0'); } else { switch (whatIsIt(expressionWithoutSpaces.charAt(index - 1))) { - case OPENING_BRACKET: { + case OPENING_BRACKET: result.append("0-"); continue; - } case USUAL_OPERATOR: - case MINUS: { + case MINUS: result.append("(0-"); bracketFlag = true; continue; - } - default: { + default: break; - } } } } @@ -204,9 +193,8 @@ private String removeUnaryMinuses(String expressionWithoutSpaces) { private int getCode(char first, char second) { switch (first) { case '~': { - if ((whatIsIt(second) == symbolType.USUAL_OPERATOR) || - (whatIsIt(second) == symbolType.MINUS) || - (whatIsIt(second)) == symbolType.OPENING_BRACKET) { + if ((whatIsIt(second) == SymbolType.USUAL_OPERATOR) || + (second == '-') || (second == '(')) { return 1; } if (second == '~') { @@ -232,13 +220,13 @@ private int getCode(char first, char second) { return 1; } if ((second == '~') || (second == ')') || - (whatIsIt(second) == symbolType.USUAL_OPERATOR) || + (whatIsIt(second) == SymbolType.USUAL_OPERATOR) || (second == '-')) { return 2; } } case '(': { - if ((second == '(') || (whatIsIt(second) == symbolType.USUAL_OPERATOR) || + if ((second == '(') || (whatIsIt(second) == SymbolType.USUAL_OPERATOR) || second == '-') { return 1; } @@ -272,7 +260,7 @@ private String getRPN(String expression) throws ParsingException { } switch (whatIsIt(curSymbol)) { case DIGIT: - case POINT: { + case POINT: if ((Character.isDigit(prevSymbol)) || (prevSymbol == '.') || (prevSymbol == '~')) { california.append(curSymbol); @@ -284,35 +272,31 @@ private String getRPN(String expression) throws ParsingException { break; } continue; - } - default: { + + default: break; - } } switch (getCode(texas.peek(), curSymbol)) { - case 1: { + case 1: texas.push(curSymbol); ++index; break; - } - case 2: { + case 2: california.append(" "); california.append(texas.peek()); texas.pop(); break; - } - case 3: { + case 3: texas.pop(); ++index; break; - } - case 4: { + case 4: return california.toString(); - } - case 5: { + case 5: throw new ParsingException("Invalid bracket balance"); - } + default: + break; } } } @@ -320,25 +304,20 @@ private String getRPN(String expression) throws ParsingException { private double doOperation(double first, double second, char operator) { switch (operator) { - case '+': { + case '+': return first + second; - } - case '-': { + case '-': //сейчас будет костыль if ((first == 0) && (second == 0)) { return -0.0; } return first - second; - } - case '*': { + case '*': return first * second; - } - case '/': { + case '/': return first / second; - } - default: { + default: return -1.0; - } } } @@ -360,30 +339,24 @@ public double calculate(String expression) throws ParsingException { curChar = rpn.charAt(cnt); switch (whatIsIt(curChar)) { case DIGIT: - case POINT: { + case POINT: curNumber.append(curChar); break; - } case USUAL_OPERATOR: - case MINUS: { + case MINUS: second = numbers.peek(); numbers.pop(); first = numbers.peek(); numbers.pop(); numbers.push(doOperation(first, second, curChar)); break; - } - case SPACE: { - switch (whatIsIt(prevChar)) { - case DIGIT: { - numbers.push(Double.parseDouble(curNumber.toString())); - curNumber.delete(0, curNumber.length()); - } + case SPACE: + if (Character.isDigit(prevChar)) { + numbers.push(Double.parseDouble(curNumber.toString())); + curNumber.delete(0, curNumber.length()); } - } - default: { + default: break; - } } } return numbers.peek(); From 1f82f19d3edfd525433e827543e25dbbbafe5fde Mon Sep 17 00:00:00 2001 From: David Date: Wed, 15 Mar 2017 19:29:40 +0300 Subject: [PATCH 6/8] Codestyle last time --- .../homework/g596/narsia/task1/MyCalculator.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java index 9d4d4f355..6bbe372cb 100644 --- a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java +++ b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java @@ -192,7 +192,7 @@ private String removeUnaryMinuses(String expressionWithoutSpaces) { private int getCode(char first, char second) { switch (first) { - case '~': { + case '~': if ((whatIsIt(second) == SymbolType.USUAL_OPERATOR) || (second == '-') || (second == '(')) { return 1; @@ -203,9 +203,8 @@ private int getCode(char first, char second) { if (second == ')') { return 5; } - } case '+': - case '-': { + case '-': if ((second == '*') || (second == '/') || (second == '(')) { return 1; } @@ -213,9 +212,8 @@ private int getCode(char first, char second) { (second == '+') || (second == '-')) { return 2; } - } case '*': - case '/': { + case '/': if (second == '(') { return 1; } @@ -224,8 +222,7 @@ private int getCode(char first, char second) { (second == '-')) { return 2; } - } - case '(': { + case '(': if ((second == '(') || (whatIsIt(second) == SymbolType.USUAL_OPERATOR) || second == '-') { return 1; @@ -236,10 +233,8 @@ private int getCode(char first, char second) { if (second == '~') { return 5; } - } - default: { + default: return -1; - } } } From a15260128e2aa12ae73d8ba1348f2bf16211e94a Mon Sep 17 00:00:00 2001 From: David Date: Thu, 16 Mar 2017 21:23:05 +0300 Subject: [PATCH 7/8] Fixes --- homework-g596-narsia/src/description.pdf | Bin 44790 -> 0 bytes .../g596/narsia/task1/MyCalculator.java | 218 ++++++++++-------- 2 files changed, 125 insertions(+), 93 deletions(-) delete mode 100644 homework-g596-narsia/src/description.pdf diff --git a/homework-g596-narsia/src/description.pdf b/homework-g596-narsia/src/description.pdf deleted file mode 100644 index dbfb9f55cfbc2f8bba898a45be874246eb1ac392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44790 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≠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 texas = new Stack<>(); - StringBuilder california = new StringBuilder(expression.length()); - texas.push('~'); + Stack operators = new Stack<>(); + StringBuilder rpn = new StringBuilder(expression.length()); + operators.push('~'); int index = 0; while (true) { @@ -253,18 +278,17 @@ private String getRPN(String expression) throws ParsingException { if (index > 0) { prevSymbol = expression.charAt(index - 1); } - switch (whatIsIt(curSymbol)) { + switch (symbolType(curSymbol)) { case DIGIT: case POINT: if ((Character.isDigit(prevSymbol)) || (prevSymbol == '.') || (prevSymbol == '~')) { - california.append(curSymbol); + rpn.append(curSymbol); ++index; } else { - california.append(" "); - california.append(curSymbol); + rpn.append(" "); + rpn.append(curSymbol); ++index; - break; } continue; @@ -272,23 +296,23 @@ private String getRPN(String expression) throws ParsingException { break; } - switch (getCode(texas.peek(), curSymbol)) { - case 1: - texas.push(curSymbol); + switch (getNumOfSituation(operators.peek(), curSymbol)) { + case PUSH: + operators.push(curSymbol); ++index; break; - case 2: - california.append(" "); - california.append(texas.peek()); - texas.pop(); + case PUSH_LAST: + rpn.append(" "); + rpn.append(operators.peek()); + operators.pop(); break; - case 3: - texas.pop(); + case REMOVE: + operators.pop(); ++index; break; - case 4: - return california.toString(); - case 5: + case RESULT: + return rpn.toString(); + case EXCEPTION: throw new ParsingException("Invalid bracket balance"); default: break; @@ -296,7 +320,8 @@ private String getRPN(String expression) throws ParsingException { } } - + //Возвращает результат применения оператора к + //операндам private double doOperation(double first, double second, char operator) { switch (operator) { case '+': @@ -316,7 +341,14 @@ private double doOperation(double first, double second, char operator) { } } - + //По обратной польской записи выражения + //вычисляет его значение. При считывании оператора + //из стека удаляем 2 верхних числа и кладем в стек + //результат операции, примененной к этим двум + //числам. При считывании числа просто кладем его в + //стек. Для корректных выражений к концу работы в + //стеке останется всего одно число — его и + //возвращаем @Override public double calculate(String expression) throws ParsingException { isAlmostValid(expression); @@ -332,7 +364,7 @@ public double calculate(String expression) throws ParsingException { for (int cnt = 0; cnt < rpn.length(); ++cnt) { prevChar = curChar; curChar = rpn.charAt(cnt); - switch (whatIsIt(curChar)) { + switch (symbolType(curChar)) { case DIGIT: case POINT: curNumber.append(curChar); From 60694272a534ad0833d3eb7b953cb6686b938f0d Mon Sep 17 00:00:00 2001 From: David Date: Thu, 16 Mar 2017 21:27:40 +0300 Subject: [PATCH 8/8] Codestyle fixes --- .../java2016/homework/g596/narsia/task1/MyCalculator.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java index e84415403..64797500f 100644 --- a/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java +++ b/homework-g596-narsia/src/main/java/ru/mipt/java2016/homework/g596/narsia/task1/MyCalculator.java @@ -181,8 +181,7 @@ private String removeUnaryMinuses(String expressionWithoutSpaces) throws Parsing default: break; } - } - catch(Exception ParsingException) { + } catch (Exception ParsingException) { throw new ParsingException("Invalid symbol"); } } @@ -200,7 +199,7 @@ private String removeUnaryMinuses(String expressionWithoutSpaces) throws Parsing } private enum Situations { PUSH, PUSH_LAST, REMOVE, - RESULT, EXCEPTION} + RESULT, EXCEPTION } //Таблица зависимости действий, производимых //со строкой, от двух символов. Первый из них — @@ -214,8 +213,7 @@ private Situations getNumOfSituation(char first, char second) throws ParsingExce (second == '-') || (second == '(')) { return Situations.PUSH; } - } - catch (Exception ParsingException) { + } catch (Exception ParsingException) { throw new ParsingException("Invalid symbol"); }