프로그래밍/C

4.1 함수의 기초(Basics of function)

피노리코 2014. 10. 30. 04:52

C언어에서 사람들이 어려워 하는것은 포인터 다 그래서 그런지 중요하다고 생각하는것 같다 하지만 내가 제일 중요하다고 생각하는 것은 함수이다 앞에 배운 연산이나 곧 배울 포인터 등도 결국 함수를 만드는 요소중 하나일 뿐이라고 생각 한다. 그래서 함수를 더 확실하게 잘 공부하자!


함수는 많은 연산작업을 여러개의 작은 연산 작업으로 세분하여 프로그래머에게 처음부터 큰 프로그램을 작성해야 한다는 부담을 덜어준다. 함수의 적당한 사용은 자세하게 알 필요가 없는 연산을 깜추어 주므로 전체적으로 프로그램이 명확해지며 수정또한 용이하게 해준다

C언어 함수는 쉽고 효과적으로 만들어 졌다 C 프로그램은 일반적으로 작은 함수가 여러개 모여서 이루어진 구조로 되어있다 프로그램은 하나 또는 여러개의 소스파일로 나눌수 있다 소스파일은 각각 독립적으로 컴파일 되며 라이브러리보부터 미리 컴파일 되어있는 함수들과 함께 사용될수 있다 그 과정을 여기에 자세히 언급 하지는 않겠는데 이는 함수를 불러오는 과정이 사용하는 시스템 종류에 따라 다르기 때문이다 ANSI 이전에 C함수는 와 달라 졌는데 함수와 선언될때 TYPE을 정의하는것이 다능하게 된것, 함수 정의의 구문도 달라 졌는데 이는 함수 선언과 정의를 부합시키기 위함이다. 이런 변화는 전보다 컴파일러가 더 많은 에러를 검사 할 수있게 해준다. 또 한 인자들이 올바르게 선언되어 있다면 자동적으로인자들의 type을 일치시켜 준다.


어떤 특정한 패턴이나 문자열을 포함한 행을 출력시키는 프로그램을 작성해 보자 예를들어 다음행들의 집합에서 ould 라는 문자 패턴이 있는 행만 출력하면


An love! could you and I with fate conspire 

to grasp this sorry scheme of things entire

would not we shatter it ro bits -- and then

Re-mould it nearer to the Heart's Dessire!


다음과 같은 결과값을 얻을 것이다


An love! could you and I with fate conspire

would not we shatter it ro bits -- and then

Re-mould it nearer to the Heart's Dessire!


이 작업은 다음과 같이 세부분으로 구성된다


while (행이 있는 동안)

        if ( 패턴이 속에 있으면)

            행을출력한다


이 부분들은 main 루틴에 모두 집어 넣을수도 있겠지만 각 부분을 독립적인 함수로 만들어서 구조화 하는 것이 더욱 효과적이다 작은 세 부분이 하나의 큰부분보다 다루기 편리한데 이는 프로그래머가 알 필요가 없는 자잘한 연산들을 함수 안으로 감출수 있으므로 불필요한 상호관계를 최소화 할수 있기 때문이다. 행이 있는 동안은 제 1장에서 getline 함수를 사용하면 되고 출력한다는 printf 함수에 해당한다 이함수들은 이미 만들어져 있어서 우리는 그것들을 사용하기만 하면 된다.

문자열 s안에 문자열 t 가 시작 하는 위치에 인덱스를 나타내고 문자열 t가 포함되어 있지 않으면 -1 을 나타내는 함수 strindex(s,t)를 사용해도 같은 결과를 얻을 수 있을 것이다. C언어에서의 배열은 0의 위치에서 시작하기 때문에 s안에서 시작점을 0 또는 양수로나타내며 -1과 같은 음수는 에러를 나타내는데 사용된다. 후에 좀더 세련된 프로그램으로 고칠 경우에도 strindex 함수만 바꾸고 나머지 부분은 그냥 두어도 된다(strst 함수는 인덱스 대신에 포인터를 리턴시킨다는 점만 제외하고 strindex 함수와 동일하다).

이런 여러가지 구상을 한 후에 프로그램의 자세한 부분을 작성하는 것은 어려운일이 아니다 여기서는 문자열 안에 있는 어떤 패턴을 찾는 프로그램을 제시했는데 많이 사용되는 방법은 아니다 제5장에서 또다른 방법으로 동일한 효과를 나타내는 프로그램을 소개하겠다.

    

#include <stdio.h>

#define MAXLINE 1000 /* maximum input line length */


int my_getline(char s[],int max);

int strindex(char source[], char searchfor[]);


char patten[] = "ould"; /* pattern to search for */


/* find all lines matching pattern */


int main(void)

{

    char line[MAXLINE];

    int found;

    

    while (my_getline(line, MAXLINE)>0)

        if(strindex(line, patten)>=0){

            printf("%s",line);

            found++;

        }

    return found;

}


/* getline : get line into s, return length */

int my_getline(char s[],int lim)

{

    int c = 0,i;

    

    i=0;

    while (--lim > 0 && (c=getchar())!= EOF && c != '\n')

        s[i++] = c;

        

    if (c=='\n')

        s[i++] = c;

        

    s[i] = '\0';


    return i;

}


/* strindex: return index of t in s, -1 if none */

int strindex(char s[],char t[])

{

    int i,j,k;

    

    for (i=0; s[i] != '\0'; i++) {

        for (j=i,k=0; t[k] != '\0' && s[j] == t[k]; j++,k++)

            ;

            if (k>0 && t[k] == '\0')

                return  i;

    }

    return -1;

}


각 함수의 형태는 다음과 같다


리턴형 함수 이름(매개변수 선언)

{

선언문과 다른 문장들

}


위에서 여러부분이 생략될수도 있다. 가장 간단한 함수는 다음과 같다.


dummy() {}


위와 같은 함수의 기능은 아무일도 한지 않는 것이다. 위와같이 아무 일도 하지 않는 함수는 프로그램 개발 중 어떤 부분을 표시하는데 유용하게 사용된다. 만일 리턴되는 변수형이 정의되지 않으면 그 변수는 정수형으로 여긴다.

프로그램은 개별적인 함수의 집합이다. 함수 사이의 연락은 매개변수와 함수에서 리턴시키는 값으로 이루어진다. 이는 외부변수를 통해서도 가능하다. 한 프로그램에서 여러개의 함수들이 있을때 이 함수들은 소스파일 하나에 다 있어도 되고 여러개의 소스파일에 나누어 있어도 돈다. 소스파일 내에서 함수의 순서는 바꾸어도 관계 없지만 하나의 함수가 여러개의 파일에 나뉘어 있는 것은 안된다.

return문은 호출된 함수로서 계산된 값을 호출한 함수로 넘겨주는데 사용되며 return 뒤에는 어떤 수식이나 다 쓰일수 있다.


return 수식;


수식이 필요하다면 함수에서 지정된 type으로 변환 될 수도 있다. 수식은 괄호로 묶일수도 있다. 호출하는 함수는 원한다면 보내온 값을 무시할수도 있다 또한 return 뒤에 수식이 오지 않아도 된다 그럴 경우에는 호출한 함수로 아무 값도 넘어오지 않는다 . 즉 함수의 끝인 오른쪽 중괄호까지 실행되고 아무런 값도 가지지 않고 호출한 함수로 넘어가는데 리턴 값에 어떤 수가 들어 있게 될지는 알수 없다


예제 4-1 s내에거 t의 가장 오른쪽 위치를 나타내는 함수 strindex(s,t)를 작성해 보라 만일 t가 없다면 -1을 리턴 시키도록 작성하라.