C 언어로 두 개의 연립 일차 방정식 풀기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍으로 두 개의 연립 일차 방정식을 푸는 방법을 배웁니다. 이 실습은 주로 두 가지 단계로 구성됩니다. 먼저 두 방정식의 계수를 읽고, 그 다음 행렬식 방법을 사용하여 해를 계산하는 것입니다. 사용자가 계수를 입력할 수 있도록 C 프로그램을 작성하고, 프로그램은 해 또는 발생할 수 있는 특수 케이스를 계산하여 표시합니다.

첫 번째 단계는 사용자에게 표준 형태 (ax + by = c) 로 두 개의 일차 방정식의 계수를 입력하도록 요청하는 것입니다. 프로그램은 입력한 계수를 출력하여 입력을 확인합니다. 두 번째 단계에서는 크래머의 규칙을 사용하여 프로그램을 확장하여 해를 계산합니다. 이는 계수 행렬의 행렬식을 계산하는 것을 포함합니다. 프로그램은 해 또는 특수 케이스 (해가 없거나 해가 무수히 많은 경우) 를 표시합니다.

두 개의 방정식 계수 읽기

이 단계에서는 C 프로그래밍을 사용하여 두 개의 연립 일차 방정식의 계수를 읽는 방법을 배웁니다. 표준 형식 (ax + by = c) 으로 두 개의 방정식에 대한 계수를 사용자가 입력할 수 있도록 프로그램을 만들 것입니다.

먼저 방정식 솔버를 구현하기 위한 새로운 C 파일을 만들어 봅시다.

cd ~/project
nano linear_equations.c

이제 계수를 읽는 다음 코드를 추가합니다.

#include <stdio.h>

int main() {
    float a1, b1, c1;  // 첫 번째 방정식의 계수
    float a2, b2, c2;  // 두 번째 방정식의 계수

    // 첫 번째 방정식의 계수를 입력받습니다.
    printf("첫 번째 방정식의 계수를 입력하세요 (ax + by = c):\n");
    printf("a1: ");
    scanf("%f", &a1);
    printf("b1: ");
    scanf("%f", &b1);
    printf("c1: ");
    scanf("%f", &c1);

    // 두 번째 방정식의 계수를 입력받습니다.
    printf("두 번째 방정식의 계수를 입력하세요 (ax + by = c):\n");
    printf("a2: ");
    scanf("%f", &a2);
    printf("b2: ");
    scanf("%f", &b2);
    printf("c2: ");
    scanf("%f", &c2);

    // 입력한 계수를 확인하기 위해 출력합니다.
    printf("\n첫 번째 방정식: %.2fx + %.2fy = %.2f\n", a1, b1, c1);
    printf("두 번째 방정식: %.2fx + %.2fy = %.2f\n", a2, b2, c2);

    return 0;
}

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

gcc linear_equations.c -o linear_equations
./linear_equations

예시 출력:

첫 번째 방정식의 계수를 입력하세요 (ax + by = c):
a1: 2
b1: 3
c1: 8
두 번째 방정식의 계수를 입력하세요 (ax + by = c):
a2: 1
b2: 4
c2: 10

첫 번째 방정식: 2.00x + 3.00y = 8.00
두 번째 방정식: 1.00x + 4.00y = 10.00

행렬식을 이용한 해 계산

이 단계에서는 행렬식 방법을 사용하여 두 개의 연립 일차 방정식을 푸는 방법을 배웁니다. 이전 프로그램을 확장하여 크래머의 규칙을 사용하여 해를 계산할 것입니다.

기존 파일을 열고 코드를 수정합니다.

cd ~/project
nano linear_equations.c

행렬식 계산 방법으로 코드를 업데이트합니다.

#include <stdio.h>

// 행렬식 계산 함수
float determinant(float a1, float b1, float a2, float b2) {
    return a1 * b2 - a2 * b1;
}

int main() {
    float a1, b1, c1;  // 첫 번째 방정식의 계수
    float a2, b2, c2;  // 두 번째 방정식의 계수
    float det, detX, detY;
    float x, y;

    // 첫 번째 방정식의 계수를 입력받습니다.
    printf("첫 번째 방정식의 계수를 입력하세요 (ax + by = c):\n");
    printf("a1: ");
    scanf("%f", &a1);
    printf("b1: ");
    scanf("%f", &b1);
    printf("c1: ");
    scanf("%f", &c1);

    // 두 번째 방정식의 계수를 입력받습니다.
    printf("두 번째 방정식의 계수를 입력하세요 (ax + by = c):\n");
    printf("a2: ");
    scanf("%f", &a2);
    printf("b2: ");
    scanf("%f", &b2);
    printf("c2: ");
    scanf("%f", &c2);

    // 주 행렬식 계산
    det = determinant(a1, b1, a2, b2);

    // 독립적인 해가 있는지 확인
    if (det != 0) {
        // x 와 y 에 대한 행렬식 계산
        detX = determinant(c1, b1, c2, b2);
        detY = determinant(a1, c1, a2, c2);

        // 해 계산
        x = detX / det;
        y = detY / det;

        printf("\n해:\n");
        printf("x = %.2f\n", x);
        printf("y = %.2f\n", y);
    } else {
        // 해가 없거나 무수히 많은지 확인
        if (determinant(c1, b1, c2, b2) != 0 || determinant(a1, c1, a2, c2) != 0) {
            printf("\n해가 존재하지 않습니다.\n");
        } else {
            printf("\n무수히 많은 해가 존재합니다.\n");
        }
    }

    return 0;
}

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

gcc linear_equations.c -o linear_equations
./linear_equations

유일한 해에 대한 예시 출력:

