Giải thích hộ mình lỗi trong code Giải phương trình bậc 2

Vì sao khi mình nhập 0,0,0 vào thì nó vừa hiện lên Vô số nghiệm, vừa hiện lên x1, và x2 nhỉ ?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float a,b,c,x,x1,x2,D;
printf("Nhap a: ");
scanf("%f", &a);
printf("Nhap b: ");
scanf("%f", &b);
printf("Nhap c: ");
scanf("%f", &c);

if (a==0)
    {if (b==0)
        {if (c==0)
            printf("Vo so nghiem\n");
        else printf("Vo nghiem 01\n");}
    else printf("x = %f\n", -b/a);}
else D=b*b-4*a*c;
    {if (D<0)
        printf("Vo nghiem 02\n");
    else
       {
        if (D==0) printf("Nghiem kep x = %f\n", -b/(2*a));
        else
            x1 = (-b-sqrt(D))/(2*a);
            x2 = (-b+sqrt(D))/(2*a);
            printf("x1 = %f\n", x1);
            printf("x2 = %f\n", x2);
       }
    }

    return 0;
}

Chỉ sai có 1 chỗ:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
float a,b,c,x,x1,x2,D;
printf("Nhap a: ");
scanf("%f", &a);
printf("Nhap b: ");
scanf("%f", &b);
printf("Nhap c: ");
scanf("%f", &c);

if (a==0){
    if (b==0){
        if (c==0){
            printf("Vo so nghiem\n");
        }else{
            printf("Vo nghiem 01\n");
        }
    }else{
        printf("x = %f\n", -b/a);
    }
}else{ // <--Dấu ngoặc nhọn
    D=b*b-4*a*c;    //Chỗ này
    if (D<0){
        printf("Vo nghiem 02\n");
    }else{
        if (D==0){
            printf("Nghiem kep x = %f\n", -b/(2*a));
        }else{
            // Nếu không bao ngoặc nhọn
            // chỗ này thì khi nghiệm kép,
            // x1 và x2 vẫn được in ra.
            x1 = (-b-sqrt(D))/(2*a);
            x2 = (-b+sqrt(D))/(2*a);
            printf("x1 = %f\n", x1);
            printf("x2 = %f\n", x2);
       }
    }
 }

return 0;
}

Bạn viết mã nhìn rối mắt quá, ở dấu { và }. Chính vì thế mà bạn làm sai.
Dù biểu thức đó có 1 dòng thì bạn cũng nên để nó trong cặp { }. 1: Dễ nhìn; 2: Sau này có muốn vài dòng nữa thì cũng dễ, không xảy ra lỗi ngoài ý muốn.
Xem cách mình sửa lại.

3 Likes

Thanks bạn nhiều nhé, mình biết rồi, mình sẽ sửa nhé.

bạn nên sửa code lại, rất khó đọc, bạn có thế sử dụng switch - case

1 Like

Chỉ dùng khi kiểm tra với nhiều case thôi :slight_smile: chứ chọn giữa == hay != thì switch còn dài hơn.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?