Cần giải đáp sự khác biệt trong 2 trường hợp dùng printf

Mình chỉ thay đổi cách thức ở lệnh printf cuối hai đoạn code mà không thay đổi gì ở biểu thức nhưng khi chạy kết quả lại có sự khác biệt về giá trị, mình nhập giá trị lần lượt là 2 4 6

Gán cho biến rồi mới đưa vào printf

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

int main()
{
    float a, b, c, d, r1, r2;
    printf("Nhap he so a:");scanf("%f",&a);
    printf("Nhap he so b:");scanf("%f",&b);
    printf("Nhap he so c:");scanf("%f",&c);
    if (a==0)
    {
        printf("\nPhuong trinh co bac la 1\n");
        if (b!=0)
            printf("Co mot nghiem: %.2f\n", -c/b);
        else
            if (c==0)
                printf("Co vo so nghiem\n");
            else
                printf("Vo nghiem\n");
    }
    else
    {
        printf("\nPhuong trinh co bac la 2\n");
        d = b*b-4*a*c;
        if (d=0)
            printf("Co nghiem kep: %f",-b/2*a);
        else if (d>0)
            printf("Co 2 nghiem thuc: %f va %f", -b+sqrt(d)/2*a, -b-sqrt(d)/2*a);
        else
            r1 = -b/(2*a);
            r2 = sqrt(-d)/(2*a);
            printf("Co 2 nghiem phuc: %.0f + %.1fi and %.0f - %.1fi", r1, r2, r1, r2);
    }
}

Không dùng biến, tính trực tiếp trong printf:

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

int main()
{
    float a, b, c, d;
    printf("Nhap he so a:");scanf("%f",&a);
    printf("Nhap he so b:");scanf("%f",&b);
    printf("Nhap he so c:");scanf("%f",&c);
    if (a==0)
    {
        printf("\nPhuong trinh co bac la 1\n");
        if (b!=0)
            printf("Co mot nghiem: %.2f\n", -c/b);
        else
            if (c==0)
                printf("Co vo so nghiem\n");
            else
                printf("Vo nghiem\n");
    }
    else
    {
        printf("\nPhuong trinh co bac la 2\n");
        d = b*b-4*a*c;
        if (d=0)
            printf("Co nghiem kep: %f",-b/2*a);
        else if (d>0)
            printf("Co 2 nghiem thuc: %f va %f", -b+sqrt(d)/2*a, -b-sqrt(d)/2*a);
        else
            printf("Co 2 nghiem phuc: %.0f + %.1fi and %.0f - %.1fi", -b/(2*a), sqrt(-d)/(2*a), -b/(2*a), sqrt(-d)/(2*a));
    }
}

Trong code thứ nhất, bạn chưa biết dấu của d như thế nào mà đã tính sqrt(-d) thì làm sao đảm bảo được chương trình không gặp lỗi?

Chưa kể bạn input số nguyên (nhập 2, 4, 6) mà chia trực tiếp (-c/b) kết quả còn có thể bị sai nữa.

1 Like

Bạn nói đúng, nhưng mình nghĩ trong trường hợp 2 4 6, d âm, nghiệm phức thì code này chạy đc, và mình xây dựng 2 đoạn trên vấn đề chính là ở lệnh printf cuối cùng…mình sẽ sửa lại

Cái này mình không hiểu ý bạn

Khác biệt về giá trị như thế nào? Mình đã test nhưng vẫn chưa thấy khác biệt.
Với lại, giữa 2 đoạn code tương tự nhau, vui lòng chỉ rõ điểm khác biệt để người giúp đỡ có thể tập trung đúng trọng tâm. Trong trường hợp này, 2 đoạn code có thể gộp lại thành:

           printf("Co 2 nghiem phuc: %lf + %lfi and %lf - %lfi\n", r1, r2, r1, r2);
           printf("Co 2 nghiem phuc: %lf + %lfi and %lf - %lfi\n",
                -b/(2*a), sqrt(-d)/(2*a), -b/(2*a), sqrt(-d)/(2*a));

Lưu ý: đã đổi float thành double để giảm sai số và vì hàm sqrt dùng kiểu double và trả về double.

Đoạn else tính nghiệm phức cũng không bỏ vào {} nữa.
Làm ăn sống nhăn, làm tôi ngồi debug quá trời :expressionless: nghiệm phức nhưng không có phần ảo, tính kiểu nào cũng ra cả phần nghiệm phức.

Ơ, hình như khác biệt là do không đóng ngoặc chỗ else, tính r1, r2 nhưng không cho đoạn code đó vào ngoặc nên nó luôn thực thi chứ gì :smiley:

2 Likes

Gán luôn d=0. Chán quá đi cơ.

1 Like

Tổng kết:

Lỗi của mình là sai ở việc dùng dấu “=”, mà ban đầu lúc chưa sửa lại.
2 dòng này:

r1 = -b/(2*a);
r2 = sqrt(-d)/(2*a);

Mình đặt trên dòng này:

printf("\nPhuong trinh co bac la 2\n");

Nên lỗi dùng dấu bằng không ảnh hưởng tới kết quả ở cách làm 1
và ở cách 2 thì có…Nó làm 2 kết quả khác nhau mà mình lại chỉ nhìn printf mà nói chuyện…
Lần sau trước khi hỏi bài mình phải nhìn nó kĩ hơn nữa mới được.
Cảm ơn các bạn

Trong C tránh dùng printf 1 đối số bạn ơi…

1 Like

Đúng vậy, bởi vì có thể bị gài printf("%s"); và thế là hỏng stack. Dùng puts chuẩn hơn.

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