用 C 语言求解二次方程

CBeginner
立即练习

简介

在本实验中,你将学习如何用 C 语言编程求解二次方程。本实验涵盖了完整的过程,从读取二次方程的系数、计算判别式,到确定实根或复根。你将编写一个 C 程序,提示用户输入系数,进行必要的计算,并输出解。

本实验分为两个主要步骤。首先,你将学习如何从用户那里读取系数 a、b 和 c。然后,你将修改程序以计算判别式,并使用二次公式来求方程的根,同时处理实根和复根两种情况。

读取 a、b、c

在这一步中,你将学习如何在 C 语言中读取二次方程的输入值。我们将创建一个程序,接受用户输入的系数 a、b 和 c。

首先,为你的二次方程求解器创建一个新文件:

cd ~/project
nano quadratic_solver.c

现在,将以下代码添加到文件中:

#include <stdio.h>

int main() {
    double a, b, c;

    // 提示用户输入
    printf("输入系数 a: ");
    scanf("%lf", &a);

    printf("输入系数 b: ");
    scanf("%lf", &b);

    printf("输入系数 c: ");
    scanf("%lf", &c);

    // 打印输入的系数
    printf("输入的系数:\n");
    printf("a = %.2f\n", a);
    printf("b = %.2f\n", b);
    printf("c = %.2f\n", c);

    return 0;
}

编译程序:

gcc quadratic_solver.c -o quadratic_solver

运行程序:

./quadratic_solver

示例输出:

输入系数a: 1
输入系数b: -5
输入系数c: 6
输入的系数:
a = 1.00
b = -5.00
c = 6.00

让我们来分析一下代码的关键部分:

  • scanf() 用于读取每个系数的用户输入
  • %lf 是双精度浮点数的格式说明符
  • 我们将系数存储在变量 a、b 和 c 中
  • 程序会回显输入的系数以确认输入

计算判别式并确定根

在这一步中,你将修改上一个程序,以计算判别式并使用二次公式确定二次方程的根。

打开现有文件并更新代码:

cd ~/project
nano quadratic_solver.c

将之前的代码替换为以下内容:

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

int main() {
    double a, b, c;
    double discriminant, root1, root2;

    // 提示用户输入
    printf("输入系数 a: ");
    scanf("%lf", &a);

    printf("输入系数 b: ");
    scanf("%lf", &b);

    printf("输入系数 c: ");
    scanf("%lf", &c);

    // 计算判别式
    discriminant = b * b - 4 * a * c;

    // 检查判别式以确定根的类型
    if (discriminant > 0) {
        // 两个不同的实根
        root1 = (-b + sqrt(discriminant)) / (2 * a);
        root2 = (-b - sqrt(discriminant)) / (2 * a);
        printf("两个不同的实根:\n");
        printf("根 1 = %.2f\n", root1);
        printf("根 2 = %.2f\n", root2);
    } else if (discriminant == 0) {
        // 一个实根(重根)
        root1 = -b / (2 * a);
        printf("一个实根(重根):\n");
        printf("根 = %.2f\n", root1);
    } else {
        // 复根
        double realPart = -b / (2 * a);
        double imaginaryPart = sqrt(-discriminant) / (2 * a);
        printf("复根:\n");
        printf("根 1 = %.2f + %.2fi\n", realPart, imaginaryPart);
        printf("根 2 = %.2f - %.2fi\n", realPart, imaginaryPart);
    }

    return 0;
}

使用数学库编译程序:

gcc quadratic_solver.c -o quadratic_solver -lm

在不同场景下运行程序:

./quadratic_solver

示例输出(两个实根):

输入系数a: 1
输入系数b: -5
输入系数c: 6
两个不同的实根:
根1 = 3.00
根2 = 2.00

示例输出(一个实根):

输入系数a: 1
输入系数b: -2
输入系数c: 1
一个实根(重根):
根 = 1.00

示例输出(复根):

