C 언어 2 차원 배열 생성

CBeginner
지금 연습하기

소개

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 94%의 긍정적인 리뷰율을 받았습니다.

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 차원 배열 내의 개별 요소에 접근하는 방법도 살펴보았습니다.