Calculator.zip
0.04MB

*, / 연산자에 대한 우선순위 고려하여 계산 알고리즘을 개선 해보자.

 

--------------------------------------------------------------------------

private void btnEqual_Click(object sender, EventArgs e)
{

    // tbDisplay 에 표시된 계산할 식을 가져와서, 숫자와 연산자로 구분

    // https://e2hwan.tistory.com/22


    // 'x', '/' 의 경우 뒤에서 부터 연산자를 하나씩 꺼내면서 결과 계산

    // 계산 결과를 앞 숫자 배열에 넣고 뒷 숫자 배열은 0 으로 바꿔준다.

    // 계산한 연산자 'x', '/' 는 '+'로 바꿔준다


    double resultCalc = 0;

    for (int i = opCnt; i >= 0; i--)
    {
        switch (arrOp[i])
        {
            case 'x':
                arrNum[i] = arrNum[i] * arrNum[i + 1];
                arrNum[i + 1] = 0;
                arrOp[i] = '+';
                break;
            case '/':
                arrNum[i] = arrNum[i] / arrNum[i + 1];
                arrNum[i + 1] = 0;
                arrOp[i] = '+';
                break;
            default:
                break;
        }
        resultCalc = arrNum[i + 1];
    }

 

    // '+', '-' 연산은 앞에서 부터 계산한다.

    for (int i = 0; i < opCnt; i++)
    {
        switch (arrOp[i])
        {
            case '+':
                arrNum[i + 1] = arrNum[i] + arrNum[i + 1];
                break;

            case '-':
                arrNum[i + 1] = arrNum[i] - arrNum[i + 1];
                break;
            default:
                break;
        }
        resultCalc = arrNum[i + 1];
    }

 

    Console.WriteLine(resultCalc);
    tbResult.Text = resultCalc.ToString();
}

--------------------------------------------------------------------------

아래 계산식에 대해서 x, / 계산을 먼저하고, 다시 +, - 연산을 진행

입력식 : 2*35+6-10/2

자료형 변수명
string strCalc "2x35+6-10/2"
char[] arrCalc[] { '2', 'x', '3', '5', '+', '6', '-', '1', '0', '/', '2'}
int[] calcNum[] { 2, 35, 6, 10, 2}
char[] calcOp[] { 'x', '+', '-', '/'}

 

<* , / 연산, 뒤에서 부터>

연산순서 연산자 calcNum[]
{ 2, 35, 6, 10 ,2}
calcOp[]
{ 'x', '+', '-' , '/'}
calcOp[3] / { 2, 35, 6, 5, 0} { 'x', '+', '-' , '+'}
calcOp[2] - { 2, 35, 6, 5, 0} { 'x', '+', '-' , '+'}
calcOp[1] + { 2, 35, 6, 5, 0} { 'x', '+', '-' , '+'}
calcOP[0] x { 70, 0, 6, 5, 0} { '+', '+', '-' , '+'}

 

<+ , - 연산, 앞에서 부터>

연산순서 연산자 calcNum[]
{ 70, 0, 6, 5, 0}
calcOp[0] + { 70, 70, 6, 5, 0}
calcOp[1] + { 70, 70, 76, 5, 0}
calcOp[2] - { 70, 70, 76, 71, 0}
calcOp[3] + { 70, 70, 76, 71, 71}

결과값 : 71

 

 

 

'C#' 카테고리의 다른 글

C# 계산기 만들기(3)  (0) 2021.02.24
C# 계산기 만들기(2)  (0) 2021.02.24
C# 계산기 만들기(1)  (0) 2021.02.24
[C#] Parameter, ref, out, 가변 파라미터  (0) 2021.01.15
[C#] Exception 처리, try catch finally  (0) 2021.01.15

+ Recent posts