public void initialize() { state = NUMBER; num1 = 0; display = 0; }
public double numberToDisplay() { // if (state == NUMBER) // return num1; // else // state == NUM_OP_NUM // return num2; return display; }
public void setDisplay(double d) { display = d; state = NUMBER; num1 = d; }
public void Enter(String word) { if (state == NUMBER) { if ( word.length() == 1) { switch( word.charAt(0) ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num1 = num1 * 10 + (word.charAt(0)-'0'); display = num1; break; case '+': case '-': case '*': case '/': state = NUM_OP_NUM; op = word; num2 = 0; display = num1; break; case '=': display = num1; num1 = 0; break; case 'C': num1 = 0; display = 0; break; } } } else { // state == NUM_OP_NUM if ( word.length() == 1) { switch( word.charAt(0) ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num2 = num2 * 10 + (word.charAt(0)-'0'); display = num2; break; case '+': case '-': case '*': case '/': doCalc(); op = word; num2 = 0; display = num1; break; case '=': doCalc(); display = num1; num1 = 0; state = NUMBER; break; case 'C': num2 = 0; display = 0; break; } } } }
private void doCalc() { // In state NUM_OP_NUM switch(op.charAt(0)) { case '+': num1 = num1 + num2; break; case '-': num1 = num1 - num2; break; case '*': num1 = num1 * num2; break; case '/': num1 = num1 / num2; } }
이런식으로 사용하는건어떨까요
public static void main(String[] args) { CalculatorEngine ce = new CalculatorEngine(); ce.Enter("4"); ce.Enter("1"); ce.Enter("+"); ce.Enter("5"); ce.Enter("="); if (ce.numberToDisplay() != 46) System.err.println("Something wrong in the calculator engine"); }
Strtok로 토큰을 받아서 나누고 (100 + 300 이면 intarr[]에 숫자 symbolarr[]에 부호) 혹은 100 + 300 도 되고 100+300도 되면 와일룹 돌려서 부호 나올때까지 Ctoi() 만들어서 스트링을 인티저로 넘기고 부호 나오면 그 부호로 셈을 하면 되겠는데요 (스위치케이스나 이프) 빅 데시몰 구현이면 연결리스트로 숫자를 구현해도 되고... 아니라면 트리로써서 rpn이던 뭐던 notation으로 바꾸는게 편할거 같은데