본문 바로가기

Programming/C language

Chapter 10. 함수에 대한 기본 이론 (문제 풀이)

필수 실습문제)


10-01) 사용자가 입력한 값에서 최댓값 구하기와 코드 분할 


다음 코드는 사용자로부터 세 정수를 입력받아 최댓값을 찾아 출력하는 프로그램입니다. 

주석문을 보면, 이 프로그램은 입력, 최댓값 계산, 출력 등 세 부분으로 구성됨을 알 수 있습니다. 

우선 다음 코드의 내용 및 실행결과를 확인합니다. 


#include <stdio.h>


int main(void)

{

int aList[3] = {0};

int nMax = -9999, i = 0;

// 입력

for(i = 0; i < 3; i++)

{

printf("정수를 입력하세요 : ");

scanf_s("%d", &aList[i]);

}


// 최댓값 계산

nMax = aList[0];

for(i = 1; i < 3; i++)

{

if(aList[i] > nMax)

{

nMax = aList[i];

}

}


// 출력

printf("%d, %d, %d 중 가장 큰 수는 %d 입니다. \n", aLIst[0], aList[1], aList[2], nMax);


return 0;

}


위 코드를 다음과 같이 수정해도 같은 실행결과가 나올 수 있도록 3개의 사용자 정의 함수를 추가합니다. 


#include <stdio.h>


int main(void)

{

int aList[3] = {0};

int nMax = -9999, i = 0;

//입력

for(i = 0; i < 3; i++)

{

aList[i] = GetData();

}

// 최댓값 계산

nMax = GetMax(aList[0], aList[1], aList[2]);


// 출력

PrintData(aList[0], aList[i], aList[2], nMax);

return 0;

}





연습문제) 


1) 매개변수로 int형 자료 4개를 받아 그중 가장 작은 숫자를 반환하는 GetMin() 함수를 작성하세요. 


int GetMin(int a, int b, int c, int d)

{

int nMin = a;


if( nMin > b )

{

nMin = b;

}

if( nMin > c )

{

nMin = c;

}

if( nMin > d )

{

nMin = d;

}


return nMin;

}



2) 다음 코드는 계승을 계산하는 GetFactorial() 함수의 예를 보인 것입니다. 설계 원칙상 이 코드의 문제점으로 지적할 수 있는 부분은 무엇이며, 그 문제점을 수정하려면 GetFactorial() 함수의 코드는 어떻게 수정되어야 하는지 기술하세요. 


#include <stdio.h>


int GetFactorial(int nParam)

{

int nResult = 1, i = 0;

if(nParam < 1 || nParam > 10)

{

puts("ERROR: 1~10사이의 정수를 입력하세요.");

return 0;

}


for(i = 1; i <= param; i++)

{

nResult *= i;

}


return nResult;

}


int main(void)

{

printf("MAX: %d\n", GetFactorial(1));

printf("MAX: %d\n", GetFactorial(5));

printf("MAX: %d\n", GetFactorial(11));

printf("MAX: %d\n", GetFactorial(10));

return 0;

}


잘못된 부분

GetFactorial 에서 입력을 받는 일과 factorial을 계산하는 두가지 일을 모두 하고 있다. 

UI와 기능은 분리하는 것이 좋다. 


위 GetFactorial 함수는 다음과 같이 줄이는 것이 좋다고 판단된다. 


int GetFactorial(int nParam)

{

int nResult = 1;

if(nParam < 1 || nParam > 10)

{

return 0;

}


for(int i =0; i <= nParam; i++)

{

nResult *= i;

}


return nResult;

}


로 수정하고, main 함수에서 GetFactorial을 호출할 때 마다 반환값이 0인 경우에 대해서 error 코드를 출력해 주는것이 좋을 것이다. 



3) 기본요금과 나이를 매개변수로 받아서 나이에 따른 최종요금을 계산해 반환하는 GetFee( ) 함수를 작성하세요. 

단, 나이별 할인율은 다음과 같습니다. 


0~3 : 100% (무료)

4~13 : 50%

14~19 : 75%

20이상 : 0%




4) 함수의 원형 선언이 필요한 이유를 설명하세요. 


함수의 원형 선언없이 정의하고, 사용한다면 컴파일러는 위에서 아래로 컴파일 하기 때문에 

main 함수에서 사용된 함수가 어떤 녀석인지 알지 못한다. 


그래서 컴파일러에게 이러이러한 함수가 존재한다는 것을 알려주기 위해서 원형 선언을 하는 것이다. 



5) 다음 코드를 작성하고 실행하여 11을 입력한다면 어떤 결과가 출력되는지 쓰세요. 


#include <stdio.h>


int nInput = 100;


int TestFunc(void)

{

printf("%d\n", nInput);

}


int main(void)

{

int nInput = 0;

printf("%d\n", nInput);


if(nInput > 10)

{

int nInput = 20;

printf("%d\n", nInput);


TestFunc();


if(nInput >= 100)

{

printf("%d\n", nInput);

}

}


printf("%d\n", nInput);

return 0;

}


출력 결과

0

0




- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)