-목차-
1. 함수의 개념
2. 함수의 정의 (Function Definition)
3. void 함수/procedure
4. 함수 호출 구조 : Call Number, Call Depth
5. 재귀 호출
1. 함수의 개념
- 입력값을 넣으면 출력 값이 나오는 (Black)Box로 이해하자. 이때 입력값을 인수, 인자, 매개변수라 하고, 출력값을 리턴값이라고 한다.
- C언어에서 복잡한 일을 여러 개의 함수로 나눠 해결하는게 핵심 프로그래밍 원리이다.
2. 함수의 정의 (Function Definition)
ret_type funct_name(arguments)
{
...
return (expression);
}
- 함수는 Header와 body로 구성된다.
- Header 부분에서는 return되는 값의 형태, 함수의 이름 그리고 매개변수로 구성된다.
- Body 부분에서는 함수의 소스코드 및 반환되는 값으로 구성된다. (이때, 반환값의 타입은 Header에서 선언한 ret_type과 동일해야 한다.)
ex)
#include <stdio.h>
float square(float x) // ret_type은 float, 함수 이름은 square, 매개변수는 float x로 구성된 Header
{
return (x*x); // x*x 라는 값을 반환함.
}
int main(void)
{
float x = 4;
float z ;
z = square(x); // 함수 호출할 때 들어가는 함수는 함수를 호출하는 함수에서 선언된 매개변수여야한다. "Call by value"
printf("%f의 제곱은 %f\n",x,z);
retunr 0;
}
3. void 함수/procedure
● return값이 없는 함수도 있다.
- 헤더에 있는 ret_type이 void인 함수.
- void 함수 혹은 void procedure라고 부른다.
- 결과 값 없이 함수 내에서 이뤄지는 부가적인 효과만을 이용하여 수행할 때 주로 사용한다.
- return문을 아예 안 쓰거나 return; 만 사용한다.
● 인자가 없는 함수도 있다.
- 함수 정의 시 매개변수란에 void 를 쓴다.
- 함수 호출 시에 빈괄호를 사용하면 된다.
- 대표적인 예로 int main(void)가 있다.
ex) void함수
#include <stdio.h>
void printf_integar(int n) // void함수
{
printf("%d\n",n);
return;
}
int main(void)
{
int n ;
scanf("%d",&n);
printf_integar(n);
return 0;
}
ex) 인자가 없는 함수
#include <stdio.h>
int scanf_integar(void)
{
int n ;
scanf("%d",&n);
return n;
}
int main(void)
{
int nx ;
nx = scanf_integar();
printf("%d",nx);
return 0;
}
+) return문이 여러 개 있는 함수를 작성하는건 안 좋은 습관이다.
4. 함수 호출 구조 : Call Number, Call Depth
- call number : 함수의 호출 번호(순서)
- call depth : 함수의 호출 깊이
ex) 연속 호출
- 위의 main 함수에서 square이라는 함수가 호출되고 square함수의 return값이 sq에 저장된 후, pi라는 함수가 호출되고 pi함수의 return값이 area에 저장된다.
- 따라서 이 과정에서 call nu은 3이고(1:mian함수, 2: square함수, 3: pi함수), call depth는 2이다.
ex) 함수 내 함수 호출
#include <stdio.h>
float square(float n)
{
return (n*n);
}
float circle(float x)
{
return (3.14 * square(x)) ;
}
int main(void)
{
float area;
area = circle(2.5);
printf("%f \n",area);
return 0;
}
- 위의 main 함수에서 circle이라는 함수가 호출되고 circle함수의 리턴값이 반환되는 과정에서 square함수가 호출된다.
- 따라서 call number은 3이고(1: main함수, 2: circle함수, 3 : square함수), call depth는 3이다.
5. 재귀 호출
- 재귀 호출이란 어떤 함수가 종료되지 않은 상황에서 자신을 다시 호출하는 것이다.
- 재귀 함수는 재귀 호출을 이용하는 함수이다.
ex) 팩토리얼 함수
# include <stdio.h>
int factorial(int n)
{
if (n == 0)
{
return 1;
}
else
{
return n * factorial(n-1);
}
}
int main(void)
{
printf("%d \n",factorial(5));
return 0;
}
ex) 피보나치 수열
#include <stdio.h>
int fibo(int n)
{
if (n == 0)
{
return 0 ;
}
else if (n == 1)
{
return 1 ;
}
else {
return fibo(n-1) + fibo(n-2);
}
}
int main(void)
{
printf("%d\n",fibo(6));
return 0;
}
ex) 하노이 타워
#include <stdio.h>
void hanoi_tower(int n, int ox, int tx, int mx) // n : 이동할 원반의 수, ox : 출발, tx : 목적지, mx : 중간 지점
{
if (n==1) {
printf("%d -> %d\n",ox,tx);
} else {
hanoi_tower(n-1,ox,mx,tx);
printf("%d -> %d\n",ox,tx);
hanoi_tower(n-1,mx,tx,ox);
}
}
int main(void){
int n;
printf("Enter the height of the tower\n");
scanf("%d",&n);
hanoi_tower(n,1,3,2);
return 0;
}
'CS > C, C++' 카테고리의 다른 글
[C/C++] 05-4 다양한 자료형과 자료 표현 - 연산자 (0) | 2021.10.03 |
---|---|
[C/C++] 05-3 다양한 자료형과 자료 표현 - 문자열 (0) | 2021.10.02 |
[C/C++] 05-2 다양한 자료형과 자료 표현 - 실수형 및 문자 (0) | 2021.09.30 |
[C/C++] 05-1 다양한 자료형과 자료 표현 - 정수형 (0) | 2021.09.29 |
[C/C++] 04 - 2 함수 선언과 변수 유효 범위 (0) | 2021.09.25 |