求一元二次方程的根C语言

img


无论输入任何数都显示只有一个解,换任何数字都是一样的结果是什么意思,请求解答,谢谢。

d=bb-4a*c;
这个要放在scanf下面,先输入后计算。

img

【以下回答由 GPT 生成】

问题原因: 问题的代码中,使用了整数类型(int)来存储方程的系数,而在计算中使用了sqrt函数,该函数的返回值是浮点数。由于结果类型不匹配,导致计算结果出现问题。

解决方案: 1. 将 a、b、c 的数据类型改为浮点数(float 或 double),以便与 sqrt 函数的返回值类型匹配。 2. 对输入的 a 的值进行判断,如果 a 的值为0,则无法构成一元二次方程,此时直接输出提示,并结束程序。 3. 对输入的 b、c 的值进行判断,如果 b、c 的值都为0,则方程为0 = 0,此时直接输出提示,并结束程序。 4. 对输入的 a、b、c 的值进行判断,如果 a、b、c 的值都为0,则方程为0 = 0,此时直接输出提示,并结束程序。 5. 在计算判别式 d 之前,对 a 的值进行判断,如果 a 的值为0,则直接输出提示,并结束程序。 6. 在计算根的过程中,如果 d 的值小于0,则方程无实根,此时直接输出提示,并结束程序。

修改后的代码如下:

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

int main() {
    float a, b, c;
    float d, x1, x2;

    printf("请输入a, b, c的值:\n");
    scanf("%f %f %f", &a, &b, &c);

    // 判断a的值
    if (a == 0) {
        printf("a的值不能为0\n");
        return 0;
    }

    // 判断 b、c 的值
    if (b == 0 && c == 0) {
        printf("该一元二次方程为0 = 0,有无数个解\n");
        return 0;
    }

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

    // 判断 a、b、c 的值
    if (d > 0) {
        x1 = (-b + sqrt(d)) / (2 * a);
        x2 = (-b - sqrt(d)) / (2 * a);
        printf("该一元二次方程有两个解,x1=%f,x2=%f\n", x1, x2);
    } else if (d == 0) {
        x1 = -b / (2 * a);
        x2 = x1;
        printf("该一元二次方程有唯一解,x1=x2=%f\n", x1);
    } else {
        printf("该一元二次方程无实数解\n");
    }

    return 0;
}

代码注释: - 修改了 a、b、c 的数据类型为浮点数(float 或 double)。 - 添加了对输入的 a 、b、c 的值进行判断的注释。 - 添加了对方程无解的情况进行判断的注释。 - 添加了对方程有无数个解的情况进行判断的注释。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

将scanf()里面的%f改为%d,然后将计算d的值放到scanf()语句后面,最后再第一个else if里面求根那里让-b转为float类型,将整数运算改为浮点数类型计算即可。

修改如下:

参考链接:
https://baijiahao.baidu.com/s?id=1722370687157957463&wfr=spider&for=pc


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

int main(void){
    

//    float a;
//    float b;
//    float c;
    int a;
    int b;
    int c;
    float d;
    float x1,x2;
    printf("请输入abc的值:\n");
    scanf("%d,%d,%d",&a,&b,&c);     // 因为是读取整数,所以这里%f改为%d 
    d=b*b-4*a*c;
    //printf("a=%d,b=%d,c=%d,d=%f\n",a,b,c,d);
    
    // https://baijiahao.baidu.com/s?id=1722370687157957463&wfr=spider&for=pc
    if(d>0){ // 测试例子,上面参考链接第3题 
        x1=(-b+sqrt(d))/(2*a);
        x2=(-b-sqrt(d))/(2*a);
        printf("该一元二次方程有两个解,x1=%f,x2=%f\n",x1,x2);

    }else if(d==0){ // 测试例子,上面参考链接第16题 
        x1=((float)-b)/(2*a); // 为保留小数结果,将-b转为float类型 
        x2=x1;
        printf("该一元二次方程有唯一解,x1=x2=%f\n",x1);
    }else if(d<0){  // https://qb.zuoyebang.com/xfe-question/question/aecfcb8e38f761d3fa704d540264593b.html
        printf("无解\n");
    }
    
    return 0;
    
} 

img

可以看一下,安全版本的一元二次方程:


#include <stdio.h>
#include <math.h>
 
int main() {
    float a, b, c;
    float delta, root1, root2;
 
    printf("Please enter the three coefficients of a quadratic equation with one variable:\n");
 
    // 对用户输入进行有效性检查
    if (scanf("%f %f %f", &a, &b, &c) != 3 || a == 0 || isnan(a) || isnan(b) || isnan(c)) {
        printf("Invalid input! Please enter valid coefficients.\n");
        return 1;
    }
 
    delta = b * b - 4 * a * c;
 
    if (delta > 0) {
        root1 = (-b + sqrt(delta)) / (2 * a);
        root2 = (-b - sqrt(delta)) / (2 * a);
        printf("This equation has two real roots: %.2f and %.2f\n", root1, root2);
    } else if (delta == 0) {
        root1 = root2 = -b / (2 * a);
        printf("This equation has one real root: %.2f\n", root1);
    } else {
        float realPart = -b / (2 * a);
        float imagPart = sqrt(-delta);
        printf("This equation has two complex roots: %.2f+%.2fi and %.2f-%.2fi\n", realPart, imagPart, realPart, imagPart);
    }
 
    return 0;
}