배열의 개념에 대해 알아보고, 배열의 정의와 선언 형태, 배열과 기억공간의 표현에 대해 알아본다.

  • 학습 목표

    1. 배열을 선언하고 초기화.
    2. 배열의 요소를 참조.
    3. 배열과 기억공간의 표현을 이해.
    4. char형 배열을 이해.

주요 용어

  • 배열 : 동일한 자료형으 ㅣ값들이 순서적으로 하나의 이름(배열명)에 모여있는 것으로, 같은 이름을 갖는 하나 이상의 변수 리스트.
  • 1차원 배열 : 배열의 첨자가 하나만 있는 배열.
  • 2차원 배열 : 배열의 첨자가 2개인 배열.
  • 3차원 배열 : 배열의 첨자가 3개인 배열.
  • char형 배열 : 문자열을 처리하기 위해 사용되는 배열.

배열의 개념

n개의 자료를 처리하기 위해, n개의 변수를 만들고 모든 변수 이름을 기억하고 자료를 처리하기는 복잡함. ->
일관성 있고 효율적인 새료운 변수릐 필요

  • 하나의 변수 이름에 순서에 의한 번호 부여.
  • 변수명[0], 변수명[2], ...
  • 효율적인 자료 처리 가능.

배열의 정의와 형태

  • 배열의 정의.
    • 동일한 자료형을 갖는 자료들의 리스트.
    • 배열의 각 요소는 하나의 변수로 취급.
    • 배열은 배열명첨자로 구분.
  • 배열 선언 형태.
    • 1차원 배열.
    • 2차원 배열.
    • 3차원 배열.

1차원 배열

  • 배열의 첨자가 하나만 있는 배열.
  • 첨자의 개수는 배열 전체의 구성요소의 개수를 의미.
  • 배열의 각 요소는 배열명과 첨자로 구분.
    • 첨자는 0 부터 시작.
  • 배열의 각 요소는 배열명과 첨자로 구분.
    • 자료형과 기억 클래스는 갖는다.

선언

  • 형식 : 자료형 배열명 [개수]
  • 사용 예 : int a [10]
  • 의미 : 1차원 배열로서, 배열명은 a, 크기는 10, 정수 값이 기억됨.

1차원 배열의 기억 공간 표현

1차원 배열의 기억 공간 표현

1차원 배열의 초기화

배열을 선언하면 기억공간을 초기화 해야 함.

  • 초기화 방법.

    1. 배열선언 후 초기값 할당.

      •  int arr[4];  // -> 반드시 배열의 크기를 지정해야 함.
         arr[0] = 10;
         arr[1] = 20;
         arr[2] = 30;
         arr[3] = 40;
    2. 배열선언과 동시에 초기값 할당.

      •  int arr[4] = {10, 20, 30, 40};      //  -> 배열의 각 요소에 초기 값 할당.
         int arr[] = {10, 20, 30, 40};       //  -> 배열의 크기 생량 가능.
         int arr[4] = {10, 20, 30,};         //  -> arr[3] = 0으로 초기화.
         int arr[4] = {10, , 30, 40};        //  -> 에러 발생.
         int arr[4] = {10, 20, 30, 40, 50};  //  -> 에러
    3. 외부로부터 자료를 입력받아 초기화.

      •  int x[10];
         for( i = 0; i < 10; i++ ) {
           scanf("%d", &x[i]);
         }
  • 1차원 배열의 초기화 후 기억공간의 표현
    int arr[5] = {10, 20, 30, 40, 50};

1차원 배열의 초기화 후 기억공간의 표현

 

  • EX 1

    • #include <stdio.h>
      
      int main()
      {
        //  배열 선언과 초기화
        int arr1[4] = {10, 20, 30, 40};
        int arr2[] = {10, 20, 30, 40};
        int arr3[4] = {10, 20};
        int arr4[4] = {0};
        int i;
      
        printf("\narr1 ->\n\t");
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr1[i]);
        }
        printf("\narr2 ->\n\t");
      
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr2[i]);
        }
        printf("\narr3 ->\n\t");
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr3[i]);
        }
        printf("\narr4 ->\n\t");
        for (i = 0; i <= 3; i++)
        {
          printf("[%d] : %d\t", i, arr4[i]);
        }
        printf("\n");
      
        return 0;
      }
  • EX 2

    •   #include <stdio.h>
      
        int main()
        {
          //  1차원 배열 선언과 초기화
          static int x[] = {1, 2, 3, 4};
          static int y[] = {10, 20, 30, 40};
      
          int i, z[4];
      
          for (i = 0; i < 4; ++i)
            z[i] = x[i] + y[3 - i];
      
          printf("SUM OF OTHER SIDE OF EACH ARRAY\n");
      
          for (i = 0; i < 4; ++i)
            printf("%d + %d = %d\n", x[i], y[3 - i], z[i]);
      
          return 0;
        }

