Vì sao đoạn code này bị lỗi khi chạy trên Linux?
Chào mọi người trong forum ạ, em là newbie đang học lập trình C, mới tham gia diễn đàn và đây là bài đăng đầu tiên nên có gì mọi người chỉ bảo nhé
Em có đoạn code sau để giải PT bậc nhất:
#include <stdio.h>
int main()
{
int a, b;
printf("Nhap a va b: ");
scanf("%d %d", &a, &b);
if (a != 0) {
printf("Nghiem cua phuong trinh la %.2lf
", -b / a);
}
else {
if (b == 0)
printf("Phuong trinh co vo so nghiem.
");
else
printf("Phuong trinh vo nghiem.
");
}
return 0;
}
Khi em biên dịch và chạy đoạn code trên bằng terminal (bằng lệnh gcc *.c -o main -Wall && ./main
) thì vẫn chạy đc nhưng kq toàn cho ra 0.00
!
Nó còn có dòng warning bảo là: format ‘%lf’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
E ko biết sửa lỗi này ntn, ai chỉ giúp e vs ạ, e tks nhiều lắm ^^
thay
Cho mình hỏi vì sao phải ép kiểu thế bạn?
Mình tưởng là biểu thức chia 2 số nguyên đặc tả
%lf
nó nhận số thực luôn chứ?Theo mình hiểu (kô qua sách vở trường lớp nào cả nên có thể sai):
Thay vì ép kiểu bạn có thể dùng như thế này (cũng tương đương ép kiểu thì phải):
Ý mình là cái đặc tả
%.2lf
hay%.2f
ấy ! Vì mình cứ tưởng là đặc tả sẽ tự format cái biểu thức ấy luônbạn đọc bài này nhé:
stackoverflow.com
using printf to print out floating values
đây nữa
Using %f to print an integer variable
printf là một hàm (function) trong C, phép gọi hàm (function call) có cú pháp là
function_name([parameter1[,parameter2[,parameter3[...]]])
trong đó các tham số (parameter) cách nhau bởi dấu phẩy
khi gọi hàm, nếu bạn đưa vào vị trí tham số 1 biểu thức (như trên), biểu thức sẽ được đánh giá rồi mới đưa vào để chạy code trong hàm. Vậy nên đặc tả trong format string không thể chi phối sự đánh giá biểu thức
-b / a
printf("Nghiem cua phuong trinh la %.2lf\n", -b / a);
sẽ được tính toán như sau:
-b / a
là phép chia của 2 số nguyên, kết quả trả về là số nguyênprintf
"%f"
nên định dạng giá trị kia là số thực (nhưng do nó là số nguyên nên định dạng số thực chỉ là thêm .00 vào sau)cách sửa:
Cách 1:
double a, b;
hoặcfloat a, b;
Cách 2:
(double)-b \ a
hoặc(float)-b \ a
Mình hiểu rồi, cảm ơn các bạn đã giúp đỡ nhiệt tình nhé