C 프로그래밍/8. 배열

8.4 2차원 배열

Recircle 2019. 6. 18. 18:39

지금 까지 배워온 배열은 X좌표만 존재한다고 생각할 수 있습니다.

이번에는 배열을 X,Y좌표로 저장한다고 생각하면 쉽습니다.


int s[3][5]; 라고 선언을 하게되면


 

0열 

1열 

2열 

3열 

4열 

 0행

 s[0][0]

 s[0][1]

 s[0][2] 

 s[0][3] 

 s[0][4] 

 1행

 s[1][0] 

 s[1][1] 

 s[1][2] 

 s[1][3] 

 s[1][4] 

 2행

 s[2][0] 

 s[2][1] 

 s[2][2] 

 s[2][3] 

 s[2][4] 

행과 열로 이야기를 하면 배열 s는 3개의 행으로 이루어졌고 각 행에는 5개의 요소가 있다고 할 수 있습니다.



2차원 배열에서의 요소 참조


참조를 위해서는 2개의 인덱스가 필요합니다. 

2차원 배열의 요소에 값을 저장하기 위해서는 변수 i는 0행에서 i-1행까지 변경시키고, 변수j는0에서 j-1까지 변경시키면서 s[i][j]에 저장하면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
#define ROWS 3
#define COLS 5
 
int main()
{
    int s[ROWS][COLS];
    int i,j;
 
    for ( i = 0; i < ROWS; i++)
    {
        for ( j = 0; j < COLS; j++)
        {
            s[i][j] = rand() % 100;
        }
    }
    for ( i = 0; i < ROWS; i++)
    {
        for ( j = 0; j < COLS; j++)
        {
            printf("%02d ", s[i][j]);
        }
        printf("\n");
    }
    return 0;
}
cs

실행 결과



2차원 배열의 초기화


당연히 선언과 동시에 초기화가 가능합니다. 다만 같은 행에 속하는 초기값들을 중괄호로 묶어줘야합니다.

1
2
3
4
5
    int a[3][5] = {
        {87,98,80,76,3},
        {99,89,90,90,0},
        {65,68,50,49,0}
    };
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*학생들의 성적 기록표를 2차원 배열에 저장하고 각 학생의 최종 성적을 계산해보자.*/
 
 
#include <stdio.h>
#define ROWS 3
#define COLS 5
 
int main()
{
    int a[ROWS][COLS] = {
        {87,98,80,76,3},
        {99,89,90,90,0},
        {65,68,50,49,0}
    };
 
    int i;
 
    for ( i = 0; i < ROWS; i++)
    {
        double final_scores = a[i][0* 0.3 + a[i][1* 0.4 + a[i][2* 0.2 + a[i][3* 0.1 - a[i][4];
        printf("학생 #%i의 최종 성적 = %10.2f \n", i + 1, final_scores);
    }
    return 0;
}
cs

실행 결과


행렬의 합
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#define ROWS 3
#define COLS 3
 
int main()
{
    int A[ROWS][COLS] = {
        {2,3,0},
        {8,9,1},
        {7,0,5}
    };
    int B[ROWS][COLS] = {
        { 1,0,0},
        { 1,0,0},
        { 1,0,0}
    };
    int C[ROWS][COLS];
 
    int r, c;
 
    for ( r = 0; r < ROWS; r++)
    {
        for ( c = 0; c < COLS; c++)
        {
            C[r][c] = A[r][c] + B[r][c];
        }
    }
    for ( r = 0; r < ROWS; r++)
    {
        for ( c = 0; c < COLS; c++)
        {
            printf("%d ", C[r][c]);
        }
        printf("\n");
    }
    return 0;
}
cs

실행 결과


2차원 배열을 함수로 전달하기


함수에 인수로 전달이 가능합니다. 원본이 전달됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#define YEARS 3
#define PRODUCTS 5
 
int sum(int scores[YEARS][PRODUCTS]);
 
int main()
{
    int sales[YEARS][PRODUCTS] = { {1,2,3},{4,5,6},{7,8,9} };
    int total_sale;
 
    total_sale = sum(sales);
    printf("총 매출은 %d입니다. \n", total_sale);
 
    return 0;
}
 
int sum(int scores[YEARS][PRODUCTS])
{
    int y, p;
    int total = 0;
 
    for ( y = 0; y < YEARS; y++)
    {
        for ( p = 0; p < PRODUCTS; p++)
        {
            total += scores[y][p];
        }
    }
    return total;
}
cs




tic tac toe 게임


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
 
int main()
{
    char board[3][3];
    int x, y, k, i;
 
    //보드 초기화
    for ( x = 0; x < 3; x++)
    {
        for ( y = 0; y < 3; y++)
        {
            board[x][y] = ' ';
        }
    }
 
    // 사용자로부터 위치를 받아서 보드에 표시
    for ( k = 0; k < 9; k++)
    {
        printf("(x, y) 좌표: ");
        scanf(" %d %d"&x, &y);
        board[x][y] = (k % 2 == 0) ? 'x' : '0'// 현재의 순번에 따라 x,0 중 선택
 
        for ( i = 0; i < 3; i++// 보드를 화면에 그린다.
        {
            printf("---|---|---\n");
            printf("%c  | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        }
        printf("---|---|---\n");
    }
    return 0;
}
cs

실행결과는 알아서 연구해보세요.