2차원 배열 선언

  • 형식 : 자료형 배열명[행의 수][열의 수]
  • 사용 예 : int a[3][4];
  • 의미 : 2차원 배열로, 배열 명은 a이고, 3행 4열로 됨 12개의 요소를 가진 정수형 배열.

2차원 배열의 선언과 초기화

  int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
  int arr[3][3] = {
      {1, 2, 3}
    , {4, 5, 6}
    , {7, 8, 9}
  };

2차원 배열의 기억공간 표현

 

2차원 배열의 기억공간 표현

 

2차원 배열의 사용 예

  #include <stdio.h>

  int main()
  {
    static int score[4][3] = {
        {90, 90, 90},
        {80, 80, 80},
        {70, 70, 70},
        {60, 60, 60}};
    int sum, i, j;

    printf("No\tA\tB\tC\tSUM\n");

    for (i = 0; i < 4; ++i)
    {
      sum = 0;
      printf("%3d", i + 1);

      for (j = 0; j < 3; j++)
      {
        printf("\t%3d", score[i][j]);
        sum += score[i][j];
      }
      printf("\t%3d\n", sum);
    }

    return 0;
  }

3차원 배열의 선언

  • 형식 : 자료형 배열명 [면의 수] [행의 수] [열의 수];
  • 사용 예 : int a[2][3][4];
  • 의미 : 3차원 배열로서, 배열 명은 a이고, 2면 3행 4열로 된,
    24개 요소를 가진 정수형 배열.

3차원 배열의 초기화와 기억공간 표현

 

3차원 배열의 초기화와 기억공간 표현


char형 배열

  • 형식 : char 배열명[문자열 길이 + 1]
  • 사용 예 : char str[12]
  • 의미 : 배열명 str, 12문자 길이를 가진 char 형 배열.

char형 배열선언과 초기화

  char name[] = "JEAHA OH"; // 문자열 단위로 초기화
  char addr[] = {'S', 'E', 'O', 'U', 'L', '\0'}; // 문자 단위로 초기화. '\0'을 삽입 해야 함.

char형 배열 사용 예

  #include <stdio.h>

  int main()
  {
    char name[] = "JEAHA OH";
    char addr1[6] = {'S', 'E', 'O', 'U', 'L', '\0'}; // 마지막 요소 \0 삽입
    char addr2[6] = {'S', 'E', 'O', 'U', 'L'};       //  마지막 요소 \0을 삽입하지 않을 경우 쓰레기 값이 붙을 수 있음.

    printf("\n name : %s", name);
    printf("\n addr1 : %s", addr1);
    printf("\n addr2 : %s", addr2);
    return 0;
  }
  #include <stdio.h>

  int main()
  {
    char string[50];
    int i = 0;

    printf("\t INSERT SOMETHING STRING >> ");
    scanf("%s", string);

    printf("RECEIVED STRING : %s\n", string);
    printf("PRINT AS CHARACTER : ");

    while (string[i] != '\0')
    {
      printf("%c", string[i]);
      i++;
    }
    printf("\n");
    return 0;
  }

함수와 배열

  • 배열을 함수의 매개변수로 사용할 경우
    • 함수 호출 시 배열명만 명시하여 호출.
    •   int score[2][5] = {{1, 2, 3, 4, 5}, {1, 1, 1, 1, 1}};
        score_sum( score, 2, 5);
  • 함수의 헤더에는
    • 1차원 배열의 경우 크기 생략 가능
    • 다차원 배열의 경우 가장 높은 차원의 크기 생략 가능.
  #include <stdio.h>

  void score_sum(int gr[][5], int, int);

  int main()
  {
    int score[2][5] = {
        {10, 20, 30, 40, 50},
        {10, 10, 10, 10, 10}};

    score_sum(score, 2, 5);

    return 0;
  }

  void score_sum(int gr[][5], int row, int column)
  {
    int sum[2] = {0};
    int i, j;

    for (i = 0; i < row; i++)
    {
      for (j = 0; j < column; j++)
      {
        sum[i] += gr[i][j];
        printf("SUM[%d] = %d\n", i, sum[i]);
      }
    }

    printf("\n");
  }

