728x90
▶문제 : 수식 계산 1 (codeup.kr)
수식 계산 1
우리가 일상 생활에서 사용하는 수학식은 대부분 중위 표기법이다. 중위 표기법은 어떠한 이항 연산에 대해 연산 대상 사이에 연산자를 표기하는 방식이다. 예를 들면 $ 3 + 5 * 7 $ $ (6 + 9) * 8 $ 등
codeup.kr
▶코드 작성
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int num[100], cnt = 0;
char str[201];
char *s = str, *temp;
scanf("%[^\n]s", str);//띄어쓰기 포함 입력
while (1)
{
temp = strchr(s, ' ');//s포인터부터 시작해서 띄어쓰기를 찾음
if (temp == NULL) break;//띄어쓰기가 없으면 종료
temp[0] = '\0';//띄어쓰기 부분을 null문자로 바꿈(s포인터를 사용해야하므로)
if (atoi(s) != 0) num[cnt++] = atoi(s);//s포인터의 문자열이 정수라면 num배열로
else
{
if (s[0] == '+') num[cnt - 2] += num[cnt - 1];//맨 끝에 두 숫자 계산
else if (s[0] == '-') num[cnt - 2] -= num[cnt - 1];
else if (s[0] == '*') num[cnt - 2] *= num[cnt - 1];
cnt--;
}
s = temp + 1;//null문자가 있는 부분 + 1을 하여 다음 문자를 대상으로 함
}
printf("%d", num[0]);//모든 계산이 끝나면 남은 숫자는 하나이므로 num[0]
return 0;
}
▶해석
scanf로 띄어쓰기 포함하여 문자를 입력받고, temp = strchr(s , ' ');해서 s포인터를 중심으로 띄어쓰기를 찾아갔다. temp가 null이면 띄어쓰기가 없다는 뜻이므로 종료해준다. 띄어쓰기를 찾으면 temp [0]이 띄어쓰기 부분이므로 null문자로 바꿔주어 s포인터를 단독으로 사용할 수 있게 하였다.
atoi함수로 s문자열이 정수인지 판별하여 정수라면 num배열에 넣어주었다.
+, -, *가 나오면 가장 최근에 num배열에 넣은 두 숫자를 계산하는 것이므로 num배열의 길이 cnt를 이용하여 계산하고cnt를 -1 해주었다.
s포인터를 띄어쓰기에 맞춰 다음 문자를 향해 가리켜야 하므로 원래 띄어쓰기였던 temp주소에 +1 하여 다음 문자를 가리켰다. 그렇게 strchr(s , ' ')로 찾아주면 마지막까지 도달할 수 있을 것이다.
모든 계산이 끝나면 num배열에는 하나의 수밖에 남지 않고, 그 자리가 num [0]이다.
728x90
'코드업(codeup) > C' 카테고리의 다른 글
코드업(codeup) 4654 : 탑 C언어 (0) | 2022.01.20 |
---|---|
코드업(codeup) 3102 : STL stack C언어 (3) | 2022.01.17 |
코드업(codeup) 3715 : 올바른 괄호 3 C언어 (0) | 2022.01.17 |
코드업(codeup) 3129 : 올바른 괄호 2 C언어 (0) | 2022.01.17 |
코드업(codeup) 2050 : 2048게임 3 C언어 (0) | 2022.01.16 |
댓글