본문

[2017.09.14] 02. Calculator 프로젝트 [괄호X]

중요 로직

 괄호가 없는 경우, 

Step 1. *, / 연산 우선

Step 2. 왼쪽에서 오른쪽으로 연산

 조건에 따라 연산을 처리하면 된다. 그래서 아래 그림과 같이 *, / 연산을 우선 처리 후 +, - 연산을 처리했다.


문제점 및 해결

  1. 연산자(+,-,*,/)와 피연산자(숫자) 구분 문제
    계산을 처리하기 위해서는 연산자와 피연산자를 구분하는 것이 필요해 연산자를 입력 받을 때 앞 뒤로 " "(공백)을 추가로 입력 받아 문제 해결, 이를 통해 1, 2, 3이 입력될 때 "1", "2", "3"이 아닌 "123"으로 처리도 가능해졌다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_div:
            case R.id.btn_plus:
            case R.id.btn_minus:
            case R.id.btn_multi:
                // 연산자는 앞 뒤로 공백 입력
                txtProcess.append(" " + ((TextView)view).getText() + " ");
                break;
            case R.id.btn_init:
                txtProcess.setText("");
                txtResult.setText("");
                break;
            case R.id.btn_result:
                // 결과를 계산하는 로직 
                calcTarget = txtProcess.getText()+"";
                try {
                    txtResult.setText(calc(calcTarget) + "");
                } catch (ArithmeticException e) {
                    Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                }
            break;
            default:
                // 피연잔사는 그대로 입력
                txtProcess.append(((TextView)view).getText());
                break;
        }
    }
    cs

  2. 결과 연산 시, for문 안 인덱스가 예상치 못한 데이터에 접근하는 문제
    처음에는 전체 연산을 담는 변수를 ArrayList로 설정 후 부분 연산의 결과를 ArrayList에 담을 예정이었다. 그러나 for문에서 ArrayList의 size를 사용하므로 ArrayList를 추가 삭제할 경우 예상치 못한 데이터에 접근
    그래서 전체 연산은 String 배열에 입력, 부분 연산은 ArrayList로 입력 받아 문제 해결

스크린 샷



#안드로이드 계산기 #사칙연산 #사칙연산 로직 #계산기 방법

공유

댓글