728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 배열과 포인터 - 3  (0) 2020.12.27
[C] 배열과 포인터 - 2  (0) 2020.12.27
[C] 함수와 기억 클래스 - 2  (0) 2020.12.25
[C] 함수와 기억 클래스 - 1  (0) 2020.12.20
[C] 선택 제어문과 반복 제어문  (0) 2020.12.20

함수와 기억 클래스 - 2

함수의 호출방법, 호출 함수와 피 호출함수사이의 자료전달방법, 변수의 유효범위아 기억클래스의 개념.

  • 학습 목표

    1. 값에 의한 자료 전달 방법과 참조에 의한 자료전달방법의 차이 이해.
    2. 지역 변수와 전역변수의 이해.
    3. 기억클래스의 의해.

주요 용어

  • 기억 클래스 : 변수를 기억공간의 특정 영역에 할당하는 방법.
  • 지역 변수 : 특정 범위 내에서만 사용되는 변수.
  • 전역 변수 : 프로그램 전체에 걸쳐 사용될 수 있는 변수.
  • 자동 변수 : 함수 실행 시 만들어 지고 실행이 끝나면 기억공간이 제거되는 유형.
  • 정적 변수 : 프로그램이 끝날 때까지 기억영역이 유지되는 유형.
  • 외부 변수 : 함수외부에서 선언되어 프로그램이 끝날 때가지 기억영역이 유지되는 유형.
  • 레지스터 변수 : CPU내의 레지스터에 자료를 저장하고자 할 때 사용되는 유형.

매개변수 사이의 자료 전달

Call By Value - 값에 의한 자료 전달

  • 기본적인 자료전달 방법.

  • 실 매개변수와 형식 매개변수 사이에 값의 전달.

  • 호출한 함수의 실행이 끝난 다음 전달받은 값을 되돌려 받지 못함.

  • 구조

    •   func1(10, 20); // 함수호출(실 매개변수)
        ...
        int func(int x, int y) // 함수 정의 (형식 매개변수)
  • EX

    •   #include <stdio.h>
      
        void swap(int x, int y);
      
        int main()
        {
          int a = 3, b = 5;
      
          printf(":: Before Call a = %d, b = %d\n", a, b); //  ::  a = 3, b = 5
      
          swap(a, b);
      
          printf(":: After Call a = %d, b = %d\n", a, b);  //  :: a = 3, b = 5
          return 0;
        }
      
        void swap(int x, int y)
        {
          x ^= y;
          y ^= x;
          x ^= y;
          printf(">> Inside swap x = %d, y = %d\n", x, y); //  >> x = 5, y = 3
        }
  • 값에 의한 자료 전달 과정


Call By Reference - 참조에 의한 자료 전달

  • 호출함수와 피 호출함수의 매개변수 값을 서로 교환할 수 있는 자료전달 방법.

  • 값을 전달하는 것이 아니라 실 매개 변수의 값이 들어있는 주소 값이 전달됨.

  • 구조

    •   func1(&a, &b); // 함수호출 (실 매개변수)
        ...
        int func1( int * x, int * y) // 함수 정의 (형식 매개변수)

& : 주소 연산자.

호출 하는 곳에서는 &를 붙여서 주소를 전달하는 것을 명시적으로 표현.

* : 내용 연산자. (*가 붙은 변수를 포인터 변수라고 한다.)

호출 당하는 곳에서는 *를 붙여서 주소가 가르티는 내용을 사용함을 명시적으로 표현한다.

  • EX

    • 참조에 의한 자료 전달방법은 피호출 함수 내에서 값의 변화가 일어나면 실 매개변수의 값도 변화됨.

    •   #include <stdio.h>
      
        void swap(int *x, int *y);
      
        int main()
        {
          int a = 3, b = 5;
      
          printf(":: Before Call a = %d, b = %d\n", a, b); //  :: a = 3, b = 5
      
          swap(&a, &b);
      
          printf(":: After Call a = %d, b = %d\n", a, b); //  :: a = 5, b = 3
          return 0;
        }
      
        void swap(int *x, int *y)
        {
          *x ^= *y;
          *y ^= *x;
          *x ^= *y;
          printf(">> 4. Inside swap x = %d, y = %d\n", *x, *y); //  >> a = 5, b = 3
        }
  • 참조에 의한 자료 전달 과정


