본문 바로가기

컴퓨터/언어,프로그래밍

[C언어] C언어 함수

C 프로그래밍


<C 언어의 함수>


1. 개 요

  효과적으로 문제를 해결하는데 있어서 가장 중요한 일은 문제를 의미별로 나누어 보는 것이다. 문제를 접하고 이를 다룰 수 있는 작은 부분으로 나눈다는 것은 큰 프로그램을 작성하는 데 있어서 아주 중요한 기법이다. 함수의 기능은 프로그램의 하향식 구현을 위한 구조를 제공하게 된다. 각각의 프로그램은 1개 이상의 함수파일로 구성되어져는데 그 중의 하나가 main() 함수이다. 프로그램은 main()으로 실행을 시작하고 printf()나 sqrt()와 같은 라이브러리 함수를이나 사용자가 정의한 함수들을 사용한다.

  함수는 프로그램 변수를 가지고 작용하고 함수 안에서 사용할 수 있는 변수들은 변수 영역규칙에 의해 결정된다. 이번 보충학습을 통해서는 프로그램의 예를 통해 함수들이 포함된 포로그램을 어떻게 작성하고 실행시키는지를 중심으로 간략하게 기술하고자 한다.

C 프로그래밍의 핵심은 함수에 있다. 함수는 문제해결과정에서 블록을 구성하는 한 편의 코드를 나타낸다. 모든 함수는 동일한 외부수준에 있다. 함수는 다른 함수의 내부에 내포시킬 수 없다. 프로그램은 하나 혹은 그 이상의 파일에서 하나 이상의 함수로 구성된다. 엄밀히 말해 main() 함수는 하나의 함수이며, 여기서부터 프로그램 수행이 시작된다. 다른 함수들은 메인의 내부에서, 그리고 서로 서로의 내부에서 호출된다.

