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 |
실행결과는 알아서 연구해보세요.