본문으로 바로가기

[C] 배열 보고서

category Layer 7/assignment 2019. 3. 30. 22:19

[1] 배열은 뭘까?

 

배열은 같은 자료형을 가진 여러개의 변수를 한번에 선언한 연속된 메모리 공간으로 이루어진 자료구조이다.

예를들어, 시험 결과 10개를 선언해야한다고 해보자.

 

int num = 100 ;

int num2 = 70 ;

:

:

int name10 = 95 ;

 

라고 선언할 것이다.

 

하지만 배열을 이용한다면 10개의 변수를 쉽게 한번에 선언할 수 있다.

 

 

 

 

 

 

[2] 배열의 선언 방법과 인덱스

 

(예제 1)

#include <stdio.h>

int main(void)

    int num[10] = { 100, 70, 50, 60, 80, 70, 95, 90, 85, 90 } ;   

    printf("%d ", num[0]);

    printf("%d ", num[7]);

    printf("%d ", num[9]);

    printf("%d ", num[10]);

 

    return 0;

}

 

(예제 1의 결과)

100 90 90 6422300 

 

 

이렇게 배열을 선언하면 int 자료형의 변수가 10개가 선언되고, 선언된 변수에 각각의 값을 할당해준다.

배열은 다음과 같이 선언한다. 위의 (예제 1)에서는 배열의 선언과 초기화를 동시에 하였지만. 배열을 선언하고 나서 나중에 값을 넣어줘도 상관없다.

 

( 자료형 )  ( 배열의 이름[ 배열의 크기 ] )  =  ( { 들어갈 원소들 } )

               (여기서 배열의 이름은 배열의 시작주소와 같다.)

 

다음과 같은 방법으로 배열을 선언하며, [ ] 안에 들어가는 숫자들을 " 인덱스 " 라고 한다.

여기서 주의해야할 점이 있는데, 배열의 인덱스는 반드시 0부터 시작한다.

배열의 크기가 10이면, 인덱스는 0부터 9까지다.

위의 예제1의 결과에서, num[10]을 출력하게 했는데, 쓰레기 값이 나온것을 알 수있다.

num[9]를 출력하면 90이 나오는것 또한 볼수있다.

이는 배열의 인덱스는 0부터라는것을 보여주는 것이다.

또한 배열을 선언할때 배열의 크기를 적지않는 경우도 있는데, 이럴때는 뒤에 원소의 갯수에 따라서 자동으로 크기를 결정해준다.

 

 

 

 

 

 

[3] 배열의 초기화 방법

 

(예제 2)

#include <stdio.h>

int main(void)

    int num[10] = { 0, } ;   // int num[10] = { }와 같음

    printf("%d ", num[0]);

    printf("%d ", num[7]);

    printf("%d ", num[9]);

    printf("%d ", num[10]);

 

    return 0;

}

 

(예제 2의 결과)

0 0 0 6422300

 

위의 (예제 2) 는 배열의 모든 원소를 0으로 초기화시키는 예제이다. 0번째 ~ 9번째 인덱스까지의 값이 모두 0으로 초기화 되었고, 10번째인덱스는 존재하지 않으므로 쓰레기값이 출력되는 모습이다.

 

(예제 3)

#include <stdio.h>
int main(void)
{
    int num[10] = { 100, } ;

    printf("%d ",num[0]);
    printf("%d ",num[7]);
    printf("%d ",num[9]);
    printf("%d ",num[10]);

 

    return 0;
}

 

(예제 3의 결과)

100 0 0 6422300 

 

위의 (예제 3)의 결과에서 배열의 첫번째 원소는 100으로 초기화 되었지만, 뒤의 원소는 0으로 초기화 된 것을 볼 수있다. 이는 첫번째 원소의 초기화 값이, 뒤의 값 배열의 초기화에 영향을 주지 않는다는것을 볼수있고, 초기화되지 않은 배열은 모두 0으로 초기화 된다는 것을 알수있다.

 

 

(그림 1) 배열의 초기화를 나타낸 그림이다.

다음의 그림이 배열의 성질을 잘 보여준다. ( 연속된 메모리 공간, 배열 초기화에서 초기화 안된 부분은 0으로 .. )

 

 

 

 

 

[4] 배열의 특징

 

C언어에서 배열은 다음과 같은 특징을 가진다.

 

1. 배열의 길이를 선언할 때에는 반드시 상수를 사용해야 함.

2. 배열 요소의 인덱스는 언제나 0부터 시작함.

3. C 컴파일러는 배열의 길이를 전혀 신경 쓰지 않음.

4. 배열의 이름은 배열의 시작주소와 같음.

 

 

 

 

[5] 다차원 배열

 

다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미한다.

( 2차원 배열은 1차원 배열을 요소로 가지고, 3차원 배열은 2차원 배열을 요소로 가진다. )

(그림 2) 1차원 배열과 2차원 배열

(그림 2)를 보자. 왼쪽의 1차원 배열에서는 arr1 이라는 배열 한개를 선언하여 6개의 값을 처리하였다.