기억 클래스 (Storage class)

  • 변수를 기억공간의 특정영역에 할당하는 방법.
  • 즉, 각 변수의 유효범위와 존속기간을 설정.
    • 변수의 사용 위치에 따라.
      • 지역 변수.
      • 전역 변수.
    • 변수의 존속기간에 따라
      • 자동 변수.
      • 정적 변수.
      • 외부 변수.
      • 레지스터 변수.

지역변수와 전역변수

지역 변수 (local variable)

  • 특정 범위 내에서만 통용되는 변수.

  • 선언된 블록이나 함수 내에서만 사용 가능.

  • 함수에서 사용되는 매개변수에도 해당.

  • 지역변수 사용 예

    •   #include <stdio.h>
      
        void func();
      
        int main()
        {
          //  main()) 내부에 선언되어 main()에서만 사용가능한 지역변수
          int i = 10;
      
          printf("\n main i : %d", i);
      
          func();
      
          printf("\n main i : %d\n", i);
      
          return 0;
        }
      
        void func()
        {
          //  main()의 i와는 별개인 지역변수.
          int i;
      
          i = 20;
          printf("\n func i : %d", i);
        }
    •   #include <stdio.h>
      
        int main()
        {
          // BLOCK A
          int x = 2, y = 4;
      
          printf("A >> x : %d, y : %d\n", x, y);
      
          {
            //  BLOCK B
            int x;
            x = 5;
            y++;
            printf("B >> x : %d, y :%d\n", x, y);
          }
          printf("A >> x : %d, y :%d\n", x, y);
        }

전역 변수 (global variable)

  • 함수 밖이나 외부 파일에서 선언되어 프로그램 전체에 걸쳐 사용될 수 있는 변수
  int x, y; //  변수 x, y는 **프로그램 전체에서 사용가능한 전역변수**(함수 외부에서 선언됨)

  long func1 (int m, int n) {
    x++, y--;
    m++, n--;
    //  변수 m, n은 func1 내에서만 사용 가능한 **지역변수**.
  }

  void func2 () {
    int m, n;
    //  func2()의 **지역변수**.
  }

  void main(){
    int m, n;
    // main()에서만 사용 가능한 **지역변수**.
    long x;

    x = func1( 10, 20 );
    func2()
  }
  • EX

    •   #include <stdio.h>
      
        void func();
        int x;
        //  **전역변수**, 가급적 프로그램의 선두에 위치하는 것이 좋음.
        //  전역변수는 초기화 안 하면 **0으로 자동 초기화**.
      
        int main()
        {
      
          printf(" 1 ) x : %d\n", x);
      
          func();
      
          printf(" 2 ) x : %d\n", x);
      
          return 0;
        }
      
        void func()
        {
          //  전역 변수이기 때문에 어디서나 사용 가능.
          x++;
        }

전역 변수와 지역변수의 비교

  • 동일 범위 내에서는 지역변수가 우선.
  • 전역변수의 선언은 프로그램 선두에 위치.
  • 가급적 지역변수를 사용하는 것이 효율적.
    • 함수의 독립성 향상.
    • 디버깅 효율 향상.
    • 기억공간 절약.

변수의 기억 클래스 종류

  • 변수의 초기화, 존속기간, 유효범위에 따라 구별.
    • 자동 (auto)
    • 정적 (static)
    • 외부 (extern)
    • 레지스터 (register)

기억 클래스를 이용한 변수 선언

  • 형식 : 기억클래스 자료형 변수명;
  • 기능 :
    • 기존의 변수 선언문에 기억클래스만 기입.
    • 선언된 변수에 저장도니 자료는 해당 기억영역에 놓이게 됨.
  • 사용 예
    • auto int a;
    • static int b;
    • extern int c;
    • register int c;

