*, / 연산자에 대한 우선순위 고려하여 계산 알고리즘을 개선 해보자.
--------------------------------------------------------------------------
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 |