C 언어 2 차원 배열 생성

CBeginner
지금 연습하기

소개

이 랩에서는 C 언어에서 2 차원 배열을 생성하고 조작하는 방법을 배우게 됩니다. 먼저 2 차원 배열을 선언하는 것으로 시작하여, 이를 초기화하는 다양한 방법을 탐구할 것입니다. 다음으로, 배열의 요소에 접근하고 조작하는 방법을 배우게 됩니다. 마지막으로, 두 과목의 평균 점수를 계산하고 2 차원 배열의 기능을 향상시키기 위해 배운 내용을 적용할 것입니다. 이 랩은 C 프로그래밍 언어에서 2 차원 배열을 사용하는 방법에 대한 포괄적인 이해를 제공합니다.

2 차원 배열 선언

이 단계에서는 C 언어에서 2 차원 배열을 선언하는 방법을 배우게 됩니다. 2 차원 배열은 본질적으로 배열의 배열이며, 행과 열을 사용하여 그리드와 같은 구조로 데이터를 저장할 수 있게 해줍니다.

2 차원 배열 선언을 시연하기 위해 새로운 C 파일을 생성해 보겠습니다.

touch ~/project/two_dimensional_arrays.c

이제 첫 번째 2 차원 배열 선언을 작성해 보겠습니다.

#include <stdio.h>

int main() {
    // 3x4 정수 2 차원 배열 선언
    int grades[3][4];

    return 0;
}

이 예에서 grades는 3 개의 행과 4 개의 열을 가진 2 차원 배열입니다. 즉, 총 12 개의 정수 값 (3 × 4 = 12) 을 저장할 수 있습니다.

2 차원 배열을 선언하는 다양한 방법을 살펴보고, 다음 코드를 파일에 추가해 보겠습니다.

// 방법 1: 초기화와 함께 선언
int matrix[2][3] = {
    {1, 2, 3},   // 첫 번째 행
    {4, 5, 6}    // 두 번째 행
};

// 방법 2: 부분 초기화
int scores[3][3] = {
    {10, 20, 30},
    {40, 50}     // 나머지 요소는 0 으로 설정됩니다.
};

// 방법 3: 평탄화된 초기화
int simple_matrix[2][3] = {1, 2, 3, 4, 5, 6};

프로그램을 컴파일하고 실행하여 확인합니다.

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

예시 출력은 print 문을 추가하지 않았으므로 빈 프로그램 실행이 될 것입니다.

2 차원 배열 선언에 대한 주요 사항:

  • 첫 번째 대괄호는 행을 나타냅니다.
  • 두 번째 대괄호는 열을 나타냅니다.
  • 부분적으로 또는 완전히 초기화할 수 있습니다.
  • 초기화되지 않은 요소는 자동으로 0 으로 설정됩니다.
  • 총 요소 = 행 × 열

2 차원 배열 초기화

이 단계에서는 이전 단계에서 배운 선언 기술을 바탕으로 C 언어에서 2 차원 배열을 초기화하는 다양한 방법을 배우게 됩니다.

이전 파일을 수정하여 다양한 초기화 기법을 살펴보겠습니다.

이제 기존 코드를 다음 초기화 방법으로 바꿉니다.

#include <stdio.h>

int main() {
    // 방법 1: 완전 초기화
    int scores[3][4] = {
        {85, 92, 78, 90},    // 첫 번째 행
        {76, 88, 95, 82},    // 두 번째 행
        {63, 71, 89, 93}     // 세 번째 행
    };

    // 방법 2: 부분 초기화
    int temperatures[2][3] = {
        {25, 30, 22},        // 첫 번째 행
        {28}                 // 부분적인 두 번째 행
    };

    // 방법 3: 평탄화된 초기화
    int matrix[2][3] = {1, 2, 3, 4, 5, 6};

    // 방법 4: 모든 요소를 0 으로 초기화
    int zeros[3][3] = {0};

    // 첫 번째 방법을 출력하여 시연
    printf("Student Scores:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", scores[i][j]);
        }
        printf("\n");
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

예시 출력:

Student Scores:
85 92 78 90
76 88 95 82
63 71 89 93

주요 초기화 방법:

  1. 완전 초기화: 각 행에 대한 값을 지정합니다.
  2. 부분 초기화: 지정되지 않은 요소는 0 으로 설정됩니다.
  3. 평탄화된 초기화: 행별로 값을 채웁니다.
  4. 0 초기화: 모든 요소가 0 으로 설정됩니다.

중요 사항:

  • 배열을 부분적으로 초기화할 수 있습니다.
  • 지정되지 않은 요소는 자동으로 0 으로 설정됩니다.
  • 초기화기의 총 개수는 배열 크기를 초과할 수 없습니다.
  • 중첩된 중괄호는 행별 초기화를 명확하게 합니다.

