uippvv 2024-06-13 00:05 采纳率: 68.8%
浏览 4

c语言求一元二次方程

img

img

img

是哪里错啦哪里错啦 不管输入多大数字都只会输出两个相等的根,!

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-13 00:05
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,主要的问题在于条件语句的书写不正确以及部分逻辑处理上的疏漏。以下是修改后的代码,解决了上述问题,并且包含了完整的逻辑处理:

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        float a, b, c, x1, x2, delta;
        
        printf("请输入a,b,c的值:");
        scanf("%f %f %f", &a, &b, &c);
        
        delta = b * b - 4 * a * c;
    
        // 处理a=0的情况
        if (a == 0) {
            if (b != 0) {
                printf("不是二次方程,而是一次方程\n");
                x1 = -c / b;
                printf("x = %f\n", x1);
            } else {
                printf("既非二次也非一次方程,而是常数方程\n");
                if (c == 0) {
                    printf("所有实数都是解\n");
                } else {
                    printf("无解\n");
                }
            }
        }
        // 处理a!=0的情况
        else {
            if (delta > 0) {
                x1 = (-b - sqrt(delta)) / (2 * a);
                x2 = (-b + sqrt(delta)) / (2 * a);
                printf("有两个不等的实根:x1 = %f, x2 = %f\n", x1, x2);
            } else if (delta == 0) {
                x1 = -b / (2 * a);
                printf("有两个相等的实根:x1 = x2 = %f\n", x1);
            } else { // delta < 0
                float realPart = -b / (2 * a);
                float imaginaryPart = sqrt(-delta) / (2 * a);
                printf("有两个共轭复根:x1 = %f + %fi, x2 = %f - %fi\n", realPart, imaginaryPart, realPart, imaginaryPart);
            }
        }
    
        return 0;
    }
    

    修改说明

    1. 条件判断if(a=0) 应改为 if(a==0),因为 = 是赋值操作符,而 == 是比较操作符。
    2. 浮点数比较:对于浮点数的直接比较(如 delta == 0)应该避免,因为浮点运算可能存在精度误差。但在本例中,由于我们只关心 delta 是否严格等于零,直接使用 == 是可以接受的。
    3. 逻辑分支完善:添加了对 a==0 的额外处理,包括当 bc 也等于零的情况。
    4. 代码结构清晰化:将不同情况下的输出逻辑进行了分类和优化。

    请使用这段代码进行测试,它应该能正确处理所有提到的一元二次方程的四种情况。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月13日