본문 바로가기

 함수의 개요

다음과 같이 기능A를 3번 수행하는 프로그램에 대해 생각해보자.

똑같은 일을 3번 반복하고 있는데, 이런 경우 기능A를 수행하는 일을 담당하는 별도의 단위를 만들고 이 단위가 수행되도록 명령하면 프로그램이 간결해지고 이해하기가 쉬워질 것이다.

이와 같이 하나의 단위로 만들어진 기능을 함수라 한다. 위 그림을 일반적인 용어로 나타내면 다음과 같은데, 만들어진 함수A를 ‘함수 정의’라 하고 함수A가 실행되도록 명령하는 문장인 ‘함수A 호출’을 ‘함수 호출’이라 한다.

 

①.

함수를 호출하면 함수가 실행되고, 실행이 끝나면 호출한 부분으로 되돌아 와 호출 다음 부분을 실행한다.

그리고 이에 대한 C 프로그램과 실행 결과는 다음과 같다.

 

①.

함수를 호출할 때 값을 전달할 수 있는데 이런 값을 ‘매개변수’라 한다.

name이라는 매개변수를 갖는 hello 함수를 정의하고 호출하는 순서도는 다음과 같은데, 호출할 때 “홍길동”이 hello 함수로 전달되어 name에 저장된다.

다음은 이 내용을 C 언어로 나타낸 것으로, char name[]은 문자열을 저장하는 배열 name을 선언한 것이고 %s는 문자열을 출력할 때 사용한다.

 

①.

함수가 실행을 종료하면서 값을 반환할 수 있는데, 값을 반환하기 위해서는 return 오른쪽에 반환할 값을 위치시키면 된다.
다음은 전달 받은 두 개의 값에 대한 거듭제곱 값을 반환하는 power 함수 정의와 호출하는 순서도이다. power(3, 4) 호출하면 3과 4가 전달되어 a에 3이, b에 4가 저장되어 3의 4제곱인 81이 c에 저장되고 return에 의해 c 값인 81이 반환한다. 그러면 호출 문장인 power(3, 4)의 값이 81이 되어, 이 값이 a에 저장되어 결국 81이 출력된다.
다음은 이 내용을 C 언어로 나타낸 것이다.


예제

예제53

함수 이용해서 두 수 중 큰 수 찾기

두 수를 입력받고, 입력받은 두 수를 매개변수로 입력받아 큰 수를 찾아 반환하는 max 함수를 이용해서 두 수 중 큰 수를 찾는 소스코드를 완성하세요.

 

#include <stdio.h>
int max(int a, int b)  // a, b 중 큰 수를 반환하는 max 함수를 정의한다.
{
	if (a>b)
		return a;  // a 값을 반환한다.
	else
		return b; //  b 값을 반환한다.
}
int main()
{
	int a, b, r;
	printf("정수(2개): ");
	scanf("%d %d", &a, &b);
	r = max(a, b);  // max 함수를 호출하고, max 함수에서 반환된 값을 r에 저장한다.
	printf("큰 수: %d", r);
	return 0;
}

 

 

 

예제54

함수 이용해서 세 수 중 큰 수 찾기

세 수를 입력받고, 입력받은 세 수를 매개변수로 입력받아 가장 큰 수를 찾아 반환하는 max 함수를 이용해서 세 수 중 큰 수를 찾는 소스코드를 완성하세

#include <stdio.h>
int max(int a, int b, int c) // a, b, c 중 가장 큰 수를 반환하는 max 함수를 정의한다.
{
	if (a>b) {
		if (a>c)
			return a;
		else
			return c;
	}
	else {
		if (b>c)
			return b;
		else
			return c;
	}
}
int main()
{
	int a, b, c, r;
	printf("정수(3개): ");
	scanf("%d %d %d", &a, &b, &c);
	r = max(a, b, c);  // max 함수를 호출하고, max 함수에서 반환된 값을 r에 저장한다.
	printf("가장 큰 수: %d", r);
	return 0;
}

 

예제55

함수 이용해서 1부터 10까지의 약수 구하기

임의의 수에 대한 약수 구하는 aliquot 함수를 이용해서 1부터 10까지의 수에 대한 약수를 구한다.

 

#include <stdio.h>

void aliquot(int a)  // a의 약수를 구하는 aliquot 함수를 정의한다.
{
	int i;
	for (i = 1; i <= a; i++) {
		if (a % i == 0)
			printf("%d ", i);
	}
}
int main()
{
	int i;
	for (i = 1; i < < >= 10; i++) {
		printf("%d: ", i);
		aliquot(i);  // aliquot 함수를 호출한다. 이 때 i 값을 전달한다.
		printf("\n");
	}
	return 0;
}

 

과제

 

과제47

두 수를 입력받고, 입력받은 두 수를 매개변수로 입력받아 큰 수를 찾아 반환하는 min 함수를 이용해서 두 수 중 작은 수를 찾는 소스코드를 완성하세요.

과제48

소수 판별하는 함수를 이용해서 2부터 10까지의 수에 대해 소수인지 아닌지를 출력하는 순서도와 C 프로그램을 작성하세요.

 


도전

 

도전4 (p.249)

필자가좋아하는 것 중 하냐가금요일 저녁 퇴근길에 DVD나 만화책을잔뜩 빌리고, 동네 슈퍼에 들려서 군것질거리를 사가지고 집에 들어가는 것이다. 오늘은 금요일이다. 현재 필자의 주머니에 는 5천원이 있다. DVD 한편을 빌리면 3,500원이 남는다. 슈퍼에 들려서 크림빵(500원), 새우깡(700원), 콜라(400원)를 사려한다. 잔돈을 하나도 남기지 않고 이 세가지 물건을 하나 이상 반 드시 구매하려면 어떻게 구매를 진행해야 하겠는가? 물론 여기에는 여러 가지 경우의 수가 있을 것이다. 필자가 어떠한 선택을 할 수 있는지 여러분이 제시해 주기 바란다. 

 

@실행의 예

현재 당신이 소유하고 있는 금액 : 3500
크림빵 1개, 새우깡 2개, 콜 라 4개
크림빵2개, 새우깡3개, 콜라 1개
크림빵 4개, 새우깡 1개, 콜 라 2개
어떻게 구입하시겠습니까?

 

 

도전5 (p.249)

시용자로부터 초(second)를 입력 받은 후에, 이를 [시, 분, 초]의 형태로 출력하는 프로그램을작성해보자.

 

@실행의 예

초(second) 입력 : 3615
[h:1, m:0, s:15]

 

 

 

 

 

 

 

 

 

 

BasicLike

어? 나 프로그래밍 좋아하네?