자동변수

  • 함수 실행시 만들어지고, 실행이 끝나면 기억공간이 제거됨.
  • 예약어 auto를 사용 (생략 가능)
  • 통용 범위는 변수가 선언된 블록이나 함수 내로 한정.
  • 지역변수에 해당.
  • 초기화 필요.
  #include <stdio.h>

  int main()
  {
    int i = 1;
    auto int j = 2;
    { //  BLOCK A
      int i = 3;
      { //  BLOCK B
        int i = 4;

        printf("i in BLOCK B : %d\n", i);
        printf("j in BLOCK B : %d\n", j);
      }
      printf("i in BLOCK A : %d\n", i);
    }
    printf("i in BLOCK MAIN() : %d\n", i);

    return 0;
  }

정적변수

  • 기억 영역이 프로그램 끝날 때까지 유지.
  • 예약어 static 사용.
  • 전역 변수에 해당.
  • 변수의 값은 프로그램 실행 중 계속 유지.
  • 초기화가 없으면 0 으로 초기화 됨.
  #include <stdio.h>

  int main()
  {
    //  자동 변수 선언
    int a = 10;
    //  정적 변수 선언
    static int b = 20;

    {
      int a = 5;
      printf("a : %d b : %d\n", a, b);
      // a는 자동 변수이므로 블럭 안에서만 효력이 발생함.
    }
    printf("a : %d b : %d\n", a, b);

    return 0;
  }
  #include <stdio.h>

  void test();

  int main()
  {
    int i = 0;

    while (i < 3)
    {
      test();
      i++;
    }

    return 0;
  }

  void test()
  {
    auto int a = 0;
    static int s = 0;

    printf("auto : %d, statc : %d\n", a, s);

    ++a, ++s;
  }
  /**
   * auto : 0, statc : 0
   * auto : 0, statc : 1
   * auto : 0, statc : 2
   * 자동변수는 호출 될 때 마다 값이 초기화 되지만,
   * 함수 내에서 사용된
   * **정적 변수는 함수를 빠져 나가더라고 그 값을 유지**
   * (한번만 초기화 됨)
   */

외부 변수

  • 함수의 외부에서 선언.
  • extern 예약어 사용.
  • 전역 변수에 해당.
  • 초기화가 없으면 0으로 초기화 됨.
  • 다른 파일에서 외부변수로 선언된 변수의 값을 참조할 수 있음.
  #include <stdio.h>

  int i = 10, j = 20;

  void main()
  {
    //  외부 변수 선언
    //  (**생략 가능**, 변수 i가 선언되면, 선언된 위치 이하부터 그 갑ㅆ이 유효하기 때문.)
    extern int i;
    //  외부 변수 선언
    //  (**생략 불가**, 변수 k가 범위 바깥에 있으므로 )
    extern int k;

    //  변수 j = 20, j = 100이 동시 선언시, **지역변수(자동변수)가 우선**
    int j = 100;

    printf("i : %d, j : %d, k : %d\n", i, j, k);
    //  i : 10, j : 100, k : 50
  }

  int k = 50;
  #include <stdio.h>
  #pragma warning(disable : 4996)

  //  extern_ex() 함수 원형 선언.
  void extern_ex();
  //  전역변수 s 선언.
  char s[100];

  int main()
  {
    printf("INSERT STRINGS : ");
    scanf("%s", s);

    printf("String (%s) WILL STORE GLOBAL VARIABLE S.\n", s);
    extern_ex(); // extern_ex() 호출

    return 0;
  }
  #include <stdio.h>

  extern char s[]; // 변수 s를 외부 변수로 선언

  void extern_ex()
  {
    //  외부 변수 s 출력.
    printf("EXTERNAL VARIABLE S IS \n%s\n", s);
  }

레지스터 변수

  • CPU 내의 레지스터에 자료를 저장하고자 할 때.
  • 예약어 register를 사용.
  • 자동 변수와 동일한 속성.
  • 프로그램의 실행속도 증가를 목적으로 사용.
    (주로 반복문에서 카운터 변수로 사용)
728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 배열과 포인터 - 2  (0) 2020.12.27
[C] 배열과 포인터 - 1  (0) 2020.12.25
[C] 함수와 기억 클래스 - 1  (0) 2020.12.20
[C] 선택 제어문과 반복 제어문  (0) 2020.12.20
[C] 입출력 함수와 연산자 - 2  (0) 2020.12.20

함수와 기억 클래스 - 1

C 언어에서 함수의 개념, 표준함수와 사용자 정의 함수, 함수의 선언, 정의, 호출 방법.

  • 학습 목표

    1. 함수의 개념과 중요성 이해.
    2. 표준함수와 사용자 정의함수 이해.
    3. 함수의 선언, 정의, 호출 방법 이해.
    4. 표준함수에 대한 헤더파일 사용.

