공부/C programming

8. 함수

natom_ 2016. 5. 10. 14:40
반응형

1. 함수의 종류


   (1) 라이브러리 함수의 개념, 예(8-1)


 : 라이브러리 함수는 미리 정의되어 있으므로 직접 정의할 필요 없이 함수 호출(function call)을 통해 바로 이용할 수 있다.

   주의할 것은 라이브러리 함수를 사용하려면 해당 함수의 원형을 포함하고 있는 헤더 파일을 프로그램에 포함하도록 include지시자를 명시해야한다.

   지금까지 사용한 printf와 scanf가 라이브러리 함수이며, 이를 이용하기 위해 #include<stdio.h>를 사용한 것을 확인할 수 있다.


<소스코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>        //printf() 함수를 위한 헤더파일 
#include <stdlib.h>    
#include <math.h>        //sin함수를 위한 헤더파일 
#define PI 3.141592
 
int main(int argc, char *argv[]) {
    
    int degree;            //각도 값을 저장할 변수 
    double radian;        //degree의 라디안 값을 저장할 변수 
    
    for(degree=0;degree<=180;degree+=30)
    {    
        radian = (PI*degree)/180;        //각도를 라디안 단위로 변환 
        printf("sin(%d˚) = %.5lf\n",degree,sin(radian)); 
    }
    
    return 0;
}
cs


<실행 결과>


   (2) 사용자 정의 함수의 개념


필요한 값을 구해주는 라이브러리 함수가 없다면 main함수처럼 프로그래머가 직접 사용자 정의함수를 만들어서 사용해야한다.

사용자 정의 함수도 호출은 라이브러리 함수와 같으며 정의하는 방법은 지금까지 만든 main함수와 같다.



형식 

 함수명(인수 목록)

 ↘인수목록 : 인수1, 인수2, ...., 인수n




2. 함수에서 사용하는 용어


   (1) 인수란

  : 함수를 호출할 때 전달하는 정보 

   (2) 매개변수

  : 호출된 함수 측에서 전달된 인수의 값을 저장하는 변수



3. 사용자정의 함수 만들기 실습1 - 두수중 큰값구하기(프로그램8-3, 소스코드, 실행결과)


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>        //printf() 함수를 위한 헤더파일 
#include <stdlib.h>    
 
//정수 두개를 전달받아 큰 값을 반환하는 find_larger함수의 정의

//2. 함수의 기능구현 : main()함수 위에 구현! 
int find_large(int first, int second) { 
    
    int larger;
    
    if(first>second)
        larger = first;
    else
        larger = second;
        
        
    return larger;
 
 
}
 
 
 
//main함수의 정의 
int main(int argc, char *argv[]) {
    
    int n1, n2, max;
    
    printf("첫번째 정수 입력 : ");
    scanf("%d",&n1);
    
    printf("두번째 정수 입력 : ");
    scanf("%d",&n2);
    
    
    //find_larger함수를 호출 후 반환된 값을 max에 저장 
    //1. main()에서 함수 이름을 정의한다.
    max = find_large(n1,n2);
    
    
    
    //3. 함수 결과값 출력
    printf("%d, %d중 큰 값은 %d입니다. ", n1, n2, max); 
     
     
    return 0;
}
cs


<실행결과>




4. 함수의 원형선언 형식

 

반환 값의 자료형  함수명(매개변수의 자료형 목록);

↘매개 변수의 자료형 목록은 다음과 같이 선언문 형태 또는 자료형만 명시하는 것 두가지 모두 가능하다.


① (자료형1 매개변수1, 자료형2 매개변수2, ..., 자료형n 매개변수n)

② (자료형1, 자료형2, ..., 자료형n)





5. 함수의 원형선언 예제(프로그램8-4 소스코드, 실행결과)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
 
//find_lager함수의 원형선언
int find_lager(int first, int second); 
 
int main(int argc, char *argv[]) {
    
    int n1, n2, max;
    
    printf("첫째 정수? >>");     scanf("%d",&n1);
    printf("둘째 정수? >>");    scanf("%d",&n2);
    
    //find_lager함수 호출 후 반한된 값을 max에 저장
    max = find_lager(n1,n2);
    printf("\n%d, %d중 큰 값은 %d\n",n1,n2,max); 
    
    return 0;
}
 
 
int find_lager(int first, int second)
{
    if(first>second)
        return first;
    else
        return second;
        
}
 
cs