2. 함수의 사용 예

  함수의 사용법을 자세히 설명하기 위해 다음과 같은 작업을 설정해보자. 프로그램의 번역과 실행에서는 UNIX나 LINUX를 기본으로 하여 설명하기로 한다. 터보 C 의 경우는 교재를 참고하기 바란다. 

  ㅇ 먼저 프로그램에 관한 정보를 프린트한다.

  ㅇ int형 변수 n에 대한 값을 읽는다.

  ㅇ double형의 n개의 실수를 읽는다.

  ㅇ 최소값과 최대값을 계산하기 위해 자료를 처리한다.

  이것을 수행하는 프로그램은 다음과 같다.

    main()

    {

    int        i, n;

        double    min, max, x, minimum(), maximum();

    info();

    printf("\n\n n의 개수: “);

    scanf("%d", %n);

    printf("\n\n n의 개수 %d: ", n);

    scanf("%lf", &x);

    min = max = x;

        for(i = 2; i <= n; ++i) {

        scanf("%lf" &x);

        min = minimum(min, x);

            max = maximum(max, x);

    }

    printf("\n\n 최소값 = %f\n 최대값 = %f\n\n", min, max);

    }

    

    info()

    {

    printf("\n%s\n%s\n%s",

        "이 프로그램은 n개의 정수값을 읽어“

            “최대, 최소값을 찾기 위해”,

            “n개의 수를 처리한다.”);

    }


    double minimum(x, y)

    double     x, y;

    {

    if (x < y)

        return(x);

    else

        return(y);

    }

    double maximum(x, y)

    double    x, y;

    {

    if(x > y)

        return(x);

    else

        return(y);

    }


이 코드가 모두 하나의 파일 process.c에 있다고 가정하자. UNIX 명령어를 사용할 경우 

   cc -o process process.c

는 파일을 컴파일하고 실행 가능한 출력을 파일 process에 넣는다. 프로그램을 실행하기 위해서는 명령어  process를 실행한다.

터보 C의 경우 컴파일하기 위해서는

   tcc process.c

를 통해 실행파일인 process.exe를 만들고 실행을 위해서는 process를 입력한다.

이 프로그램의 실행을 위해 데이터를 입력하게 되는데 5 및 아래의 값들을 입력시켜 보자.


    737.7799  -11.2e+3  -777   .001  3.14159

  그러면 화면에 나타나는 출력은 다음과 같다.

    이 프로그램은 n개의 정수값을 읽어

    최대, 최소값을 찾기 위해

    n개의 수를 처리한다.

    n의 개수: 5

    n의 개수 5: 737.7799  -11.2e+3  -777  .001  3.14159


    최소값 = -11200.000000

    최대값 = 737.779900

 

  UNIX의 경우 명령어를 실행할 때 파일로부터 입력을 취하는 것도 가능하다. 이것을 위해 data라는  파일을 생성한다. 이때 첫 번째 자료항은 나머지 실수값들의 개수가 된다. 다음 명령어

    process < data

는 프로그램의 입력을 파일 data로부터 취하도록 한다.


3. 프로그램 process의 분석


    double    min, max, x, minimum, maximum();

  이것은 변수 min, max 및 x를 double형으로 선언하고, 함수 minimum() 및 maximum()를 double형의 값으로 반환하도록 선언한 것이다. 만약 함수가 여기에서 선언이 되지 않으면 디폴트로 컴파일러가 int형의 값을 변환하는 함수로 간주한다.

    info();

  이 문장은 함수 info()를 호출한다. 이 함수는 하나의 printf() 문을 포함하는데, 이는 프로그램에 관한 정보를 프린트한다.

    scanf("%lf", &x);

    min = max = x;

  첫 번째 실수를 읽고 변수 x에 값을 저장한다. 그 다음에 min과 max에 그 값을 치환한다. 치환연산자의 조합으로 인하여 다음과 같이 동등한 문장으로 작성할 수 있다.(제 3 장 참조).

    min = (max = x);

    for(i = 2; i <= n; ++i) {

    scanf("%lf", &x);

    min = minimum(min, x);

        max = maximum(max, x);

    }


  루프를 거치는 매번 새로운 값이 x로 읽혀진다. min과 x의  현재 값이 함수 minimum()의 인수로 전달되며, 두 값 중에서 작은 값이 min에 치환되어 반환된다. max와 x의 현재 값은 함수 maximum()의 인수로 전달되며, 두 값 중에서 큰 값이 max에 치환되어 반환된다.

  C 언어에서 함수의 인수는 언제나 값에 의해 전달된다. 이것은 각각의 인수에 대해 사본이 만들어지고, 함수는 이 사본을 가지고 처리한다는 것을 의미한다. 이것은 함수로의 원래 인수가 호출된 환경에 의해 변경되지 않도록 하는 작용을 한다.

    info()

    {

     . . . .

    }

  이 코드는 함수 info()를 정의한다. 함수정의의 머리부는 왼쪽 중괄호 앞에 나타난다. 함수정의의 몸체는 중괄호 사이의 문장으로 이루어진다.

이 함수의 몸체에서 코드는 하나의 printf()문이다.

     double minimum(x, y)

     double  x, y;

    {

    if(x < y)

        return(x);

    else

            return(y);

    }

  이 코드는 함수 minimum을 정의한다. 처음 2개의 라인은 함수의 머리부이다. 함수의 몸체는 중괄호 사이의 모든 것으로 이루어져 있다. 머리부에서 첫 번째  키워드 double은 컴파일러에게 이 함수가 double형의 값을 반환한다는 것을 알려준다. 식별자 x와 y는 함수의 형식매개변수이다. 매개변수 리스트는 괄호 안에서 컴마로 구분된 모든 식별자롤 이루어진다. 매개변수 리스트에서 식별자들은 오른쪽 괄호로 선언된다. 따라서 x와 y는 라인에 의해 double형의 형식매개변수로 선언된다.

   double x, y;

  식별자 x와 y는 함수 main()뿐만 아니라, 여기에서도 이용되지만 그들간의 관계는 없다 함수에서의 매개변수는 기억장소를 잡는 것으로 간주된다. 값이 함수에 매개변수로서 전달될 때 함수의 몸체는 그 값을 가지고 무엇을 할 것인가를 기술한다. 이 함수의 몸체는 두 개의 return문을 갖는 if-else문으로 이루어져 있다.

  return문의 형식은 다음과 같다.

    return;     또는   return식

  return문은 호출환경으로 제어를 되돌리는 작용을 한다. 키워드 return 다음에 식이 있으면 식의 값도 반환된다. 식은 괄호로 묶는 것이 보통이며, 이것은 읽기에 보다 명확하게 해준다.

    double maximum(x, y)

    double  x, y;

    {

       . . . . .

    }

이 코드는 함수 maximum()을 정의한다.

  파일 process.c에 함수 main()을 파일 info.c에 함수 info()를, 파일 minimum.c에 함수 minimum()를, 그리고 파일 maximum.c에 함수 maximum()을 넣었다고 가정하자.

  그러면 UNIX 명령어

   

    cc -o process process.c info.c minimum.c maximum.c

cc 컴파일러가 실행 가능한 프로그램을 파일 process에 넣도록 해준다. 또한 cc는 하나 이상의 파일에 대해 작업을 수행하도록 호출되었기 때문에 대응하는 .o 파일을 생성한다. 따라서 파일 process.o, info.o, minimum.o, maximum.o

를 생성시킨다. 이들 파일은 거의 실행할 수 있는 목적 코드를 갖는다. 함수들 중 하나, 예를 들어 info.c의 원시코드가 변경되었다고 가정해보자.

  그러면 명령어

    cc -o process process.o info.c minimum.o. maximum.o

는 프로그램을 다시 컴파일시킨다. .c 파일 대신에 .o 파일을 이용하는 것이 가능하면 컴파일러의 작업을 보다 빨리 해준다.



제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...