프로그램 언어의 제어 구조

  • 함수 : 특정한 작업(기능)을 수행하도록 설계된 독립적인 프로그램.
  • 표준 함수 : C 언어에서 자체적으로 제공하는 함수.
  • 사용자 정의함수 : 사용자가 정의하여 사용하는 함수.
  • 함수 원형 : 함수를 프로그램에서 사용하기 위한 함수의 양식.
  • 함수 호출 : 사용할 함수를 부르는 것.
  • 매개변수 : 호출하는 함수와 호출 당하는 함수에 쓰이는 변수.

함수의 개념

특정한 작업(기능)을 수행하도록 설계된 독립적인 프로그램.
정해진 순서에 따라 실행 됨으로 프로그램의 기능을 수행 함.

C 프로그램은 함수들로 구성

  • 전체의 실행 내용을 몇 개의 모듈(module)로 분류.
  • 각각의 모듈에 해당하는 내용을 함수로 작성.
  • 실행 순서에 따라 그 함수들을 차례로 호출하여 실행.

함수의 특성

  • 함수들은 서로를 자유롭게 호출 가능.
  • 모든 함수는 서로 독립적.

함수의 장점

  • 프로그램의 수정이 쉽다.
  • 함수의 재사용으로 코드 중복을 최소화 함.
  • 프로그램 기능을 한 눈에 파악할 수 있게 함으로 유지보수가 쉬움.

단위 프로그램을 하나의 함수에 기술 한 경우

  void main() {
    // 성적 입력 코드
    ...
    // 성적 수정 코드
    ...
    // 성적 처리 코드
    ...
    // 성적 출력 코드
    ...
  }
  • 함수의 길이가 커짐.
  • 프로그램 가독성이 낮음.
  • 수정의 어려움이 있음.
  • 일부분만 재호출 불가능.

표준 함수

C 언어에서의 함수

  • 표준함수 : C 언어 자체에서 제공하는 함수.
  • 사용자 정의함수 : 사용자가 정의하여 사용하는 함수.

표준 함수

  • 표준함수의 원형은 헤더파일(*.h)에 정의.
  • 표준함수의 실체는 라이브러리 파일에 수록.
  • 표준함수를 사용하려면 원형이 선언되어 있는 헤더파일을 #include 해줘야 함.

표준 함수의 원형 예

  • prntf(), scanf() 의 원형.
    •   int printf(const char * format, ...);
        int scanf(const char * format, ...);
    • stdio.h(standard input output의 약자)헤더파일에 정의 되어 있음.
    • 표준 함수를 사용하려면 #include <stdio.h>를 꼭 해야 함.
  • sin(), cos() 의 원형.
    •   double sin(double x);
        double cos(double x);
    • math.h 헤더파일에 정의되어 있음.
    • 표준함수를 사용하려면 #include <math.h>

C 언어 표준 함수의 대표적인 예

헤더 파일 선언된 함수 EX
stdio.h 입출력함수 printf(), scanf(), getchar(), putchar(), ...
stdio.h 파일 관련 함수 fopen(), fclose(), fprintf(), ...
conio.h 콘솔 입출력 함수 putch(), cputs(), cprintf()(), getch(), chetche(), cscanf(), ...
string.h 문자열 처리 함수 strcat(), strcmp(), strcpy(), strlen(), strncat(), strncpy(), ...
math.h 수학 함수 sqrt(), sin(), cos(), tan(), log(), exp(), pow(), abs(), asin(), acos(), atan(), cosh(), ...
ctype.h 문자 형태 판별 함수 isalpha(), isdigit(), islower(), ...
ctype.h 문자 변환 함수 tolower(), toupper()
stdlib.h 수치변환 함수 atoi(), itoa()
stdlib.h 난수 관련 함수 rand(), srand()
stdlib.h 정렬/검색 함수 qsort(), lfind()