2 차원 배열 요소 접근

이 단계에서는 C 언어에서 인덱싱과 중첩 루프를 사용하여 2 차원 배열의 개별 요소에 접근하는 방법을 배우게 됩니다.

요소 접근을 시연하기 위해 이전 파일을 업데이트해 보겠습니다.

다음 코드를 추가하여 배열 요소에 접근하는 다양한 방법을 살펴보세요.

#include <stdio.h>

int main() {
    // 3x4 학생 성적 배열 생성
    int grades[3][4] = {
        {85, 92, 78, 90},    // 첫 번째 학생의 성적
        {76, 88, 95, 82},    // 두 번째 학생의 성적
        {63, 71, 89, 93}     // 세 번째 학생의 성적
    };

    // 방법 1: 직접 요소 접근
    printf("첫 번째 학생의 첫 번째 성적: %d\n", grades[0][0]);
    printf("두 번째 학생의 세 번째 성적: %d\n", grades[1][2]);

    // 방법 2: 중첩 루프를 사용하여 요소 접근
    printf("\n중첩 루프를 사용한 모든 성적:\n");
    for (int student = 0; student < 3; student++) {
        for (int subject = 0; subject < 4; subject++) {
            printf("학생 %d, 과목 %d: %d\n",
                   student + 1, subject + 1, grades[student][subject]);
        }
    }

    // 방법 3: 배열 요소 수정
    grades[2][3] = 95;  // 세 번째 학생의 마지막 성적 업데이트
    printf("\n업데이트된 세 번째 학생의 마지막 성적: %d\n", grades[2][3]);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

예시 출력:

First student's first grade: 85
Second student's third grade: 95

All grades using nested loops:
Student 1, Subject 1: 85
Student 1, Subject 2: 92
Student 1, Subject 3: 78
Student 1, Subject 4: 90
Student 2, Subject 1: 76
Student 2, Subject 2: 88
Student 2, Subject 3: 95
Student 2, Subject 4: 82
Student 3, Subject 1: 63
Student 3, Subject 2: 71
Student 3, Subject 3: 89
Student 3, Subject 4: 95

Updated third student's last grade: 95

2 차원 배열 요소 접근에 대한 주요 사항:

  • 두 개의 인덱스 사용: array[row][column]
  • 첫 번째 인덱스는 행 (세로) 을 나타냅니다.
  • 두 번째 인덱스는 열 (가로) 을 나타냅니다.
  • 인덱싱은 0 부터 시작합니다.
  • 중첩 루프는 전체 배열을 순회하는 데 유용합니다.
  • 개별 요소를 직접 읽고 수정할 수 있습니다.

두 과목 평균 점수 계산

이 단계에서는 2 차원 배열을 사용하여 여러 학생의 여러 과목에 대한 평균 점수를 계산하는 방법을 배우게 됩니다.

과목 평균을 계산하기 위해 이전 파일을 업데이트해 보겠습니다.

평균 점수를 계산하고 표시하려면 다음 코드를 추가하세요.

#include <stdio.h>

#define STUDENTS 5
#define SUBJECTS 3

int main() {
    // 학생 점수를 위한 2 차원 배열 생성
    int marks[STUDENTS][SUBJECTS] = {
        {85, 92, 78},
        {76, 88, 95},
        {63, 71, 89},
        {90, 84, 77},
        {82, 79, 91}
    };

    // 과목 평균을 저장할 배열
    float subject_averages[SUBJECTS];

    // 각 과목의 평균 계산
    for (int subject = 0; subject < SUBJECTS; subject++) {
        int subject_total = 0;

        // 현재 과목의 점수 합산
        for (int student = 0; student < STUDENTS; student++) {
            subject_total += marks[student][subject];
        }

        // 평균 계산
        subject_averages[subject] = (float)subject_total / STUDENTS;
    }

    // 과목 평균 표시
    printf("Subject Averages:\n");
    for (int subject = 0; subject < SUBJECTS; subject++) {
        printf("Subject %d: %.2f\n", subject + 1, subject_averages[subject]);
    }

    // 보너스: 최고 및 최저 과목 평균 찾기
    float highest_avg = subject_averages[0];
    float lowest_avg = subject_averages[0];
    int highest_subject = 0;
    int lowest_subject = 0;

    for (int subject = 1; subject < SUBJECTS; subject++) {
        if (subject_averages[subject] > highest_avg) {
            highest_avg = subject_averages[subject];
            highest_subject = subject;
        }
        if (subject_averages[subject] < lowest_avg) {
            lowest_avg = subject_averages[subject];
            lowest_subject = subject;
        }
    }

    printf("\nHighest Average: Subject %d (%.2f)\n",
           highest_subject + 1, highest_avg);
    printf("Lowest Average: Subject %d (%.2f)\n",
           lowest_subject + 1, lowest_avg);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

예시 출력:

Subject Averages:
Subject 1: 79.20
Subject 2: 82.80
Subject 3: 86.00

Highest Average: Subject 3 (86.00)
Lowest Average: Subject 1 (79.20)

데모된 주요 개념:

  • 2 차원 배열을 처리하기 위한 중첩 루프 사용
  • 행과 열에 걸쳐 평균 계산
  • 최고 및 최저 평균 찾기
  • float 평균을 계산하기 위한 타입 캐스팅 (Type casting)
  • 배열 차원에 대한 상수 정의

2 차원 배열 기능 향상

이 마지막 단계에서는 2 차원 배열 기능을 향상시키기 위한 고급 기술을 배우게 됩니다. 여기에는 함수에 배열 전달, 동적 메모리 할당, 더 복잡한 배열 연산 생성 등이 포함됩니다.

이러한 고급 개념을 시연하기 위해 이전 파일을 업데이트해 보겠습니다.

이 포괄적인 예제로 이전 코드를 대체하세요.

#include <stdio.h>
#include <stdlib.h>

#define ROWS 3
#define COLS 4

// 2 차원 배열을 출력하는 함수
void printArray(int arr[ROWS][COLS]) {
    printf("Array Contents:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d ", arr[i][j]);
        }
        printf("\n");
    }
}

