From 3d4ec74751d394ce69ace03b8d40cd01b57ea3c8 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Tue, 23 Feb 2021 13:59:58 +0900 Subject: [PATCH 01/14] docs(guide): list of implementation functions and TDD case --- src/README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/README.md diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..276b0a4 --- /dev/null +++ b/src/README.md @@ -0,0 +1,58 @@ +# Java-Calculator + +Create a string calculator and write test code for it + +## Contributor +- oereo + +## Branch structure + +### oereo branch +* from `oereo/java-calculator[oereo branch]` to `biforest/java-calculator [oereo branch]` + +### java-calculator-structure branch +* Feature branch : Branch to develop the function ex)feature/java-calculator +* Fix branch : Branch to fix the function ex)fix/java-calculator + +## TDD +### Failure case +#### (1) When divided by 0 +```console + 연산을 입력해주세요 : 2/0 // error +``` +#### (2) When two or more operation symbols appear in a row +```console + 연산을 입력해주세요 : 2++0 // error +``` +#### (3) When the operation symbol appears at the beginning +```console + 연산을 입력해주세요 : +2+0 // error +``` +#### (4) When special characters other than operation symbols are entered +```console + 연산을 입력해주세요 : 2^4 // error +``` +#### (5) When characters excluding numbers and operators are entered +```console + 연산을 입력해주세요 : 2ㄱㄴ4*4 // error +``` + +## Structure +#### 1. Class +- Calculator class + - `+ class` + - `- class` + - `* class` + - `/ class` +- Input class +- Output class + - `Error message` output + - `Calculation result` output +- Error exception class + - Precautions : only use `try ~ catch` +- Init class + - When an error occurs, reset after outputting an error message + - Reset and input when pressing any key value + +#### 2. Algorithm +- DFS \ No newline at end of file From 59160fa38804aec3bcca7ac9b7db0631d9dc1951 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Wed, 24 Feb 2021 14:34:17 +0900 Subject: [PATCH 02/14] docs(guide): add TDD case --- src/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/README.md b/src/README.md index 276b0a4..0680f67 100644 --- a/src/README.md +++ b/src/README.md @@ -36,7 +36,10 @@ Create a string calculator and write test code for it ```console 연산을 입력해주세요 : 2ㄱㄴ4*4 // error ``` - +#### (6) When the formula ends with an operation symbol +```console + 연산을 입력해주세요 : 2-1* // error +``` ## Structure #### 1. Class - Calculator class @@ -55,4 +58,4 @@ Create a string calculator and write test code for it - Reset and input when pressing any key value #### 2. Algorithm -- DFS \ No newline at end of file +- DFS, Node \ No newline at end of file From fd2266adccb23acadc49547a3b67c760d058ee68 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 20:40:48 +0900 Subject: [PATCH 03/14] feat: java-calculator basic structure design and implementation --- settings.gradle | 2 + src/main/java/calculator/AddOperation.java | 19 ++++++ src/main/java/calculator/Application.java | 9 +++ .../calculator/ArithmeticExpressionStack.java | 46 ++++++++++++++ src/main/java/calculator/Calculator.java | 60 +++++++++++++++++++ src/main/java/calculator/DivideOperation.java | 25 ++++++++ src/main/java/calculator/ErrorException.java | 17 ++++++ src/main/java/calculator/InputUserData.java | 9 +++ .../java/calculator/MultiplyOperation.java | 19 ++++++ src/main/java/calculator/Operation.java | 14 +++++ src/main/java/calculator/OutputUserData.java | 4 ++ src/main/java/calculator/SubOperation.java | 19 ++++++ src/main/java/empty.txt | 0 13 files changed, 243 insertions(+) create mode 100644 settings.gradle create mode 100644 src/main/java/calculator/AddOperation.java create mode 100644 src/main/java/calculator/Application.java create mode 100644 src/main/java/calculator/ArithmeticExpressionStack.java create mode 100644 src/main/java/calculator/Calculator.java create mode 100644 src/main/java/calculator/DivideOperation.java create mode 100644 src/main/java/calculator/ErrorException.java create mode 100644 src/main/java/calculator/InputUserData.java create mode 100644 src/main/java/calculator/MultiplyOperation.java create mode 100644 src/main/java/calculator/Operation.java create mode 100644 src/main/java/calculator/OutputUserData.java create mode 100644 src/main/java/calculator/SubOperation.java delete mode 100644 src/main/java/empty.txt diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..bcf30bf --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'java-calculator' + diff --git a/src/main/java/calculator/AddOperation.java b/src/main/java/calculator/AddOperation.java new file mode 100644 index 0000000..1b0f64c --- /dev/null +++ b/src/main/java/calculator/AddOperation.java @@ -0,0 +1,19 @@ +package calculator; + +public class AddOperation implements OperationInterface { + @Override + public int operationPriority() { + return 1; + } + + @Override + public String operationName() { + return "+"; + } + + @Override + public int calculation(int beforeNumber, int afterNumber) { + int Result = beforeNumber + afterNumber; + return Result; + } +} diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java new file mode 100644 index 0000000..2800320 --- /dev/null +++ b/src/main/java/calculator/Application.java @@ -0,0 +1,9 @@ +package calculator; + + +public class Application { + public static void main(String[] args) { + Calculator calculator = new Calculator(); + calculator.calculation(); + } +} diff --git a/src/main/java/calculator/ArithmeticExpressionStack.java b/src/main/java/calculator/ArithmeticExpressionStack.java new file mode 100644 index 0000000..2606b1a --- /dev/null +++ b/src/main/java/calculator/ArithmeticExpressionStack.java @@ -0,0 +1,46 @@ +package calculator; + + +interface Stack{ + boolean isEmpty(); + String pop(); + void clear(); +} + +public class ArithmeticExpressionStack implements Stack { + private int stackSize; + private int flag; + private String stack[]; + + public ArithmeticExpressionStack(String[] equation, int stackSize){ + clear(); + flag = 0; + this.stackSize = stackSize; + stack = equation; + } + + public String pop(){ + if(isEmpty()){ + return "없는데?"; + } + else{ + return stack[flag++]; + } + } + + public boolean isEmpty(){ + return (flag == this.stackSize); + } + + public void clear(){ + if(!isEmpty()){ + flag = -1; + this.stackSize = stackSize; + } + } + + public int getStackSize(){ + return this.stackSize; + } + +} diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000..9b26899 --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,60 @@ +package calculator; + +import java.util.Scanner; + + +public class Calculator { + public void calculation(){ + String[] equation_list = getEquation(); + ArithmeticExpressionStack arithmeticExpressionStack = new ArithmeticExpressionStack(equation_list, equation_list.length); + OperatorSetting(arithmeticExpressionStack, equation_list.length); + + } + + public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack, int equationLength) { + ErrorException exception = new ErrorException(); + String firstString = arithmeticExpressionStack.pop(); + int firstNumber = exception.NumericalError(firstString); + + for(int i = 0; i<(arithmeticExpressionStack.getStackSize())/2;i++){ + String operator = arithmeticExpressionStack.pop(); + String secondString = arithmeticExpressionStack.pop(); + int secondNumber = exception.NumericalError(secondString); + firstNumber = chooseOperatorAndCalculate(firstNumber, operator, secondNumber); + } + arithmeticExpressionStack.clear(); + System.out.println("결과"); + System.out.println(firstNumber); + } + + private int chooseOperatorAndCalculate(int firstNumber, String operator, int SecondNumber){ + AddOperation addOperation = new AddOperation(); + SubOperation subOperation = new SubOperation(); + MultiplyOperation multiplyOperation = new MultiplyOperation(); + DivideOperation divideOperation = new DivideOperation(); + int result = 0; + if (operator.equals(addOperation.operationName())){ + result = addOperation.calculation(firstNumber, SecondNumber); + } + if (operator.equals(subOperation.operationName())){ + result = subOperation.calculation(firstNumber, SecondNumber); + } + if (operator.equals(multiplyOperation.operationName())){ + result = multiplyOperation.calculation(firstNumber, SecondNumber); + } + if (operator.equals(divideOperation.operationName())){ + result = divideOperation.calculation(firstNumber, SecondNumber); + } + + return result; + } + + + public String[] getEquation(){ + Scanner scanner = new Scanner(System.in); + System.out.print("수식을 입력해주세요 : "); + String value = scanner.nextLine(); + String[] values = value.split(" "); + return values; + } +} diff --git a/src/main/java/calculator/DivideOperation.java b/src/main/java/calculator/DivideOperation.java new file mode 100644 index 0000000..33e8c7b --- /dev/null +++ b/src/main/java/calculator/DivideOperation.java @@ -0,0 +1,25 @@ +package calculator; + +public class DivideOperation implements OperationInterface { + @Override + public int operationPriority() { + return 1; + } + + @Override + public String operationName() { + return "/"; + } + + @Override + public int calculation(int beforeNumber, int afterNumber) { + try{ + int Result = beforeNumber / afterNumber; + return Result; + } + catch (ArithmeticException e){ + System.out.println("0으로 나눌수가 없습니다."); + } + return 0; + } +} diff --git a/src/main/java/calculator/ErrorException.java b/src/main/java/calculator/ErrorException.java new file mode 100644 index 0000000..9289555 --- /dev/null +++ b/src/main/java/calculator/ErrorException.java @@ -0,0 +1,17 @@ +package calculator; + +import java.util.InputMismatchException; + +public class ErrorException { + public int NumericalError(String number) { + int numberConverted = 0; + try { + numberConverted = Integer.parseInt(number); + } catch (NumberFormatException e) { + System.out.println("잘못된 연산기호 입니다."); + Calculator calculator = new Calculator(); + calculator.calculation(); + } + return numberConverted; + } +} diff --git a/src/main/java/calculator/InputUserData.java b/src/main/java/calculator/InputUserData.java new file mode 100644 index 0000000..9b97a4b --- /dev/null +++ b/src/main/java/calculator/InputUserData.java @@ -0,0 +1,9 @@ +package calculator; +import java.util.Scanner; + +public class InputUserData { + public Scanner getEquation(){ + Scanner scanner = new Scanner(System.in); + return scanner; + } +} diff --git a/src/main/java/calculator/MultiplyOperation.java b/src/main/java/calculator/MultiplyOperation.java new file mode 100644 index 0000000..f03451a --- /dev/null +++ b/src/main/java/calculator/MultiplyOperation.java @@ -0,0 +1,19 @@ +package calculator; + +public class MultiplyOperation implements OperationInterface { + @Override + public int operationPriority() { + return 1; + } + + @Override + public String operationName() { + return "*"; + } + + @Override + public int calculation(int beforeNumber, int afterNumber) { + int Result = beforeNumber * afterNumber; + return Result; + } +} diff --git a/src/main/java/calculator/Operation.java b/src/main/java/calculator/Operation.java new file mode 100644 index 0000000..d47ad26 --- /dev/null +++ b/src/main/java/calculator/Operation.java @@ -0,0 +1,14 @@ +package calculator; + +interface OperationInterface { + public int operationPriority(); + + public String operationName(); + + public int calculation(int beforeNumber, int afterNumber); +} + + + + + diff --git a/src/main/java/calculator/OutputUserData.java b/src/main/java/calculator/OutputUserData.java new file mode 100644 index 0000000..3e00b2a --- /dev/null +++ b/src/main/java/calculator/OutputUserData.java @@ -0,0 +1,4 @@ +package calculator; + +public class OutputUserData { +} diff --git a/src/main/java/calculator/SubOperation.java b/src/main/java/calculator/SubOperation.java new file mode 100644 index 0000000..a0adeec --- /dev/null +++ b/src/main/java/calculator/SubOperation.java @@ -0,0 +1,19 @@ +package calculator; + +public class SubOperation implements OperationInterface { + @Override + public int operationPriority() { + return 1; + } + + @Override + public String operationName() { + return "-"; + } + + @Override + public int calculation(int beforeNumber, int afterNumber) { + int Result = beforeNumber - afterNumber; + return Result; + } +} \ No newline at end of file diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29..0000000 From 25e3e7a64f45a903386e724d22bd74d449a59f33 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 20:49:26 +0900 Subject: [PATCH 04/14] feat: add a method to initialize and rerun the calculator --- src/main/java/calculator/Calculator.java | 13 +++++++++++++ src/main/java/calculator/ErrorException.java | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 9b26899..5e36eba 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -25,6 +25,7 @@ public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack, arithmeticExpressionStack.clear(); System.out.println("결과"); System.out.println(firstNumber); + init(); } private int chooseOperatorAndCalculate(int firstNumber, String operator, int SecondNumber){ @@ -49,6 +50,18 @@ private int chooseOperatorAndCalculate(int firstNumber, String operator, int Sec return result; } + public void init(){ + Scanner scanner = new Scanner(System.in); + System.out.println("계산을 계속 진행하시려면 1, 멈추시려면 2를 눌러주세요"); + String value = scanner.nextLine(); + + if(value.equals("1")){ + calculation(); + } + else{ + System.exit(0); + } + } public String[] getEquation(){ Scanner scanner = new Scanner(System.in); diff --git a/src/main/java/calculator/ErrorException.java b/src/main/java/calculator/ErrorException.java index 9289555..d61065c 100644 --- a/src/main/java/calculator/ErrorException.java +++ b/src/main/java/calculator/ErrorException.java @@ -10,7 +10,7 @@ public int NumericalError(String number) { } catch (NumberFormatException e) { System.out.println("잘못된 연산기호 입니다."); Calculator calculator = new Calculator(); - calculator.calculation(); + calculator.init(); } return numberConverted; } From 3f697e6fd8c10f7072f994e1e613091922d91c7d Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 22:06:43 +0900 Subject: [PATCH 05/14] feat: add exception message list --- src/main/java/calculator/Calculator.java | 7 +++++-- src/main/java/calculator/ErrorException.java | 4 ++++ src/main/java/calculator/Message.java | 19 +++++++++++++++++++ src/main/java/calculator/OutputUserData.java | 4 ---- 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/main/java/calculator/Message.java delete mode 100644 src/main/java/calculator/OutputUserData.java diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 5e36eba..4c72217 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -4,6 +4,7 @@ public class Calculator { + Message message = new Message(); public void calculation(){ String[] equation_list = getEquation(); ArithmeticExpressionStack arithmeticExpressionStack = new ArithmeticExpressionStack(equation_list, equation_list.length); @@ -22,8 +23,7 @@ public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack, int secondNumber = exception.NumericalError(secondString); firstNumber = chooseOperatorAndCalculate(firstNumber, operator, secondNumber); } - arithmeticExpressionStack.clear(); - System.out.println("결과"); + System.out.print("결과 : "); System.out.println(firstNumber); init(); } @@ -46,6 +46,9 @@ private int chooseOperatorAndCalculate(int firstNumber, String operator, int Sec if (operator.equals(divideOperation.operationName())){ result = divideOperation.calculation(firstNumber, SecondNumber); } + else{ + message.exceptionResult("NOT_OPERATOR"); + } return result; } diff --git a/src/main/java/calculator/ErrorException.java b/src/main/java/calculator/ErrorException.java index d61065c..7c0e4bb 100644 --- a/src/main/java/calculator/ErrorException.java +++ b/src/main/java/calculator/ErrorException.java @@ -14,4 +14,8 @@ public int NumericalError(String number) { } return numberConverted; } + + public void OperatorError(){ + + } } diff --git a/src/main/java/calculator/Message.java b/src/main/java/calculator/Message.java new file mode 100644 index 0000000..7141417 --- /dev/null +++ b/src/main/java/calculator/Message.java @@ -0,0 +1,19 @@ +package calculator; + +import java.lang.reflect.Field; +import java.util.HashMap; + +public class Message { + HashMap exceptionMessageList = new HashMap(); + public void calculationResult(){ + System.out.println(""); + } + private void exceptionMessageList(){ + exceptionMessageList.put("NOT_OPERATOR", "사칙연산 기호에 해당하지 않는 기호가 존재합니다."); + } + + public void exceptionResult(String exceptionKeyword){ + exceptionMessageList(); + System.out.println(exceptionMessageList.get(exceptionKeyword)); + } +} diff --git a/src/main/java/calculator/OutputUserData.java b/src/main/java/calculator/OutputUserData.java deleted file mode 100644 index 3e00b2a..0000000 --- a/src/main/java/calculator/OutputUserData.java +++ /dev/null @@ -1,4 +0,0 @@ -package calculator; - -public class OutputUserData { -} From a0723ccf5aa51739347d18c0e54f0b76f780ac07 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 22:19:28 +0900 Subject: [PATCH 06/14] refactor: fix message format in ErrorException and Message class --- src/main/java/calculator/Calculator.java | 14 ++++++++------ src/main/java/calculator/ErrorException.java | 7 ++----- src/main/java/calculator/Message.java | 6 ++++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 4c72217..f2be843 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -23,8 +23,10 @@ public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack, int secondNumber = exception.NumericalError(secondString); firstNumber = chooseOperatorAndCalculate(firstNumber, operator, secondNumber); } - System.out.print("결과 : "); - System.out.println(firstNumber); + + if(firstNumber != 0){ + message.calculationResult(firstNumber); + } init(); } @@ -37,13 +39,13 @@ private int chooseOperatorAndCalculate(int firstNumber, String operator, int Sec if (operator.equals(addOperation.operationName())){ result = addOperation.calculation(firstNumber, SecondNumber); } - if (operator.equals(subOperation.operationName())){ + else if (operator.equals(subOperation.operationName())){ result = subOperation.calculation(firstNumber, SecondNumber); } - if (operator.equals(multiplyOperation.operationName())){ + else if (operator.equals(multiplyOperation.operationName())){ result = multiplyOperation.calculation(firstNumber, SecondNumber); } - if (operator.equals(divideOperation.operationName())){ + else if (operator.equals(divideOperation.operationName())){ result = divideOperation.calculation(firstNumber, SecondNumber); } else{ @@ -55,7 +57,7 @@ private int chooseOperatorAndCalculate(int firstNumber, String operator, int Sec public void init(){ Scanner scanner = new Scanner(System.in); - System.out.println("계산을 계속 진행하시려면 1, 멈추시려면 2를 눌러주세요"); + System.out.println("계산을 계속 진행하시려면 1, 멈추시려면 임의의 다른키를 눌러주세요"); String value = scanner.nextLine(); if(value.equals("1")){ diff --git a/src/main/java/calculator/ErrorException.java b/src/main/java/calculator/ErrorException.java index 7c0e4bb..ca64869 100644 --- a/src/main/java/calculator/ErrorException.java +++ b/src/main/java/calculator/ErrorException.java @@ -3,19 +3,16 @@ import java.util.InputMismatchException; public class ErrorException { + Message message = new Message(); public int NumericalError(String number) { int numberConverted = 0; try { numberConverted = Integer.parseInt(number); } catch (NumberFormatException e) { - System.out.println("잘못된 연산기호 입니다."); + message.exceptionResult("INVALID_EQUATION"); Calculator calculator = new Calculator(); calculator.init(); } return numberConverted; } - - public void OperatorError(){ - - } } diff --git a/src/main/java/calculator/Message.java b/src/main/java/calculator/Message.java index 7141417..b497d61 100644 --- a/src/main/java/calculator/Message.java +++ b/src/main/java/calculator/Message.java @@ -5,11 +5,13 @@ public class Message { HashMap exceptionMessageList = new HashMap(); - public void calculationResult(){ - System.out.println(""); + public void calculationResult(int result){ + System.out.print("결과 : "); + System.out.println(result); } private void exceptionMessageList(){ exceptionMessageList.put("NOT_OPERATOR", "사칙연산 기호에 해당하지 않는 기호가 존재합니다."); + exceptionMessageList.put("INVALID_EQUATION", "잘못된 연산식입니다."); } public void exceptionResult(String exceptionKeyword){ From 9aab01072aacd4785f1eddc5c393d796384be0b0 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 22:22:19 +0900 Subject: [PATCH 07/14] refactor: delete unused parameter in OperatorSetting class --- src/main/java/calculator/Calculator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index f2be843..e446ea1 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -8,11 +8,11 @@ public class Calculator { public void calculation(){ String[] equation_list = getEquation(); ArithmeticExpressionStack arithmeticExpressionStack = new ArithmeticExpressionStack(equation_list, equation_list.length); - OperatorSetting(arithmeticExpressionStack, equation_list.length); + OperatorSetting(arithmeticExpressionStack); } - public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack, int equationLength) { + public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack) { ErrorException exception = new ErrorException(); String firstString = arithmeticExpressionStack.pop(); int firstNumber = exception.NumericalError(firstString); From ef52572c6529f210f25a77ee8ac54ff50b2dc87b Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 22:33:54 +0900 Subject: [PATCH 08/14] refactor: delete the userInputData class --- src/main/java/calculator/InputUserData.java | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/main/java/calculator/InputUserData.java diff --git a/src/main/java/calculator/InputUserData.java b/src/main/java/calculator/InputUserData.java deleted file mode 100644 index 9b97a4b..0000000 --- a/src/main/java/calculator/InputUserData.java +++ /dev/null @@ -1,9 +0,0 @@ -package calculator; -import java.util.Scanner; - -public class InputUserData { - public Scanner getEquation(){ - Scanner scanner = new Scanner(System.in); - return scanner; - } -} From 9199b85caa1292f85e600ff6a3624297ca047b3d Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 22:38:46 +0900 Subject: [PATCH 09/14] refactor: reset variable names that don't fit naming --- src/main/java/calculator/Calculator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index e446ea1..fbf01d2 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -15,17 +15,17 @@ public void calculation(){ public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack) { ErrorException exception = new ErrorException(); String firstString = arithmeticExpressionStack.pop(); - int firstNumber = exception.NumericalError(firstString); + int cumulativeResult = exception.NumericalError(firstString); for(int i = 0; i<(arithmeticExpressionStack.getStackSize())/2;i++){ String operator = arithmeticExpressionStack.pop(); String secondString = arithmeticExpressionStack.pop(); int secondNumber = exception.NumericalError(secondString); - firstNumber = chooseOperatorAndCalculate(firstNumber, operator, secondNumber); + cumulativeResult = chooseOperatorAndCalculate(cumulativeResult, operator, secondNumber); } - if(firstNumber != 0){ - message.calculationResult(firstNumber); + if(cumulativeResult != 0){ + message.calculationResult(cumulativeResult); } init(); } From 860bcd76b4129866c9c40b8264035c4268b9096e Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 22:40:37 +0900 Subject: [PATCH 10/14] refactor: rename variable name [exception] --- src/main/java/calculator/Calculator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index fbf01d2..8867f39 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -13,14 +13,14 @@ public void calculation(){ } public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack) { - ErrorException exception = new ErrorException(); + ErrorException exceptionCheck = new ErrorException(); String firstString = arithmeticExpressionStack.pop(); - int cumulativeResult = exception.NumericalError(firstString); + int cumulativeResult = exceptionCheck.NumericalError(firstString); for(int i = 0; i<(arithmeticExpressionStack.getStackSize())/2;i++){ String operator = arithmeticExpressionStack.pop(); String secondString = arithmeticExpressionStack.pop(); - int secondNumber = exception.NumericalError(secondString); + int secondNumber = exceptionCheck.NumericalError(secondString); cumulativeResult = chooseOperatorAndCalculate(cumulativeResult, operator, secondNumber); } From 529f7e494ed3664f3e992579c71d4de194c8aa68 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Thu, 25 Feb 2021 23:45:45 +0900 Subject: [PATCH 11/14] feat: add TDD basic format and test case for calculator class --- src/main/java/calculator/Calculator.java | 2 +- src/test/java/calculator/CalculatorTest.java | 69 ++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/test/java/calculator/CalculatorTest.java diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index 8867f39..a6702ba 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -30,7 +30,7 @@ public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack) init(); } - private int chooseOperatorAndCalculate(int firstNumber, String operator, int SecondNumber){ + public int chooseOperatorAndCalculate(int firstNumber, String operator, int SecondNumber){ AddOperation addOperation = new AddOperation(); SubOperation subOperation = new SubOperation(); MultiplyOperation multiplyOperation = new MultiplyOperation(); diff --git a/src/test/java/calculator/CalculatorTest.java b/src/test/java/calculator/CalculatorTest.java new file mode 100644 index 0000000..a50aec1 --- /dev/null +++ b/src/test/java/calculator/CalculatorTest.java @@ -0,0 +1,69 @@ +package calculator; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CalculatorTest { + + @BeforeEach + void setUp() { + Calculator calculator = new Calculator(); + } + + @Test + void calculation() { +// Calculator calculator = new Calculator(); +// calculator.calculation(); + } + + @Test + void operatorSetting() { + } + + @Test + void addChooseOperatorAndCalculate(){ + Calculator calculator = new Calculator(); + int firstNumber = 2; + String operator = "+"; + int secondNumber = 3; + int result = 0; + result = calculator.chooseOperatorAndCalculate(firstNumber, operator, secondNumber); + assertEquals(5, result); + } + + @Test + void subChooseOperatorAndCalculate(){ + Calculator calculator = new Calculator(); + int firstNumber = 2; + String operator = "-"; + int secondNumber = 3; + int result = 0; + result = calculator.chooseOperatorAndCalculate(firstNumber, operator, secondNumber); + assertEquals(-1, result); + } + + @Test + void multiplyChooseOperatorAndCalculate(){ + Calculator calculator = new Calculator(); + int firstNumber = 2; + String operator = "*"; + int secondNumber = 3; + int result = 0; + result = calculator.chooseOperatorAndCalculate(firstNumber, operator, secondNumber); + assertEquals(6, result); + } + + @Test + void divideChooseOperatorAndCalculate(){ + Calculator calculator = new Calculator(); + int firstNumber = 9; + String operator = "/"; + int secondNumber = 3; + int result = 0; + result = calculator.chooseOperatorAndCalculate(firstNumber, operator, secondNumber); + assertEquals(3, result); + } + +} \ No newline at end of file From 02edb1f38313acb1f0f9f343ef07966c4bc4e290 Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Fri, 26 Feb 2021 00:46:49 +0900 Subject: [PATCH 12/14] refactor: fix exception handling part divided by 0 --- src/main/java/calculator/DivideOperation.java | 3 ++- src/main/java/calculator/Message.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/calculator/DivideOperation.java b/src/main/java/calculator/DivideOperation.java index 33e8c7b..1efd04d 100644 --- a/src/main/java/calculator/DivideOperation.java +++ b/src/main/java/calculator/DivideOperation.java @@ -13,12 +13,13 @@ public String operationName() { @Override public int calculation(int beforeNumber, int afterNumber) { + Message message = new Message(); try{ int Result = beforeNumber / afterNumber; return Result; } catch (ArithmeticException e){ - System.out.println("0으로 나눌수가 없습니다."); + message.exceptionResult("INVALID_DIVIDE"); } return 0; } diff --git a/src/main/java/calculator/Message.java b/src/main/java/calculator/Message.java index b497d61..463313a 100644 --- a/src/main/java/calculator/Message.java +++ b/src/main/java/calculator/Message.java @@ -12,6 +12,7 @@ public void calculationResult(int result){ private void exceptionMessageList(){ exceptionMessageList.put("NOT_OPERATOR", "사칙연산 기호에 해당하지 않는 기호가 존재합니다."); exceptionMessageList.put("INVALID_EQUATION", "잘못된 연산식입니다."); + exceptionMessageList.put("INVALID_DIVIDE", "0으로 나눌수가 없습니다."); } public void exceptionResult(String exceptionKeyword){ From c3b416cf8796131f0c107adc7a25a23c29adfe4f Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Fri, 26 Feb 2021 02:06:54 +0900 Subject: [PATCH 13/14] feat: add comments to those classes and methods --- src/main/java/calculator/Application.java | 2 + .../calculator/ArithmeticExpressionStack.java | 2 +- src/main/java/calculator/Calculator.java | 54 +++++++++++++++++++ src/main/java/calculator/ErrorException.java | 7 +++ src/main/java/calculator/Message.java | 12 ++++- 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 2800320..62e6657 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -3,6 +3,8 @@ public class Application { public static void main(String[] args) { + + // Declare calculator object and start calculation Calculator calculator = new Calculator(); calculator.calculation(); } diff --git a/src/main/java/calculator/ArithmeticExpressionStack.java b/src/main/java/calculator/ArithmeticExpressionStack.java index 2606b1a..1762174 100644 --- a/src/main/java/calculator/ArithmeticExpressionStack.java +++ b/src/main/java/calculator/ArithmeticExpressionStack.java @@ -21,7 +21,7 @@ public ArithmeticExpressionStack(String[] equation, int stackSize){ public String pop(){ if(isEmpty()){ - return "없는데?"; + return "스택이 존재하지 않습니다."; } else{ return stack[flag++]; diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java index a6702ba..10e701e 100644 --- a/src/main/java/calculator/Calculator.java +++ b/src/main/java/calculator/Calculator.java @@ -5,6 +5,15 @@ public class Calculator { Message message = new Message(); + + /** + * calculation method + * 1. getEquation - Receives numeric expression in string format entered by user + * 2. Put numeric expressions on the stack + * 3. Passing the stack to the operatorSetting method + * + * return type : void + */ public void calculation(){ String[] equation_list = getEquation(); ArithmeticExpressionStack arithmeticExpressionStack = new ArithmeticExpressionStack(equation_list, equation_list.length); @@ -12,42 +21,74 @@ public void calculation(){ } + /** + * OperatorSetting method + * 1. Pop each operator and number onto the stack. + * 2. Perform error exception check and calculate + * 3. After the calculation process is complete, call init() to determine whether to return the calculator + * + * return type : void + */ public void OperatorSetting(ArithmeticExpressionStack arithmeticExpressionStack) { ErrorException exceptionCheck = new ErrorException(); String firstString = arithmeticExpressionStack.pop(); + + // Error checking when converting string to int int cumulativeResult = exceptionCheck.NumericalError(firstString); for(int i = 0; i<(arithmeticExpressionStack.getStackSize())/2;i++){ String operator = arithmeticExpressionStack.pop(); String secondString = arithmeticExpressionStack.pop(); int secondNumber = exceptionCheck.NumericalError(secondString); + + // calculated value are continuously accumulated cumulativeResult = chooseOperatorAndCalculate(cumulativeResult, operator, secondNumber); } if(cumulativeResult != 0){ message.calculationResult(cumulativeResult); } + + // Whether to re-execute after calculation init(); } + /** + * chooseOperatorAndCalculate method + * 1. Pop each operator and number onto the stack. + * 2. Perform error exception check and calculate + * 3. After the calculation process is complete, call init() to determine whether to return the calculator + * + * return type : int + */ public int chooseOperatorAndCalculate(int firstNumber, String operator, int SecondNumber){ AddOperation addOperation = new AddOperation(); SubOperation subOperation = new SubOperation(); MultiplyOperation multiplyOperation = new MultiplyOperation(); DivideOperation divideOperation = new DivideOperation(); int result = 0; + + // When the operator is equal to "+" if (operator.equals(addOperation.operationName())){ result = addOperation.calculation(firstNumber, SecondNumber); } + + // When the operator is equal to "-" else if (operator.equals(subOperation.operationName())){ result = subOperation.calculation(firstNumber, SecondNumber); } + + // When the operator is equal to "*" else if (operator.equals(multiplyOperation.operationName())){ result = multiplyOperation.calculation(firstNumber, SecondNumber); } + + // When the operator is equal to "/" else if (operator.equals(divideOperation.operationName())){ result = divideOperation.calculation(firstNumber, SecondNumber); } + + // Raise error when a symbol that does not correspond to the arithmetic operations(+, -, *, /) comes else{ message.exceptionResult("NOT_OPERATOR"); } @@ -55,6 +96,13 @@ else if (operator.equals(divideOperation.operationName())){ return result; } + /** + * init method + * - Input "1" to redo calculator. + * - Input another key to exit + * + * return type : void + */ public void init(){ Scanner scanner = new Scanner(System.in); System.out.println("계산을 계속 진행하시려면 1, 멈추시려면 임의의 다른키를 눌러주세요"); @@ -68,6 +116,12 @@ public void init(){ } } + /** + * getEquation method + * - Method to receive user input data + * + * return type : void + */ public String[] getEquation(){ Scanner scanner = new Scanner(System.in); System.out.print("수식을 입력해주세요 : "); diff --git a/src/main/java/calculator/ErrorException.java b/src/main/java/calculator/ErrorException.java index ca64869..33f64b8 100644 --- a/src/main/java/calculator/ErrorException.java +++ b/src/main/java/calculator/ErrorException.java @@ -4,6 +4,13 @@ public class ErrorException { Message message = new Message(); + + /** + * NumericalError method + * - Raise error when string is not converted to int + * + * return type : void + */ public int NumericalError(String number) { int numberConverted = 0; try { diff --git a/src/main/java/calculator/Message.java b/src/main/java/calculator/Message.java index 463313a..fc6db1f 100644 --- a/src/main/java/calculator/Message.java +++ b/src/main/java/calculator/Message.java @@ -1,20 +1,30 @@ package calculator; -import java.lang.reflect.Field; import java.util.HashMap; +/** + * Message class + * - message output class + * + * return type : void + */ public class Message { HashMap exceptionMessageList = new HashMap(); + + // Result output method when operation is normally performed public void calculationResult(int result){ System.out.print("결과 : "); System.out.println(result); } + + // Error message list management method private void exceptionMessageList(){ exceptionMessageList.put("NOT_OPERATOR", "사칙연산 기호에 해당하지 않는 기호가 존재합니다."); exceptionMessageList.put("INVALID_EQUATION", "잘못된 연산식입니다."); exceptionMessageList.put("INVALID_DIVIDE", "0으로 나눌수가 없습니다."); } + // Error message output method public void exceptionResult(String exceptionKeyword){ exceptionMessageList(); System.out.println(exceptionMessageList.get(exceptionKeyword)); From 825f9c8d958d8ab44f1e37a07518d048a4dccdbd Mon Sep 17 00:00:00 2001 From: Sehoon In Date: Fri, 26 Feb 2021 10:23:22 +0900 Subject: [PATCH 14/14] feat: add invalid test case --- src/test/java/calculator/CalculatorTest.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/test/java/calculator/CalculatorTest.java b/src/test/java/calculator/CalculatorTest.java index a50aec1..943ea75 100644 --- a/src/test/java/calculator/CalculatorTest.java +++ b/src/test/java/calculator/CalculatorTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; import static org.junit.jupiter.api.Assertions.*; @@ -14,8 +15,6 @@ void setUp() { @Test void calculation() { -// Calculator calculator = new Calculator(); -// calculator.calculation(); } @Test @@ -66,4 +65,19 @@ void divideChooseOperatorAndCalculate(){ assertEquals(3, result); } + @Test + void invalidCalculation(){ + // todo refactoring + assertThrows(NumberFormatException.class, new Executable() { + @Override + public void execute() throws Throwable { + Calculator calculator = new Calculator(); + + String[] equation_list = {"+", "1", "+"}; + ArithmeticExpressionStack arithmeticExpressionStack = new ArithmeticExpressionStack(equation_list, equation_list.length); + + calculator.OperatorSetting(arithmeticExpressionStack); + } + }); + } } \ No newline at end of file