첫 번째 방정식의 계수를 입력하세요 (ax + by = c):
a1: 2
b1: 3
c1: 8
두 번째 방정식의 계수를 입력하세요 (ax + by = c):
a2: 1
b2: 4
c2: 10

해:
x = 2.00
y = 2.00

해가 없는 경우 예시 출력:

첫 번째 방정식의 계수를 입력하세요 (ax + by = c):
a1: 2
b1: 3
c1: 8
두 번째 방정식의 계수를 입력하세요 (ax + by = c):
a2: 4
b2: 6
c2: 16

해가 존재하지 않습니다.

해 출력 또는 특수 케이스

이 마지막 단계에서는 두 개의 연립 일차 방정식에 대한 다양한 유형의 해에 대한 더 자세한 출력을 제공하도록 프로그램을 개선할 것입니다.

기존 파일을 열고 최종 수정을 수행합니다.

cd ~/project
nano linear_equations.c

개선된 출력 형식으로 코드를 업데이트합니다.

#include <stdio.h>
#include <math.h>

// 행렬식 계산 함수
float determinant(float a1, float b1, float a2, float b2) {
    return a1 * b2 - a2 * b1;
}

int main() {
    float a1, b1, c1;  // 첫 번째 방정식의 계수
    float a2, b2, c2;  // 두 번째 방정식의 계수
    float det, detX, detY;
    float x, y;
    float EPSILON = 1e-6;  // 부동소수점 비교를 위한 작은 값

    // 첫 번째 방정식의 계수를 입력받습니다.
    printf("연립 일차 방정식 풀이기\n");
    printf("첫 번째 방정식의 계수를 입력하세요 (ax + by = c):\n");
    printf("a1: ");
    scanf("%f", &a1);
    printf("b1: ");
    scanf("%f", &b1);
    printf("c1: ");
    scanf("%f", &c1);

    // 두 번째 방정식의 계수를 입력받습니다.
    printf("두 번째 방정식의 계수를 입력하세요 (ax + by = c):\n");
    printf("a2: ");
    scanf("%f", &a2);
    printf("b2: ");
    scanf("%f", &b2);
    printf("c2: ");
    scanf("%f", &c2);

    // 입력 방정식 출력
    printf("\n입력 방정식:\n");
    printf("방정식 1: %.2fx + %.2fy = %.2f\n", a1, b1, c1);
    printf("방정식 2: %.2fx + %.2fy = %.2f\n", a2, b2, c2);

    // 주 행렬식 계산
    det = determinant(a1, b1, a2, b2);

    // 해 유형 판별 및 출력
    if (fabs(det) > EPSILON) {
        // 유일한 해인 경우
        detX = determinant(c1, b1, c2, b2);
        detY = determinant(a1, c1, a2, c2);

        x = detX / det;
        y = detY / det;

        printf("\n--- 해 유형: 유일한 해 ---\n");
        printf("해:\n");
        printf("x = %.2f\n", x);
        printf("y = %.2f\n", y);
    } else {
        // 해가 없거나 무수히 많은 경우 확인
        detX = determinant(c1, b1, c2, b2);
        detY = determinant(a1, c1, a2, c2);

        if (fabs(detX) > EPSILON || fabs(detY) > EPSILON) {
            printf("\n--- 해 유형: 해 없음 ---\n");
            printf("연립 방정식에 해가 없습니다.\n");
            printf("방정식은 불일치하고 평행합니다.\n");
        } else {
            printf("\n--- 해 유형: 무수히 많은 해 ---\n");
            printf("연립 방정식에 무수히 많은 해가 있습니다.\n");
            printf("방정식은 동일하고 종속적입니다.\n");
        }
    }

    return 0;
}

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

gcc linear_equations.c -o linear_equations
./linear_equations

유일한 해에 대한 예시 출력:

연립 일차 방정식 풀이기
첫 번째 방정식의 계수를 입력하세요 (ax + by = c):
a1: 2
b1: 3
c1: 8
두 번째 방정식의 계수를 입력하세요 (ax + by = c):
a2: 1
b2: 4
c2: 10

입력 방정식:
방정식 1: 2.00x + 3.00y = 8.00
방정식 2: 1.00x + 4.00y = 10.00

--- 해 유형: 유일한 해 ---
해:
x = 2.00
y = 2.00

해가 없는 경우 예시 출력:

연립 일차 방정식 풀이기
첫 번째 방정식의 계수를 입력하세요 (ax + by = c):
a1: 2
b1: 3
c1: 8
두 번째 방정식의 계수를 입력하세요 (ax + by = c):
a2: 4
b2: 6
c2: 16

입력 방정식:
방정식 1: 2.00x + 3.00y = 8.00
방정식 2: 4.00x + 6.00y = 16.00

--- 해 유형: 해 없음 ---
연립 방정식에 해가 없습니다.
방정식은 불일치하고 평행합니다.

요약

이 실습에서는 C 프로그래밍에서 두 개의 연립 일차 방정식의 계수를 읽는 방법을 처음 배웠습니다. 사용자에게 두 방정식의 계수 (a, b, c) 를 입력하도록 요청하고 입력을 확인하기 위해 방정식을 출력하는 프로그램을 만들었습니다. 다음으로, 행렬식 방법과 크래머의 규칙을 사용하여 연립 방정식의 해를 계산하는 방법을 배울 것입니다.

프로그램은 이전 기능을 확장하여 연립 방정식의 해를 계산할 것입니다. 계수 행렬의 행렬식을 계산하고 크래머의 규칙을 사용하여 연립 방정식을 만족하는 변수 x 와 y 의 값을 찾을 것입니다.