C Study 0007

C언어 공부 0007

배열

배열이란

  • 동일한 자료형의 데이터가 여러 개 저장되어 있는 데이터 저장 장소
  • 즉, 하나의 이름으로 제어할 수 있으므로 조작이 편리하다.
  • 크기 n개의 배열은 자료형 배열이름[n];를 이용해 선언하고, 아래와 같이 나타낼 수 있다.
배열이름[0] 배열이름[1] 배열이름[2] ... ... ... 배열이름[n-1]
  • 각각의 데이터들은 정수로 되어 있는 번호(인덱스)에 의하여 접근 및 조작
    • 인덱스는 항상 0부터 시작
    • 예를 들어 3번째 칸에 있는 원소에 접근하려면 배열이름[2]와 같이 사용
  • 인덱스가 배열의 크기를 벗어나게 되면 오류가 발생한다.
  • 배열의 크기를 알고싶다면, sizeof(배열이름) / sizeof(배열이름[0])를 이용하여 구할 수 있다.
    • sizeof함수는 어떤 변수나 자료형, 값이 차지하는 메모리 공간 크기를 알려주고, 이를 이용해 배열 전체의 차지공간 / 배열 원소 하나의 차지공간 을 이용하면 구하는 것이 가능하다.

배열의 필요성

  • 개별적인 변수 사용보다 하나의 변수에 다수의 값을 저장하고 싶은 경우
  • 여러 값들을 정렬, 탐색 등의 다량의 데이터 속에서 특정 데이터의 접근이 필요한 경우
  • 통계 계산 등의 수학적 작업이 필요한 경우

다양한 배열의 초기화 방법들

  • int grade[5] = {1, 2, 3, 4, 5}; : 5칸의 배열을 선언하고, 5칸 각각의 값을 저장한다.
  • int grade[5] = {1, 2, 3}; : 5칸의 배열을 선언했지만, 앞의 3칸에만 값을 저장한다. 이 경우, 남은 2칸의 값은 자동으로 0으로 저장된다.
  • int grade[] = {1, 2, 3, 4, 5}; : 배열의 크기는 선언하지 않았지만, 5개의 값을 저장한다. 이 경우, 배열의 크기는 5로 지정된다.
  • 반복문을 이용한 방법 : 각각의 원소를 인덱스를 이용해 접근하여 값을 저장한다.
for(i = 0; i < 5; i++)
{
    grade[i] = k;
}

2차원 배열

  • 주로 수학에서 배열을 이용한 계산이나, 표를 그리기 위해 1차원 배열이 쌓인 형태의 2차원 배열을 만들어 이용할 수 있다.
  • 차원이 2개 이므로, 색인 또한 2개가 필요하다.
  • n * m 크기의 배열은 자료형 배열이름[n][m];를 이용해 선언하고, 아래와 같이 나타낼 수 있다.
배열이름[0][0] 배열이름[0][1] 배열이름[0][2] ... ... ... 배열이름[0][m-1]
배열이름[1][0] 배열이름[1][1] 배열이름[1][2] ... ... ... 배열이름[1][m-1]
배열이름[2][0] 배열이름[2][1] 배열이름[2][2] ... ... ... 배열이름[2][m-1]
... ... ... ... ... ... ...
... ... ... ... ... ... ...
... ... ... ... ... ... ...
배열이름[n-1][0] 배열이름[n-1][1] 배열이름[n-1][2] ... ... ... 배열이름[n-1][m-1]

다양한 2차원 배열의 초기화 방법들

  • int s[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}; : 3*4칸의 배열을 선언하고, 모든 칸 각각의 값을 저장한다.
  • int s[][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}}; : n*4칸의 배열을 선언했지만, 3*4개의 값을 저장한다. 이 경우, 배열의 크기는 3*4로 지정된다.
  • int s[][4] = {{0, 1}, {4, 5}, {8, 9}}; : n*4칸의 배열을 선언했지만, 각 행의 앞 2칸에만 값을 저장한다. 이 경우, 배열의 크기는 3*4로 지정되며, 남은 2칸의 값은 자동으로 0으로 저장된다.
  • 반복문을 이용한 방법 : 각각의 원소를 인덱스를 이용해 접근하여 값을 저장한다.
for(i = 0; i < 3; i++)
{
    for(j = 0; j < 4; j++)
    {
        s[i][j] = k;
    }
}
  • 선언시 열의 개수는 주어야 컴파일러가 배열의 크기를 알 수 있다.

n차원 배열

  • 배열은 얼마든지 차원을 늘리는것이 가능하다.

예제를 통한 배열 연습

최소값 탐색

  • 코드
#include <stdio.h>
#define SIZE 5

int main()
{
    int val[SIZE] = {20, 50, 40, 70, 30};
    int i, minVal;

    minVal = val[0];

    for(i = 1; i < SIZE; i++)
    {
        if(val[i] < minVal)
        {
            minVal = val[i];
        }
    }

    printf("Minimum value is %d.\n", minVal);

    return 0;
}
  • 출력
20

순차 탐색을 이용한 배열에서 특정 값의 위치 찾기

  • 코드
#include <stdio.h>
#define SIZE 5

int main()
{
    int list[SIZE] = {1, 2, 3, 4, 5};
    int key = 4;
    int i;

    for(i = 0; i < SIZE; i++)
    {
        if(list[i] == key)
        {
            printf("Find -- Array[%d] value is %d.\n", i, key);
            return 1;
        }
    }

    printf("Can not Find.\n");

    return 0;
}
  • 출력
Find -- Array[3] value is 4.

정렬

  • 코드
#include <stdio.h>
#define SIZE 10

int main()
{
    int list[SIZE] = {3, 2, 9, 7, 1, 4, 8, 0, 6, 5};
    int i, j, temp, least;

    for(i = 0; i < SIZE-1; i++)
    {
        least = i; // i번째 값을 최소값으로 가정
        for(j = i + 1; j < SIZE; j++) //최소값탐색
        {
            if(list[j] < list[least])
            {
                least = j;
            }
        }

        // i번째 원소와 least 위치의 원소를 교환
        temp = list[i];
        list[i] = list[least];
        list[least] = temp;
    }

    for(i = 0;i < SIZE; i++)
    {
        printf("%d ", list[i]);
    }

    printf("\n");

    return 0;
}
  • 출력
0 1 2 3 4 5 6 7 8 9

Reference

0%