오른쪽 2차원 배열에서는 arr2이라는 배열 한개 안에 배열의 요소 또다른 배열이 들어가있다.

 

이해하기 쉽게 그림으로 보면 다음과 같다.

(그림 3) 이해하기 쉬운 배열의 모습

arr[2][3] 에서 2는 배열의 행 수, 3은 배열의 열 수라고 이해하면 편하다.

다차원 방식은 1차원 배열의 성질을 그대로 따른다. 따라서 다차원 배열의 초기화나 선언은 1차원 배열의 방식과 같다.

 

그럼 이러한 다차원 배열은 어디에 사용될까? 다차원 배열은 이럴때 사용된다.

예를들어 선린인터넷고등학교라는 학교에는 한반에 50명으로 이루어진 15개의 반이 있다고 해보자. 

그럼 15개의 반, 한반에 50명의 시험 성적을 처리하려면 변수를 15 * 50 개를 선언해야 한다.

하지만 2차원 배열을 선언한다면, 이런식으로 쉽게 처리할 수 있다.

 

(예제 4)

#include <stdio.h>
int main(void) 
{ 
    int num[15][50] = { {1,2,3,4,5,6, . . . ,50} , {1,2,3,4,5,6, . . . ,50} . . . . . . {1,2,3,4,5,6, . . . ,50]} } ;

                              
    printf("%d ",num[1][49]);  // 2반의 50번 학생의 성적 출력
    printf("%d ",num[7][15]);  // 8반의 16번 학생의 성적 출력
    printf("%d ",num[9][7]]);  // 10반의 8번 학생의 성적 출력
    printf("%d ",num[11][30]); // 12반의 31번 학생의 성적 출력

 

    return 0;
} 

 

(예제 4의 결과)

50 16 8 31

 

 

 

 

[6] 배열의 활용

 

(예제 5 - 배열의 각 원소들의 합 구하기)

#include 
int main(void)

{
    int num[10] = {2,4,6,8,10,12,14,16,18,20} ; 

    int sum=0;
    for(int i=0;i<10;i++)
        sum = num[i] + sum;  // 배열의 0번 원소부터 마지막 원소까지 누적해서 sum에 총합을 계산함

    printf("%d",sum);
}

 

(예제 5의 결과)

110

 

(예제 6 - 2차원 배열에서 원소들의 합 구하기)

#include 
int main(void)

{
    int num[2][10] = { {2,4,6,8,10,12,14,16,18,20},{1,3,5,7,9,11,13,15,17,19} };

    int sum=0;

    int j=0, i=0;
    for(i=0; i<10 ;i++)
    {
            for(j=0; j<2 ;j++)
                sum = num[j][i] + sum;
    }
    printf("%d",sum);
}

 

(예제 6의 결과)

210

 

(예제 7 - 배열에 문자열 할당하기)

문자열 ( string ) 이란, "NULL ( \0 )" 문자로 끝나는 단일 문자의 연결이다. 일단 다음의 예제를 보자.

#include 
int main(void)

{
    char HW[] = "Hello world!";

    int size_HW = sizeof(HW)/sizeof(char);
    printf("%s ",HW);
    printf("%d\n",size_HW);

    char HW2[] = "Hello           world!";

    int size_HW2 = sizeof(HW2)/sizeof(char);
    printf("%s ",HW2);  // %s 는 문자열을 출력하기위한 포맷스트링
    printf("%d",size_HW2);
}

 

(예제 7의 결과)

Hello world! 13
Hello           world! 23

문자열 배열의 선언은 본문에서 설명한 초기화방법과 선언방법을 그대로 따라간다. 다만 몇가지 차이점이 있는데, 문자열 배열은 선언과 초기화를 동시에 해주어야 한다. 그리고 위에서 말한것처럼 문자열은 단일 문자의 연결과 같으므로 다음과같이 표현된다.

char HW[0] = 'H' ;

char HW[1] = 'e' ;

:

:

char HW[6] = ' ' ;  // 공백 하나가 원소에 들어갔다. 위의 예제처럼 공백도 배열원소중 하나를 차지한다.

:

:

char HW[13] = '\0' ; // 문자열의 끝을 알리는 NULL 문자이다. NULL 문자도 원소중 하나를 차지하므로 꼭 생각해서 코                                 드를 작성해야 한다.

이를 간편하게 char HW[] = "Hello World!"; 라고 표현했음을 알아두자. 문자열의 마지막에는 항상 널문자가 포함된다는 사실도 절대로 잊지말자.

그리고 문자열을 출력할때는 %s를 사용하고, 문자열중 하나의 문자를 출력할때는 %c를 사용한다.

 

'Layer 7 > assignment' 카테고리의 다른 글

[C] 포인터 보고서  (0) 2019.04.03
[C] 함수 보고서  (0) 2019.04.03
[C] 짝수는 빼고 홀수는 더하자!  (0) 2019.03.29
[C] 팩토리얼 계산기  (0) 2019.03.29
[C] 계단 뒤집어 별찍기  (0) 2019.03.29