소개
이 랩에서는 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
주요 초기화 방법:
- 완전 초기화: 각 행에 대한 값을 지정합니다.
- 부분 초기화: 지정되지 않은 요소는 0 으로 설정됩니다.
- 평탄화된 초기화: 행별로 값을 채웁니다.
- 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 차원 배열 내의 개별 요소에 접근하는 방법도 살펴보았습니다.



