혼자 공부하는 C언어 19챕터 도전실전예제
문제: 사칙연산 계산기 프로그램
사칙연산 수식을 입력하면 그 결과를 출력하는 프로그램을 작성합니다. 단, 수식을 입력하는 함수와 사칙연산 함수를 매크로 함수로 작성하세요.
풀이과정
scanf 를 이용해 수식을 입력하는 함수를 define INPUT을 통해 매크로 함수로 작성한다. 사칙연산 함수도 매크로로 작성한다.
Ctrl + Z를 하면 프로그램이 종료되도록 한다. 여기서 문제가 발생한다. Visual Studio 2022버전을 기준으로 scanf함수는 ^Z를 세번 입력해야 EOF를 반환한다. 애초에 scanf 의 반환 값은 입력받는 변수의 개수이며, EOF를 반환하는 경우는 알려지지 않은 오류가 발생했을 경우라는 글을 보았다. 이 말이 사실이라면, 비정상적인 경우를 이용하여 프로그래밍을 하는 것은 지양해야할 일이기 때문에 이러한 코딩은 분명 잘못된 것이다.
Ctrl + Z를 한번만 눌러서 프로그램을 종료하고 싶다면 scanf가 아닌 다른 함수를 사용해야 할 것이다.
#include <stdio.h>
#define INPUT(a, operator_symbol, b) scanf("%d %c %d", &a, &operator_symbol, &b);
#define PRINT_ADD(a, b) printf("%d + %d = %d", a, b, a+b);
#define PRINT_SUB(a, b) printf("%d - %d = %d", a, b, a-b);
#define PRINT_MUL(a, b) printf("%d * %d = %d", a, b, a*b);
#define PRINT_DIV(a, b) printf("%d / %d = %d", a, b, a/b);
int main(void)
{
int a, b, res;
char operator_symbol;
while (1)
{
printf("수식 입력(종료 Ctrl + z) : ");
res = INPUT(a, operator_symbol, b);
if (res == EOF) break;
else if (operator_symbol == '+') PRINT_ADD(a, b)
else if (operator_symbol == '-') PRINT_SUB(a, b)
else if (operator_symbol == '*') PRINT_MUL(a, b)
else if (operator_symbol == '/') PRINT_DIV(a, b);
}
return 0;
}