-
Notifications
You must be signed in to change notification settings - Fork 6
Songpang #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: songpang
Are you sure you want to change the base?
Songpang #6
Changes from all commits
3d4ec74
59160fa
fd2266a
25e3e7a
3f697e6
a0723cc
9aab010
f53fdf9
ef52572
9199b85
860bcd7
b6d6340
529f7e4
52021fa
02edb1f
c3b416c
fc69dd8
825f9c8
8081d30
2e4c9ce
d3be60f
7d05e50
2cc067f
ac1d609
74de276
f76879f
ec31a1b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| rootProject.name = 'java-calculator' | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,61 @@ | ||
| # 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 | ||
| ``` | ||
| #### (6) When the formula ends with an operation symbol | ||
| ```console | ||
| 연산을 입력해주세요 : 2-1* // 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, Node | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| package calculator; | ||
|
|
||
| public class AddOperation implements Operation { | ||
| @Override | ||
| public String operationName() { | ||
| return "+"; | ||
| } | ||
|
|
||
| @Override | ||
| public int calculation(int beforeNumber, int afterNumber) { | ||
| int Result = beforeNumber + afterNumber; | ||
| return Result; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| package calculator; | ||
|
|
||
|
|
||
| public class Application { | ||
| public static void main(String[] args) { | ||
|
|
||
| // Declare calculator object and start calculation | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 곳곳에 주석을 잘 작성해주셨네요! 그렇다면 주석이 필요 없냐? 그건 또 아닙니다.
|
||
| Calculator calculator = new Calculator(); | ||
| calculator.calculation(); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| package calculator; | ||
|
|
||
|
|
||
| interface Stack{ | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 스택, 큐 같은 자료구조는 대부분의 언어에 기본적으로 내장되어있습니다. |
||
| boolean isEmpty(); | ||
| String pop(); | ||
| void clear(); | ||
| } | ||
|
Comment on lines
+4
to
+8
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저는 인터페이스는 여러 클래스가 동일한 기능을 하도록 기준을 잡아주는 역할을 하는것으로 알고있는데 이 구조를 사용하는 클래스는 ArithmeticExpressionStack 클래스 하나인데 인터페이스를 사용하신 이유가 무엇인가요?
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이후 코드 확장성 측면을 생각하여 인터페이스를 사용했습니다. |
||
|
|
||
| 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; | ||
| } | ||
|
|
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,143 @@ | ||
| package calculator; | ||
|
|
||
| import java.util.Scanner; | ||
|
|
||
|
|
||
| public class Calculator { | ||
| private 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); | ||
| OperatorSetting(arithmeticExpressionStack); | ||
|
|
||
| } | ||
|
|
||
| /** | ||
| * 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{ | ||
| try { | ||
| throw new Exception(); | ||
| } catch (Exception e) { | ||
| e.getMessage(); | ||
| message.exceptionResult("NOT_OPERATOR"); | ||
| } | ||
| } | ||
|
|
||
| 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, 멈추시려면 임의의 다른키를 눌러주세요"); | ||
| String value = scanner.nextLine(); | ||
|
|
||
| if(value.equals("1")){ | ||
| calculation(); | ||
| } | ||
| else{ | ||
| System.exit(0); | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * getEquation method | ||
| * - Method to receive user input data | ||
| * | ||
| * return type : void | ||
| */ | ||
| String[] getEquation() { | ||
| String value = inputValues(); | ||
| String[] values = value.split(" "); | ||
| return values; | ||
| } | ||
|
|
||
| private String inputValues() { | ||
| Scanner scanner = new Scanner(System.in); | ||
| System.out.print("수식을 입력해주세요 : "); | ||
| String value = scanner.nextLine(); | ||
| return value; | ||
| } | ||
|
|
||
|
|
||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| package calculator; | ||
|
|
||
| public class DivideOperation implements Operation { | ||
| @Override | ||
| public String operationName() { | ||
| return "/"; | ||
| } | ||
|
|
||
| @Override | ||
| public int calculation(int beforeNumber, int afterNumber) { | ||
| Message message = new Message(); | ||
| try{ | ||
| int Result = beforeNumber / afterNumber; | ||
| return Result; | ||
| } | ||
| catch (ArithmeticException e){ | ||
| message.exceptionResult("INVALID_DIVIDE"); | ||
| } | ||
| return 0; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| package calculator; | ||
|
|
||
| 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 { | ||
| numberConverted = Integer.parseInt(number); | ||
| } catch (NumberFormatException e) { | ||
| message.exceptionResult("INVALID_EQUATION"); | ||
| Calculator calculator = new Calculator(); | ||
| calculator.init(); | ||
| } | ||
| return numberConverted; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| package calculator; | ||
|
|
||
| import java.util.HashMap; | ||
|
|
||
| /** | ||
| * Message class | ||
| * - message output class | ||
| * | ||
| * return type : void | ||
| */ | ||
| public class Message { | ||
| HashMap<String, String> exceptionMessageList = new HashMap<String, String>(); | ||
|
|
||
| // 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)); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| package calculator; | ||
|
|
||
| public class MultiplyOperation implements Operation { | ||
| @Override | ||
| public String operationName() { | ||
| return "*"; | ||
| } | ||
|
|
||
| @Override | ||
| public int calculation(int beforeNumber, int afterNumber) { | ||
| int Result = beforeNumber * afterNumber; | ||
| return Result; | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
겉멋을 잔뜩 부려놓으셨는데 나쁘지않네요~