표준함수 사용의 예

  •   #include <stdio.h> //  입출력 함수를 처리하기 위한 헤더파일 (standard input output)
      #include <math.h>  //  수학 함수를 처리하기 위한 헤더파일
      #include <stdlib.h>
    
      int main()
      {
        int a, b, c;
        int i = -5, j = 2;
        double x = 12.34;
    
        printf("abs( -5 ) = %d\n", abs(i)); //  x의 절댓값.
    
        a = ceil(x);
        printf("ceil( 12, 34 ) = %d\n", a); //  x 이상의 최소 정숫값.
    
        printf("cos( 10 ) = %f\n", cos(10));
    
        printf("exp( 2 ) = %.f\n", exp(j)); //  x의 지숫값
    
        b = floor(x);
        printf("floor( 12.34 ) = %d\n", b); //  x 미민의
    
        printf("sqrt( 2 ) = %5f\n", sqrt(j));
    
        c = pow(4, j);
        printf("pow( 4, 2) = %d\n", c); //  pow(x, y) : x의 y제곱 값.
    
        return 0;
      }
  •     #include <stdio.h>
        #include <string.h> //  문자열 처리 함수를 위한 헤더파일
        #include <ctype.h>  //  문자형태 판별 함수(isalphat, isdigit)을 위한 헤더
    
        int main()
        {
          int i, alp = 0, no = 0, et = 0;
          char s[20];
    
          printf("\n STRING : ");
          scanf("%s", s);
    
          for (i = 0; i < strlen(s); i++)
          {
            if (isalpha(s[i]))
              alp++;
            else if (isdigit(s[i]))
              no++;
            else
              et++;
          }
    
          printf("alphabe = %d\n", alp);
          printf("number = %d\n", no);
          printf("etc = %d\n", et);
          printf("totoal = %d\n", strlen(s));
    
          return 0;
        }

사용자 정의 함수

사용자가 단위 프로그램을 함수로 정의하여 사용.

  • C 프로그램에서의 함수

    • main()함수 안에 표준 함수를 사용하는 형태
    • 동일 블럭 내의 프로그램 길이가 길어지면, 전체 프로그램은 복잡해 지고 이해하기가 어려워짐.
    • 전체 프로그램을 짧은 단위 프로그램으로 나누어 정의함으로 프로그램의 작성과 이해를 쉽게 할 필요가 있음.
  • 사용자 정의 함수의 예

    •   #include <stdio.h>
      
        int sum(int a, int b);
      
        int main()
        {
      
          int x, y, c;
      
          printf("\nx : ");
          scanf("%d", &x);
      
          printf("y : ");
          scanf("%d", &y);
      
          c = sum(x, y);
      
          printf("\nSUM : %d\n", c);
      
          return 0;
        }
      
        int sum(int a, int b) //  사용자 정의함수
        {
          return a + b;
        }

함수 정의의 구조

  •   반환_자료형 함수명( 자료형 매개변수1, 자료형 매개변수2, ...)  // 함수 헤더
      { // 함수 시작
        // 함수 몸체
      } // 함수 끝
  •   int sum(int a, int b)
      {
        return a + b;
      }

함수 헤더.

  • 반환 자료형.
    • 함수의 결과 값을 호출한 함수에 되돌려 줄 때의 자료형.
    • 사용될 수 있는 자료형은 C 언어에서 사용 가능한 모든 자료형.
    • 생략 가능하며, 생략할 경우 자료형은 int로 간주.
    • 반환 값이 없는 함수인 경우 void 형으로 선언(생략시 int로 처리).
  • 함수명
    • 변수명을 정하는 규칙과 동일한 방식으로 함수명을 정함.
    • 의미 있는 함수명을 정하는 것이 함수를 이해하는 데 도움을 줌.
  • 자료형과 매개변수
    • 자료형은 매개변수의 자료형을 나타냄.
    • 매개변수는 호출 함수와 피호출 함수 사이에 자료를 주고받기 위헤 사용.
    • 매개변수는 해당 함수 내에서 변수처럼 사용.
    • 매개변수가 여러 개일 경우에는 콤마(,)로 구분.
    • 매개변수가 없으면 void 형으로 사용.

함수 몸체

  • 함수가 하는 일을 정의하는 부분.
  • 중괄호 {}를 이용하여 함수의 시작과 끝을 나타냄.
  • C언어의 기본 구조와 동일.

함수의 사용

  • 함수를 사용하기 위해서는 함수의 원형 선언, 함수의 호출, 함수의 정의로 구성.