// 2 차원 배열을 전치하는 함수
void transposeArray(int original[ROWS][COLS], int transposed[COLS][ROWS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            transposed[j][i] = original[i][j];
        }
    }
}

int main() {
    // 정적 2 차원 배열
    int matrix[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    // 원본 배열 출력
    printf("Original Array:\n");
    printArray(matrix);

    // 배열 전치
    int transposed[COLS][ROWS];
    transposeArray(matrix, transposed);

    // 전치된 배열 출력
    printf("\nTransposed Array:\n");
    for (int i = 0; i < COLS; i++) {
        for (int j = 0; j < ROWS; j++) {
            printf("%4d ", transposed[i][j]);
        }
        printf("\n");
    }

    // 2 차원 배열에 대한 동적 메모리 할당
    int **dynamicMatrix;
    dynamicMatrix = (int **)malloc(ROWS * sizeof(int *));
    for (int i = 0; i < ROWS; i++) {
        dynamicMatrix[i] = (int *)malloc(COLS * sizeof(int));
    }

    // 동적 행렬 초기화
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            dynamicMatrix[i][j] = i * COLS + j + 1;
        }
    }

    // 동적 행렬 출력
    printf("\nDynamic Matrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d ", dynamicMatrix[i][j]);
        }
        printf("\n");
    }

    // 동적으로 할당된 메모리 해제
    for (int i = 0; i < ROWS; i++) {
        free(dynamicMatrix[i]);
    }
    free(dynamicMatrix);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

예시 출력:

Original Array:
   1   2   3   4
   5   6   7   8
   9  10  11  12

Transposed Array:
   1   5   9
   2   6  10
   3   7  11
   4   8  12

Dynamic Matrix:
   1   2   3   4
   5   6   7   8
   9  10  11  12

데모된 주요 고급 개념:

  • 함수에 2 차원 배열 전달
  • 배열 전치 (Array transposition)
  • 2 차원 배열에 대한 동적 메모리 할당
  • malloc()free()를 사용한 메모리 관리
  • 유연한 배열 조작 기술

요약

이 랩에서는 C 에서 2 차원 배열을 선언하는 방법을 배웠습니다. 2 차원 배열은 행과 열을 사용하여 데이터를 격자 구조로 저장할 수 있는 배열의 배열입니다. 전체 초기화, 부분 초기화, 평탄화된 초기화를 포함하여 2 차원 배열을 선언하고 초기화하는 다양한 방법을 살펴보았습니다. 또한 초기화되지 않은 요소는 자동으로 0 으로 설정되며, 2 차원 배열의 총 요소 수는 행과 열의 수의 곱으로 결정된다는 것을 배웠습니다.

선언 기술을 바탕으로, C 에서 2 차원 배열을 초기화하는 다양한 방법을 배웠습니다. 여기에는 행별, 열별 또는 평탄화된 방식을 사용하여 값을 할당하는 방법이 포함됩니다. 또한 행 및 열 인덱스를 사용하여 2 차원 배열 내의 개별 요소에 접근하는 방법도 살펴보았습니다.