C언어 행렬 출력 - ceon-eo haenglyeol chullyeog

안녕하세요. 스마트팩토리입니다. 
c 언어[029]  2차원 배열  형식과 구조 및 출력 에 대해 알아보겠습니다. 

C언어 행렬 출력 - ceon-eo haenglyeol chullyeog

1. 이차원 배열

가. 이차원 배열의 형식과 구조 

 2차원 배열의 형식
- [형식]= 2차원 배열의 선언
-자료형 배열명[행의 개수][열의 개수];

   행의 개수- 2차원 배열의 가로줄의 객수, 행의 번호입니다. 
  열의 개수 - 2차원 배열의  제로줄의 개수, 열의 번호입니다.

C언어 행렬 출력 - ceon-eo haenglyeol chullyeog

 실제 메모리 저장 순서는 아래와 같습니다. 

C언어 행렬 출력 - ceon-eo haenglyeol chullyeog

메모리에 저장되는 순서는 위 처럼 가로로 일렬인 것 처럼 저정이 됩니다. 하지만 우리가 생각할때는 행과 열로 구성된 것처럼 이해해도 됩니다. 이는 배열의 주소를 일렬로 늘여놓은 것과 같기 때문에 구분하여 놓아도 결과적으로 같게 됩니다. 

나. 이차원 배열 예

C언어 행렬 출력 - ceon-eo haenglyeol chullyeog

이차원 배열로 3행 4열로 된 데이터를 구성하였습니다. 

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

이를 출력해 보면 

처음에는 줄바꿈이 있느냐 없느냐 차이입니다. 

출력된 값을 보면 줄바꿈만 해줘도 우리가 행과 열을 생각하는데로 출력을 할 수 있는 것을 볼 수 있습니다. 

#include<stdio.h>

void main() {
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf(" %d", arr[i][j]);
}

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

}

C언어 행렬 출력 - ceon-eo haenglyeol chullyeog

배열값에 해당하는 인덱스를 찍어보면 바로 알 수 있습니다. 

결과적으로 이해를 할때 행과 열로 이해해도 큰 문제가 없다는 것을 알 수 있습니다. 

#include<stdio.h>
void main() {
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf(" %d", arr[i][j]);
}
}
printf("\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("\t %d", arr[i][j]);
}
printf("\n");
}
printf("arr[0][0]: %d\n", arr[0][0]);
printf("arr[0][1]: %d\n", arr[0][1]);
printf("arr[0][2]: %d\n", arr[0][2]);
printf("arr[0][3]: %d\n", arr[0][3]);
printf("arr[1][0]: %d\n", arr[1][0]);
printf("arr[1][1]: %d\n", arr[1][1]);
printf("arr[1][2]: %d\n", arr[1][2]);
printf("arr[1][3]: %d\n", arr[1][3]);
printf("arr[2][0]: %d\n", arr[2][0]);
printf("arr[2][1]: %d\n", arr[2][1]);
printf("arr[2][2]: %d\n", arr[2][2]);
printf("arr[2][3]: %d\n", arr[2][3]);
}

C언어 행렬 출력 - ceon-eo haenglyeol chullyeog


반복문을 사용하여 2차원 배열의 요소를 모두 출력해보겠습니다.

two_dimensional_array_for.c

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };

    int col = sizeof(numArr[0]) / sizeof(int);    // 4: 2차원 배열의 가로 크기를 구할 때는 
                                                  // 가로 한 줄의 크기를 요소의 크기로 나눠줌

    int row = sizeof(numArr) / sizeof(numArr[0]); // 3: 2차원 배열의 세로 크기를 구할 때는 
                                    // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌

    for (int i = 0; i < row; i++)    // 2차원 배열의 세로 크기만큼 반복
    {
        for (int j = 0; j < col; j++)    // 2차원 배열의 가로 크기만큼 반복
        {
            printf("%d ", numArr[i][j]); // 2차원 배열의 인덱스에 반복문의 변수 i, j를 지정
        }
        printf("\n");                // 가로 요소를 출력한 뒤 다음 줄로 넘어감
    }

    return 0;
}

실행 결과

11 22 33 44
55 66 77 88
99 110 121 132

먼저 배열의 세로 크기와 가로 크기를 구해줍니다. 그리고 for 반복문으로 세로부터 반복한 뒤 가로를 반복하면서 2차원 배열의 요소를 출력합니다.

for (int i = 0; i < row; i++)    // 2차원 배열의 세로 크기만큼 반복
{
    for (int j = 0; j < col; j++)    // 2차원 배열의 가로 크기만큼 반복
    {

반복문의 변수 ij는 변화식을 통해 1씩 증가하므로 2차원 배열의 세로 인덱스에는 i, 가로 인덱스에는 j를 넣으면 배열의 요소를 순서대로 접근할 수 있습니다.

printf("%d ", numArr[i][j]); // 2차원 배열의 인덱스에 반복문의 변수 i, j를 지정

그럼 역순으로도 출력할 수 있겠죠?

two_dimensional_array_for_reverse.c

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };

    int col = sizeof(numArr[0]) / sizeof(int);    // 4: 2차원 배열의 가로 크기를 구할 때는 
                                                  // 가로 한 줄의 크기를 요소의 크기로 나눠줌

    int row = sizeof(numArr) / sizeof(numArr[0]); // 3: 2차원 배열의 세로 크기를 구할 때는 
                                    // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌

    for (int i = row - 1; i >= 0; i--)    // 세로 크기 - 1부터 역순으로 반복
    {
        for (int j = col - 1; j >= 0; j--)    // 가로 크기 - 1부터 역순으로 반복
        {
            printf("%d ", numArr[i][j]);      // 2차원 배열의 인덱스에 반복문의 변수 i, j를 지정
        }
        printf("\n");                    // 가로 요소를 출력한 뒤 다음 줄로 넘어감
    }

    return 0;
}

실행 결과

132 121 110 99
88 77 66 55
44 33 22 11

반복문의 초깃값에 배열의 세로 크기와 가로 크기를 바로 넣어버리면 처음부터 배열의 인덱스를 벗어난 상태가 됩니다. 즉, 배열의 인덱스는 0부터 시작하므로 마지막 요소의 인덱스는 요소의 개수에서 1을 빼줍니다. 그리고 0까지 반복할 수 있도록 조건식을 i >= 0과 같이 지정하면 됩니다.

for (int i = row - 1; i >= 0; i--)    // 세로 크기 - 1부터 역순으로 반복
{
    for (int j = col - 1; j >= 0; j--)    // 가로 크기 - 1부터 역순으로 반복
    {