프로그래밍 언어/C언어

C언어 8. 계산기 프로그램

닉네임못짓는사람 2020. 7. 12. 15:08
반응형

이번 글에선 입출력, 조건문, 반복문을 사용한 간단한 계산기 프로그램을 만들어보도록 하겠습니다.

코드를 보고 따라하기 전에 자신이 먼저 만들어보는 것도 나쁘지 않으니 해보시길 바랍니다.

#include<stdio.h>

int main() {
	char op, ex = 'n';			//연산자
	int num1, num2;		//입력받을 숫자

	printf("계산기 프로그램 시작\n");
	while (ex == 'n') {
		printf("수식을 입력해주세요. : ");
		scanf("%d %c %d", &num1, &op, &num2);
		getchar();
		if (op == '+') {
			printf("%d %c %d = %d", num1, op, num2, num1 + num2);
		}
		else if (op == '-') {
			printf("%d %c %d = %d", num1, op, num2, num1 - num2);
		}
		else if (op == '*') {
			printf("%d %c %d = %d", num1, op, num2, num1 * num2);
		}
		else if (op == '/') {
			printf("%d %c %d = %f", num1, op, num2, (float)num1 / num2);
		}
		else if (op == '%') {
			printf("%d %c %d = %d", num1, op, num2, num1 % num2);
		}
		else {

		}
		printf("\n");
		printf("계산기를 종료하시겠습니까? (y/n) : ");
		scanf("%c", &ex);
		getchar();
	}
	printf("계산기를 종료했습니다.");
}

사용자로부터 숫자, 연산자, 숫자순서로 입력받아서 결과를 출력하고

계산기를 종료할지 말지 입력값을 받아 사용자가 y를 입력하면 종료하고 n을 입력하면 계속 진행합니다.

 

그런데 코드를보시면 나눗셈을 하는 코드에서 (float)이란 걸 보실 수 있습니다.

이것은 형변환을 통해서 num1의 자료형을 float형으로 바꿔서 계산하는 것입니다.

형 변환이란?


그렇다면 이렇게 하는 이유는 무엇이며, 형 변환이라는 것은 대체 무엇이냐?

먼저 형 변환이란 어떤 변수의 자료형을 다른 자료형으로 변경하는 것입니다.

기본적으로 자료형의 크기가 작은 쪽에서 높은 쪽으로 형 변환하는 경우에는 형 확장이라 하고,

반대의 경우에는 형 축소라고 이야기합니다.

형 변환 시 자료형의 상하관계는 다음과 같습니다.

 

이 형 변환은 다시 암시적 형 변환과 명시적 형 변환으로 나뉘게 되는데요,

암시적 형 변환이란 컴파일러가 알아서 변수의 자료형을 적절하게 다른 자료형으로 바꾸어주는 것입니다.

이를 자동 형 변환이라고도 말합니다.

또한 명시적 형 변환이란 사용자가 명시적으로 바꿀 자료형을 지정하여 바꾸는 것을 이야기합니다.

 

간단한 예로 int형 변수 a를 선언하고 double형 변수 b에 a의 값을 대입하면

a의 값이 double형으로 형 변환되어 변수 b에 들어가게 됩니다. 이것이 암시적 형변환힙니다.

 

데이터의 손실에 주의하자


여기서 주의해야 할 점은 형 확장의 경우에는 암시적 형 변환이 가능하지만

형 축소의 경우에는 사용자가 자료형을 정해주는 명시적 형 변환을 해주어야 합니다.

그 이유는 형 축소시에는 데이터의 손실이 일어날 수 있기 때문인데요,

간단하게 물통으로 예를 들어보겠습니다.

 

큰 물통과 작은 물통이 있을 때, 큰 물통에 있는 물을 작은 물통으로 옮겨 담을 때

그 물이 작은 물통의 허용량을 넘으면 물이 넘치게 될 것입니다. 이것이 바로 데이터 손실입니다.

따라서 프로그래머는 이 물을 옮겨 담아도 문제가 없다고 컴파일러에게 명시적으로 알려주어야 합니다.

 

명시적 형 변환의 기본적인 사용법은 (자료형)변수 또는 (자료형)값 의 형태로 사용할 수 있습니다.

예를 들어 정수 15를 (float)15의 형태로 형 변환하면 값은 15.0이 됩니다.

 

그러면 이제 위의 코드로 돌아가서 나눗셈에서 왜 형 변환을 사용하였는지 설명해보겠습니다.

본래 C언어에서 나눗셈을 수행해서 결과를 실수로 표현하기 위해선 피연산자가 실수여야만 합니다.

그런데 형 변환을 하지 않으면 정수끼리 나눗셈을 하기 때문에 값이 제대로 구해지지 않습니다.

이는 컴퓨터에서 정수를 저장하는 방법과 실수를 저장하는 방법이 전혀 다르기 때문입니다.

 

따라서 명시적 형 변환을 통해 num1을 float형으로 바꾸어줌으로써 피연산자를 실수로 변경한 것입니다.

굳이 둘 다 바꿀 필요 없이 하나만 실수형으로 바꾸어주면 나눗셈 계산이 정상적으로 가능합니다.

위와 같은 계산식에서 복수의 변수중 하나만 실수형으로 바꾸게 되면,

나머지 변수들은 컴파일러가 알아서 암시적 형 변환을 해주기 때문입니다.

하지만 나눗셈의 결과를 정수로 표현하고 싶을 때(몫만 사용할 때)에는 굳이 형변환을 안 하셔도 됩니다.

 

이 정도로 계산기 구현과 형 변환에 대한 설명은 마치도록 하겠습니다.

계산기에 기능을 추가해서 코딩을 해보시는 것도 좋을 것 같으니 해보시기 바랍니다.

 

다음 글에선 사용자 정의 함수에 대해서 알아보도록 하겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > C언어' 카테고리의 다른 글

C언어 10. 배열  (0) 2020.07.13
C언어 9. 사용자 정의 함수  (0) 2020.07.12
C언어 7. 반복문  (0) 2020.07.11
C언어 6. 조건문  (0) 2020.07.11
C언어 5. 입출력  (0) 2020.07.10