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é :slight_smile:

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\n", -b / a);
	}
	else {
		if (b == 0)
			printf("Phuong trinh co vo so nghiem.\n");
		else
			printf("Phuong trinh vo nghiem.\n");
	}
	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

-b / a 
thành
(double) -b / a

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):

  1. có thể do trình biên dịch
  2. a và b ban đầu là int thì thực hiện phép tính chỉ có thể ra int nếu không ép kiểu cho nó, printf chỉ là loại hiển thị dữ liệu thôi, nó không hoàn toàn chuyển đổi kiểu dữ liệu được.

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):

double n = -b / a;
2 Likes

Ý 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ôn :slight_smile:

bạn đọc bài này nhé:

đây nữa

2 Likes

printf là một hàm (function) trong C, phép gọi hàm (function call) có cú pháp là :slight_smile:
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

2 Likes

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ên
  • sau khi tính toán, kết quả này được trả về làm tham số cho hàm printf
  • khi in ra, hàm printf có tham số "%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ặc float a, b;
Cách 2: (double)-b \ a hoặc (float)-b \ a

4 Likes

Mình hiểu rồi, cảm ơn các bạn đã giúp đỡ nhiệt tình nhé :smiley:

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