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));
}
}
Bài liên quan
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.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:
Lưu ý: đã đổi
float
thànhdouble
để giảm sai số và vì hàm sqrt dùng kiểudouble
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 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ínhr1
,r2
nhưng không cho đoạn code đó vào ngoặc nên nó luôn thực thi chứ gìGán luôn d=0. Chán quá đi cơ.
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:
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…
Đúng vậy, bởi vì có thể bị gài
printf("%s");
và thế là hỏng stack. Dùngputs
chuẩn hơn.