함수의 원형 선언

  • 함수는 변수와 같이 사용되기 전에 미리 선언.

  • 함수의 원형 선언은 일반적으로 main() 이전에 함.

    • 컴파일 시, main()을 먼저 컴파일 하기 때문에, main()에서 사용할 함수를 미리 선언해 줘야 함.
  • 원형선언은 함수정의 부분의 헤더부분에 세미콜론(;)만 추가 하면 됨.

    • 함수 원형선언은 함수와 관련된 3가지 성질을 선언.
      • 함수의 반환형.
      • 배개변수의 개수.
      • 배개변수의 자료형.
  • 피호출 함수가 main() 뒤에 선언된 경우 함수의 원형선언이 필요.

    •   #include <stdio.h>
      
        int sum(int a, int b);
      
        int main()
        {
          printf("sum = %d\n", sum(10, 20));
      
          return 0;
        }
      
        int sum(int a, int b)
        {
          return (a + b);
        }
  • 피 호출 함수가 main() 앞에 선언된 경우 원형선언 필요 X.

    •   #include <stdio.h>
      
        int sum(int a, int b)
        {
          return (a + b);
        }
      
        int main()
        {
          printf("sum = %d\n", sum(10, 20));
      
          return 0;
        }

함수의 호출

  • 함수는 일종의 부 프로그램.
  • 함수의 호출이 있어야 함.
  • 함수 호출의 방법.
    • 함수명과 매개변수의 열거.
  • 함수 호출과 프로그램 실행순서.
    • main() 시작.
    • ()를 만나면 함수의 호출이 발생.
    • 해당 함수 시작.
    • 해당 함수 수행 결과 반환.
    • main()의 남은 부분 수행

매개변수

  • 실 매개변수
    • 함수를 호출하는 함수(호출함수)에 쓰이는 매개변수.
  • 형식 매개변수
    • 호출 당하는 함수(피 호출함수)에 쓰이는 매개변수.
  • 실 매개변수와 형식 매개변수 사이에는 자료형과 변수의 개수가 일치해야 함.
  • 자료형이 일치하지 않을 경우 형 변환 발생.
  • 변수의 개수가 일치하지 않을 경우 컴파일 에러 발생.
    •   void main() {
          fnc1( a, b, c ); // 호출함수로서 a, b, c는 실 매개변수
        }
        void fnc1(int x, float y, double z) {
          // 피 호출 함수로서 x, y, z는 형식매개변수
        }

결과값 반환 return

  • 기능 :

    • 함수를 끝내고 제어와 함수 수행 결과를 호출 함수로 넘김.
  • 형식 :

    • return (수식);
    • return 수식;
  • 사용 예

    •   return 0; -> 상수 0 반환. (정상적인 종료 의미.)
        return 1; -> 상수 1 반환.
        return x; -> x 값 반환.
        return (x + y * z); -> 수식의 결과 값 반환.
        return ( sum( 10, 20 ) ); -> 다른 함수 호출.
  •   #include <stdio.h>
    
      int max(int x, int y);
      int min(int x, int y);
    
      int main()
      {
    
        int i = 10, j = 20;
    
        printf("max( %d, %d ) => %d\n", i, j, max(i, j));
        printf("min( %d, %d ) => %d\n", i, j, min(i, j));
    
        return 0;
      }
    
      int max(int x, int y)
      {
        return (x > y ? x : y);
      }
    
      int min(int x, int y)
      {
        if (x > y)
          return y;
        else
          return x;
      }

함수의 여러 가지 사용 예

  #include <stdio.h>

  //  함수 원형 선언.
  int sum(int, int);
  void test();

  //  main.
  int main()
  {
    int s;

    //  단순 호출.
    test();
    sum(10, 20);

    // 함수 결과를 변수에 반환.
    s = sum(30, 40);

    printf("sum from 30 to 40 = %d\n", s);
    // 호출 결과를 직접 사용.
    printf("sum from 100 to 200 = %d\n", sum(100, 200));

    return 0;
  }

  void test()
  {
    printf("FUNCTION EXAMPLE\n");
  }

  int sum(int a, int b)
  {
    int i, s = 0;
    for (i = a; i <= b; i++)
      s = s + i;

    return s;
  }
728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 배열과 포인터 - 1  (0) 2020.12.25
[C] 함수와 기억 클래스 - 2  (0) 2020.12.25
[C] 선택 제어문과 반복 제어문  (0) 2020.12.20
[C] 입출력 함수와 연산자 - 2  (0) 2020.12.20
[C] 입출력 함수와 연산자 - 1  (0) 2020.12.15

+ Recent posts