6. 함수간의 인수전달방법


 (1) 값에 의한 호출(call-by-value)개념, 예제(프로그램 8-6 또는 프로그램8-7 소스코드, 실행결과)    


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>        
#include <stdlib.h>    
 
 
 
//함수의 원형 선언
int get_pay(int hours, int day_rate, int hour_rate);
 
 
//main 함수의 정의 
int main(int argc, char *argv[]) {
    
 
    int total_hours;            //근로 시간 
    int daily_rate=100000, hourly_rate=10000;        //일급, 시급 
    int pay;                    //임금
    
 
    printf("근로 시간은?");
    scanf("%d",&total_hours);
    
    pay = get_pay(total_hours, daily_rate,hourly_rate);
    printf("총 하루 임금은 %d원 \n",pay);
    
    return 0
}
 
 
//근로 시간에 대한 급여를 구하는 get_pay함수의 정의
int get_pay(int hours, int day_rate, int hour_rate)
{
    int day = hours/8;
    hours = hours % 8;
    
    return(day * day_rate + hours * hour_rate);
    
 } 
cs


call by value(값에 의한 호출)은 인수를 값에 의한 호출방식으로 전달하면 프로그래밍에서 아주 중요한 함수 간의 독립성을 보장할 수있다.


<실행결과>



 (2) 주소에 의한 호출(call-by-address)


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
 
void sort(int *first, int *second);
 
 
int main(int argc, char *argv[]) {
    
    int point1 = 5000,point2 = 4000;
    
    printf("함수 호출 전 포인트 점수 %d, %d\n", point1, point2);
    
    sort(&point1, &point2);
    
    printf("함수 호출 후 포인트 점수 %d, %d\n", point1, point2);
    
    
    return 0;
}
 
void sort(int *first, int *second)
{
    int temp;
    
    if(*first>*second)
    {
        temp = *first;
        *first = *second;
        *second = temp;
        
    }
    printf("\n sort함수 정렬 결과 first : %d, second : %d\n\n",*first,*second);
    
}
cs


call by value(값에 의한 호출)는 변수를 독집적인 공간으로부터 직접 참조하여 변경할수 없기 때문에 값을 변경하게 될 때 한계가 있다.

이를 해결하기 위한 방법으로 call by address(주소에 의한 호출)을 사용하였다.

다른함수의 변수를 직접 사용할 수 없지만 간접적으로 사용할 수 있게 해주는 포인터를 사용한다.

그리고 간접 참조 연산자인 '*'을 사용하여 간접적으로 참조 할 수 있게 해주었다.


<실행 결과>




7. 배열 전체를 함수로 전달


call by address 이용

배열이름(시작주소) -> 함수선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
#define N 4
 
 
//3. 함수의 원형 선언.(끝에 반드시 ; 붙인다.) 
void print_arr(int arr[]);
void percentage(int arr[N]);
 
int main(int argc, char *argv[]) {
 
 
    int count[N] = {42,37,83,33};        //유명인 선택수를 저장한 배열 
 
    printf("인원 수 >> ");
    //1. 함수 이름 정의
 
 
    //배열 전체를 함수로 넘길 때  배열 이름은 시작주소 이기때문에 전체를 넘길 수 있다. 
 
    print_arr(count);        //percentage 함수 호출 전 배열 출력 
    percentage(count);         //인원수를 백분율로 변경 
 
        
 
    printf("\n백분율 >> ");
    print_arr(count);
 
 
    return 0;
 
}
 
 
 
//배열을 선언한다. (배열의 원소를 출력하는 함수)
void print_arr(int arr[])    //int arr[N]도 가능     
 
{
 
    int i;
 
    
 
    for(i=0; i<N; i++)
 
    {
 
        printf("%3d",arr[i]);
 
    }
 
}
 
 
 
//배열에 저장된 수치를 백분율로 변경하는 함수 
void percentage(int arr[N])
{
 
    int i,total=0;
 
    
 
    //인기도 조사에 참여한 전체 인원을 total에 구하기 
    for(i=0; i<N; i++)
        total += arr[i];
 
    
 
    //전체 인원수 total을 이용해 백분율 구하기    
    for(i=0; i<N; i++)
        arr[i] = (int)((double)arr[i]/total*100);
        //형변환 연산자을 사용하였다. 
 
 
 
cs










반응형

'공부 > C programming' 카테고리의 다른 글

9. 변수의 참조 영역과 지속기간  (0) 2016.05.13
dd  (0) 2016.05.12
D  (0) 2016.05.03
7. 배열  (0) 2016.04.15
6. 전처리기  (0) 2016.04.15