본문 바로가기

개발/C&C++

(C/C++ 속성 정리) 22일 차 : 함수포인터를 이용한 사칙연산 계산기 만들기

안녕하세요 넬다이 입니다.

오늘은 함수포인터를 이용해서 계산기를 만들어 보는 시간을 가져볼까 합니다.

짧은 내용이니 부담갖지 마시고 다들 파이팅입니다.

 


계산기만들기

자 계산기를 만들어 볼껀데요 사칙연산 계산을 위해서 일단 함수들은 적어보겠습니다.

int PlusFunc(int iFirst, int iSecond);
int MinusFunc(int iFirst, int iSecond);
int MultiFunc(int iFirst, int iSecond);
int DivFunc(int iFirst, int iSecond);

자 일단 계산을 하기위한 함수 4개를 선언하고 이에 맞는 정의를 해보도록 하겠습니다.

int PlusFunc(int iFirst, int iSecond)
{
	return iFirst + iSecond;
}

int MinusFunc(int iFirst, int iSecond)
{
	return iFirst - iSecond;
}

int MultiFunc(int iFirst, int iSecond)
{
	return iFirst * iSecond;
}

int DivFunc(int iFirst, int iSecond)
{
	return iFirst / iSecond;
}

자 이렇게 간단하게 함수를 만들었는데요.

사칙연산만 하는것이라서 간단하게 함수들을 정의를 해보았습니다.

 

자 그러면 이제 Main을 짜볼껀데요 계산을 위해서 값을 받아보도록 하겠습니다.

#include <iostream>

using namespace std;

typedef int (*FunctionPtr)(int, int);

void main(void)
{
	while(true)
	{
		int  iFirst = 0;
		int  iSecond = 0;
		char cOperator = 0;

		//함수의 주소를 담을 포인터
		FunctionPtr pCalFunc = NULL;
	}
}

자 여기서 궁금하신게 생기실것이라고 생각합니다.

 

내용을 보시면은 FunctionPtr pCalFunc = NULL이라는 구문이 보이실꺼에요 이건 무엇인고 하니

위에 보시면은 typedef int (*FunctionPtr)(int , int); 라고 적혀있는 구문이 보이시나요?

예전에 제가 struct를 알려드릴때 typedef struct라고 있었는데요 typedef struct 에서는 struct의 이름을 하나 더 지어준것이라고 이야기를 했었는데요 한마디로 이번에는 함수포인터에다가 FunctionPtr이라는 명칭을 하나 더 지어준것이라고 보면은 되요.

보자면은 리턴값(*함수명)(매게변수) 형태로 되어있으며 한두번 사용하다보면은 익숙해지실꺼에요.

 

자 그렇다면은 FunctionPtr pCalFunc = NULL 은 typedef 로 이름을 하나 더 만들어둔 함수포인터라고 생각하시면 됩니다.

 

자 그렇다면 이제 함수포인터를 받아드릴수 있는 pCalFunc를 채워보도록 하겠습니다.

switch(cOperator)
{
case '+':
	pCalFunc = PlusFunc;
	break;
case '-':
	pCalFunc = MinusFunc;
	break;
case '*':
	pCalFunc = MultiFunc;
	break;
case '/':
	pCalFunc = DivFunc;
	break;
}

 

자 이렇게 cOperator를 받으셨으면은 그에 맞게 switch로 채워주는 작업을 진행했는데요.

각각 연사자의 맞게 함수를 넣어주시면 됩니다.

 

그 후 이 함수를 호출을 해봐야겠죠? 함수 호출은

cout << iFirst << COperator << iSecond << " = "
	<< pCalFunc(iFirst, iSecond) << endl;

 

이런식으로 호출을 해주시면 됩니다.

그렇게 되면은 각각 함수의 맞게 무엇인가 행동을 할 필요가 없이 함수 호출만 해주면 끝이기 때문에 제가 저번에도 말씀드린 코드량이 줄어든다는말이 이뜻입니다.

 

자 그럼 전체 구문을 합쳐보도록 하겠습니다

 

#include <iostream>

using namespace std;

typedef int (*FunctionPtr)(int, int);

int	PlusFunc(int iFirst, int iSecond);
int MinusFunc(int iFirst, int iSecond);
int MultiFunc(int iFirst, int iSecond);
int DivFunc(int iFirst, int iSecond);

void main(void)
{
	while(true)
	{
		system("cls");
		int  iFirst = 0;
		int  iSecond = 0;
		char cOperator = 0;

		FunctionPtr pCalFunc = NULL;

		cout << "첫 번째 : ";
		cin >> iFirst;
		cout << "연산자 : ";
		cin >> cOperator;
		cout << "두 번째 : ";
		cin >> iSecond;

		switch(cOperator)
		{
		case '+':
			pCalFunc = PlusFunc;
			break;
		case '-':
			pCalFunc = MinusFunc;
			break;
		case '*':
			pCalFunc = MultiFunc;
			break;
		case '/':
			pCalFunc = DivFunc;
			break;
		}

		cout << iFirst << COperator << iSecond << " = "
			<< pCalFunc(iFirst, iSecond) << endl;

		system("pause");
	}
}

int PlusFunc(int iFirst, int iSecond)
{
	return iFirst + iSecond;
}

int MinusFunc(int iFirst, int iSecond)
{
	return iFirst - iSecond;
}

int MultiFunc(int iFirst, int iSecond)
{
	return iFirst * iSecond;
}

int DivFunc(int iFirst, int iSecond)
{
	return iFirst / iSecond;
}

이렇게 해서 계산기 하나를 만들어 보았는데요 어떠신가요??? 많이 어려우신가요? 아님 쉬우신가요?

어렵다고 하시는분이나 쉬우신분이시거나 결국은 배우는 속도의 차이일뿐 서로 같은 길을 가고있을 뿐이라고 생각해요.

저도 처음에는 많이 어렵게 느껴진 계산기도 지금은 이렇게 막힘없이 짜내고 있으니깐요.

여러분들도 앞으로 많은 정진 하실거라고 생각해보겠습니다.

 

그럼 이만.

 

[개발/C&C++] - (C/C++ 속성 정리) 21일 차 : 함수포인터

[개발/C&C++] - (C/C++ 속성 정리) 20일 차 : 레퍼런스 변수의 사용

[개발/C&C++] - (C/C++ 속성 정리) 19일 차 : 재귀 함수 및 2차원 배열

[개발/C&C++] - (C/C++ 속성 정리) 18일 차 : 리스트를 이용해서 성적표 만들기 및 설계

[개발/C&C++] - (C/C++ 속성 정리) 17일 차 : 성적표 만들기 및 설계

[개발/C&C++] - (C/C++ 속성 정리) 16일 차 : 메모리 관련 함수