01/10/2018, 09:41

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 ^^

Dark.Hades viết 11:55 ngày 01/10/2018

thay

-b / a 
thành
(double) -b / a
Nguyễn Thanh Việt viết 11:47 ngày 01/10/2018

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ứ?

Dark.Hades viết 11:44 ngày 01/10/2018

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;
Nguyễn Thanh Việt viết 11:52 ngày 01/10/2018

nó không hoàn toàn chuyển đổi kiểu dữ liệu được.

Ý 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

Dark.Hades viết 11:53 ngày 01/10/2018

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

stackoverflow.com
Kerrek SB

using printf to print out floating values

c, pointers, printf
answered by Kerrek SB on 06:42PM - 03 Sep 11

đây nữa

stackoverflow.com
Prateek

Using %f to print an integer variable

c
asked by Prateek on 04:09PM - 26 Jul 12
Chế Tiệp Chân Khoa viết 11:57 ngày 01/10/2018
printf("Nghiem cua phuong trinh la %.2lf\n", -b / a);

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

Trần Hoàn viết 11:54 ngày 01/10/2018

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

Nguyễn Thanh Việt viết 11:48 ngày 01/10/2018

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

Bài liên quan
0