Решение системы двух линейных уравнений на языке C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) вы научитесь решать систему из двух линейных уравнений на языке программирования 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

--- Тип решения: Нет решения ---
Система уравнений не имеет решения.
Уравнения несовместны и параллельны.

Резюме

В этом лабораторном занятии (LabEx) вы сначала научились считывать коэффициенты системы двух линейных уравнений на языке программирования C. Вы создали программу, которая запрашивает у пользователя ввод коэффициентов (a, b, c) для двух уравнений и затем выводит эти уравнения для проверки ввода. Затем вы научились решать систему уравнений с использованием метода определителей и правила Крамера для вычисления решений.

Программа расширяет предыдущую функциональность, чтобы вычислять решения системы уравнений. Она определяет определитель матрицы коэффициентов и использует правило Крамера для нахождения значений переменных x и y, которые удовлетворяют системе.