소개
이 실습에서는 C 프로그래밍으로 정방 행렬의 행렬식을 계산하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다: 행렬의 차원과 요소를 읽는 것, 재귀 또는 LU 분해 방법을 사용하여 행렬식을 계산하는 것, 그리고 최종 결과를 출력하는 것. 단계별 지침은 최대 10x10 크기의 정방 행렬을 처리할 수 있는 프로그램을 만드는 과정을 안내하며, 사용자는 행렬 요소를 동적으로 입력하고 계산된 행렬식을 표시할 수 있습니다.
이 실습에서는 C 프로그래밍으로 정방 행렬의 행렬식을 계산하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다: 행렬의 차원과 요소를 읽는 것, 재귀 또는 LU 분해 방법을 사용하여 행렬식을 계산하는 것, 그리고 최종 결과를 출력하는 것. 단계별 지침은 최대 10x10 크기의 정방 행렬을 처리할 수 있는 프로그램을 만드는 과정을 안내하며, 사용자는 행렬 요소를 동적으로 입력하고 계산된 행렬식을 표시할 수 있습니다.
이 단계에서는 C 프로그래밍으로 정방 행렬의 차원과 요소를 읽는 방법을 배웁니다. 사용자가 행렬의 크기와 요소를 동적으로 입력할 수 있도록 프로그램을 만들 것입니다.
먼저 행렬식 프로그램을 위한 새로운 C 파일을 생성합니다.
cd ~/project
nano matrix_determinant.c
이제 행렬 차원과 요소를 읽는 다음 코드를 추가합니다.
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
int main() {
int n, i, j;
int matrix[MAX_SIZE][MAX_SIZE];
// 행렬 차원 읽기
printf("정방 행렬의 크기를 입력하세요 (1-%d): ", MAX_SIZE);
scanf("%d", &n);
// 행렬 크기 유효성 검사
if (n < 1 || n > MAX_SIZE) {
printf("잘못된 행렬 크기입니다. 1 과 %d 사이의 크기를 입력하세요.\n", MAX_SIZE);
return 1;
}
// 행렬 요소 읽기
printf("행렬 요소를 입력하세요:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("요소 [%d][%d] 를 입력하세요: ", i, j);
scanf("%d", &matrix[i][j]);
}
}
// 입력 확인을 위해 행렬 출력
printf("\n입력된 행렬:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
프로그램을 컴파일하고 실행합니다.
gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant
예시 출력:
정방 행렬의 크기를 입력하세요 (1-10): 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 4
요소 [1][1]를 입력하세요: 5
요소 [1][2]를 입력하세요: 6
요소 [2][0]를 입력하세요: 7
요소 [2][1]를 입력하세요: 8
요소 [2][2]를 입력하세요: 9
입력된 행렬:
1 2 3
4 5 6
7 8 9
코드 분석:
이 단계에서는 행렬의 행렬식을 계산하기 위한 재귀 방법을 구현합니다. 이전 프로그램을 수정하여 행렬식 계산 함수를 포함할 것입니다.
matrix_determinant.c 파일을 업데이트합니다.
nano matrix_determinant.c
이전 내용을 다음 코드로 바꿉니다.
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
// 행렬식을 재귀적으로 계산하는 함수
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
int det = 0;
int submatrix[MAX_SIZE][MAX_SIZE];
// 1x1 행렬의 경우 기저 사례
if (n == 1) {
return matrix[0][0];
}
// 2x2 행렬의 경우 기저 사례
if (n == 2) {
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}
// 더 큰 행렬의 경우 재귀 사례
int sign = 1;
for (int k = 0; k < n; k++) {
// 부행렬 생성
int subi = 0;
for (int i = 1; i < n; i++) {
int subj = 0;
for (int j = 0; j < n; j++) {
if (j == k) continue;
submatrix[subi][subj] = matrix[i][j];
subj++;
}
subi++;
}
// 재귀 계산
det += sign * matrix[0][k] * determinant(submatrix, n - 1);
sign = -sign;
}
return det;
}
int main() {
int n, i, j;
int matrix[MAX_SIZE][MAX_SIZE];
// 행렬 차원 읽기
printf("정방 행렬의 크기를 입력하세요 (1-%d): ", MAX_SIZE);
scanf("%d", &n);
// 행렬 크기 유효성 검사
if (n < 1 || n > MAX_SIZE) {
printf("잘못된 행렬 크기입니다. 1 과 %d 사이의 크기를 입력하세요.\n", MAX_SIZE);
return 1;
}
// 행렬 요소 읽기
printf("행렬 요소를 입력하세요:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("요소 [%d][%d] 를 입력하세요: ", i, j);
scanf("%d", &matrix[i][j]);
}
}
// 행렬식 계산 및 출력
int det = determinant(matrix, n);
printf("\n행렬의 행렬식: %d\n", det);
return 0;
}
프로그램을 컴파일하고 실행합니다.
gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant
예시 출력:
정방 행렬의 크기를 입력하세요 (1-10): 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 4
요소 [1][1]를 입력하세요: 5
요소 [1][2]를 입력하세요: 6
요소 [2][0]를 입력하세요: 7
요소 [2][1]를 입력하세요: 8
요소 [2][2]를 입력하세요: 9
행렬의 행렬식: 0
재귀 행렬식 계산에 대한 주요 내용:
determinant() 함수는 재귀적 방법을 사용하여 행렬식을 계산합니다.이 마지막 단계에서는 사용자 경험을 개선하기 위해 행렬식 프로그램에 더 자세한 출력과 오류 처리를 추가할 것입니다.
matrix_determinant.c 파일을 업데이트합니다.
nano matrix_determinant.c
이전 내용을 다음 개선된 코드로 바꿉니다.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 10
// 행렬식을 재귀적으로 계산하는 함수
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
int det = 0;
int submatrix[MAX_SIZE][MAX_SIZE];
// 1x1 행렬의 경우 기저 사례
if (n == 1) {
return matrix[0][0];
}
// 2x2 행렬의 경우 기저 사례
if (n == 2) {
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
}
// 더 큰 행렬의 경우 재귀 사례
int sign = 1;
for (int k = 0; k < n; k++) {
// 부행렬 생성
int subi = 0;
for (int i = 1; i < n; i++) {
int subj = 0;
for (int j = 0; j < n; j++) {
if (j == k) continue;
submatrix[subi][subj] = matrix[i][j];
subj++;
}
subi++;
}
// 재귀 계산
det += sign * matrix[0][k] * determinant(submatrix, n - 1);
sign = -sign;
}
return det;
}
// 행렬을 형식화하여 출력하는 함수
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
printf("\n행렬:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%5d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int n, i, j;
int matrix[MAX_SIZE][MAX_SIZE];
bool valid_input = false;
while (!valid_input) {
// 행렬 차원 읽기
printf("정방 행렬의 크기를 입력하세요 (1-%d): ", MAX_SIZE);
if (scanf("%d", &n) != 1) {
printf("잘못된 입력입니다. 숫자를 입력하세요.\n");
while (getchar() != '\n'); // 입력 버퍼 비우기
continue;
}
// 행렬 크기 유효성 검사
if (n < 1 || n > MAX_SIZE) {
printf("잘못된 행렬 크기입니다. 1 과 %d 사이의 크기를 입력하세요.\n", MAX_SIZE);
continue;
}
valid_input = true;
}
// 행렬 요소 읽기
printf("행렬 요소를 입력하세요:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("요소 [%d][%d] 를 입력하세요: ", i, j);
while (scanf("%d", &matrix[i][j]) != 1) {
printf("잘못된 입력입니다. 요소 [%d][%d] 에 정수를 입력하세요: ", i, j);
while (getchar() != '\n'); // 입력 버퍼 비우기
}
}
}
// 입력 행렬 출력
print_matrix(matrix, n);
// 행렬식 계산 및 출력
int det = determinant(matrix, n);
// 형식화된 행렬식 출력
printf("\n--- 행렬식 계산 ---\n");
printf("행렬 차원: %d x %d\n", n, n);
printf("행렬식: %d\n", det);
return 0;
}
프로그램을 컴파일하고 실행합니다.
gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant
예시 출력:
정방 행렬의 크기를 입력하세요 (1-10): 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
...
행렬:
1 2 3
4 5 6
7 8 9
--- 행렬식 계산 ---
행렬 차원: 3 x 3
행렬식: 0
주요 개선 사항:
이 실험에서는 C 프로그래밍에서 정방 행렬의 차원과 요소를 읽는 방법을 배웠습니다. 사용자가 행렬의 크기와 요소를 동적으로 입력할 수 있도록 프로그램을 만들었습니다. 프로그램은 행렬 크기를 검증한 후 사용자에게 행렬 요소를 입력하도록 요청합니다. 마지막으로 입력된 행렬을 출력하여 입력을 확인합니다.
이 실험의 다음 단계에서는 입력 행렬의 행렬식을 계산하기 위해 재귀 또는 LU 분해 방법을 사용하는 방법과 행렬식을 출력하는 방법을 다룰 것입니다.