01/10/2018, 14:19

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("
Phuong trinh co bac la 1
");
        if (b!=0)
            printf("Co mot nghiem: %.2f
", -c/b);
        else
            if (c==0)
                printf("Co vo so nghiem
");
            else
                printf("Vo nghiem
");
    }
    else
    {
        printf("
Phuong trinh co bac la 2
");
        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("
Phuong trinh co bac la 1
");
        if (b!=0)
            printf("Co mot nghiem: %.2f
", -c/b);
        else
            if (c==0)
                printf("Co vo so nghiem
");
            else
                printf("Vo nghiem
");
    }
    else
    {
        printf("
Phuong trinh co bac la 2
");
        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));
    }
}
HK boy viết 16:34 ngày 01/10/2018

kết quả lại có sự khác biệt về giá trị

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.

Willer viết 16:21 ngày 01/10/2018

bạn chưa biết dấu của d như thế nào mà đã tính sqrt(-d)

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

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.

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

Khoa NTA viết 16:19 ngày 01/10/2018

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.

if (d=0)

Đ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 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ì

HK boy viết 16:24 ngày 01/10/2018

if (d=0)

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

Willer viết 16:32 ngày 01/10/2018

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

Jacaré Junior viết 16:22 ngày 01/10/2018

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

rogp10 viết 16:33 ngày 01/10/2018

Đú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.

Bài liên quan
0