输入系数a: 1
输入系数b: 2
输入系数c: 5
复根:
根1 = -1.00 + 2.00i
根2 = -1.00 - 2.00i

代码中的关键点:

  • 使用二次公式计算根
  • 检查判别式以确定根的类型
  • 处理三种情况:两个实根、一个实根、复根
  • 使用 math.h 库中的 sqrt() 函数
  • 使用 -lm 标志编译以链接数学库

输出实根或复根

在这一步中,你将增强二次方程求解器,以提供更详细的输出,并以改进的格式处理不同类型的解。

打开现有文件并更新代码:

cd ~/project
nano quadratic_solver.c

将之前的代码替换为以下内容:

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

void printQuadraticSolutions(double a, double b, double c) {
    double discriminant = b * b - 4 * a * c;

    printf("二次方程:%.2fx² + %.2fx + %.2f = 0\n", a, b, c);
    printf("判别式:%.2f\n", discriminant);

    if (discriminant > 0) {
        double root1 = (-b + sqrt(discriminant)) / (2 * a);
        double root2 = (-b - sqrt(discriminant)) / (2 * a);

        printf("解的类型:两个不同的实根\n");
        printf("根 1: %.2f\n", root1);
        printf("根 2: %.2f\n", root2);
    } else if (discriminant == 0) {
        double root = -b / (2 * a);

        printf("解的类型:一个实根(重根)\n");
        printf("根:%.2f\n", root);
    } else {
        double realPart = -b / (2 * a);
        double imaginaryPart = sqrt(-discriminant) / (2 * a);

        printf("解的类型:共轭复根\n");
        printf("根 1: %.2f + %.2fi\n", realPart, imaginaryPart);
        printf("根 2: %.2f - %.2fi\n", realPart, imaginaryPart);
    }
}

int main() {
    double a, b, c;

    printf("二次方程求解器\n");
    printf("------------------------\n");

    printf("输入系数 a: ");
    scanf("%lf", &a);

    printf("输入系数 b: ");
    scanf("%lf", &b);

    printf("输入系数 c: ");
    scanf("%lf", &c);

    printf("\n");
    printQuadraticSolutions(a, b, c);

    return 0;
}

编译程序:

gcc quadratic_solver.c -o quadratic_solver -lm

在不同场景下运行程序:

./quadratic_solver

示例输出(两个实根):

二次方程求解器
------------------------
输入系数a: 1
输入系数b: -5
输入系数c: 6

二次方程: 1.00x² + -5.00x + 6.00 = 0
判别式: 1.00
解的类型: 两个不同的实根
根1: 3.00
根2: 2.00

示例输出(一个实根):

二次方程求解器
------------------------
输入系数a: 1
输入系数b: -2
输入系数c: 1

二次方程: 1.00x² + -2.00x + 1.00 = 0
判别式: 0.00
解的类型: 一个实根(重根)
根: 1.00

示例输出(复根):

二次方程求解器
------------------------
输入系数a: 1
输入系数b: 2
输入系数c: 5

二次方程: 1.00x² + 2.00x + 5.00 = 0
判别式: -16.00
解的类型: 共轭复根
根1: -1.00 + 2.00i
根2: -1.00 - 2.00i

主要改进点:

  • 创建了一个单独的函数 printQuadraticSolutions() 以实现更好的代码组织
  • 添加了更具描述性的输出,包括解的类型和方程细节
  • 保持了上一步相同的根计算逻辑
  • 通过添加标题和清晰的格式改进了用户界面

总结

在本实验中,你将学习如何在 C 语言中读取二次方程的输入值,计算判别式,并使用二次公式确定实根或复根。该程序会提示用户输入系数 a、b 和 c,然后计算判别式以确定根的性质。最后,程序会输出实根或复根。

本实验涵盖的关键步骤包括读取用户输入的系数、计算判别式以及应用二次公式求根。该程序还会确认输入的系数并提供计算出的解。