30/09/2018, 19:49

Hỏi về con trỏ trong c, hàm hoán vị không chạy

em viết chương trình về mảng cấu trúc phân số dùng con trỏ, Sau khi nhập thì sắp xếp mảng giảm dần. Nhưng không hiểu sao hàm hoán vị không chạy. mong mọ người giúp đỡ.

void hoanvi(PhanSo *a, PhanSo *b)
{
	PhanSo temp;
	temp = *b;
	*b = *a; 
	*a = temp;
}

void sapxepMang(PhanSo *a, int n)
{
	for(int i = 0; i < n - 1; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			if(((float)((a+i)->iTu/(a+i)->iMau)) < ((float)((a+j)->iTu / (a+j)->iMau)))
				hoanvi(a+i, a+j);
		}
	}
	xuatMang(a, n);
}
PhởCode viết 22:00 ngày 30/09/2018

a là một biến con trỏ chứ đâu phải một mảng đâu mà bạn truyền như thế?

Ví dụ a là một mảng như thế này PhanSo a[10]; thì được nè.

yoyo viết 21:52 ngày 30/09/2018

Kiểu Phanso của bạn là gì, nếu không phải kiểu chuẩn của C thì bạn không thể dùng phép gán = được. Nếu bạn khai báo đó là một struct, tương đương với một vùng nhớ trong C, C sẽ không hiểu vùng nhớ này bằng vùng nhớ kia được. Bạn phải dùng hàm memcpy để copy vùng nhớ.

Gió viết 22:05 ngày 30/09/2018

Không phải hàm hoánvi không hoạt động mà chỗ so sánh không đúng
Có thể sửa lại:
if (1.0a[i].tu/ a[i].mau >1.0 a[j].tu/ a[j].mau)
hoanvi(a+i,a+j);

Tý Tèo viết 21:58 ngày 30/09/2018

Hàm hoanVi đúng rồi. Mình nghĩ sẽ ở chỗ if(((float)((a+i)->iTu/(a+i)->iMau)) < ((float)((a+j)->iTu / (a+j)->iMau))) ấy. Không biết chi tiết code bạn sao nên mình cũng không rõ được

Bạn nên viết một hàm so sánh riêng trả về boolean để dễ tìm và fix lỗi, code cũng gọn hơn nữa

Tý Tèo viết 22:05 ngày 30/09/2018

Con trỏ hoàn toàn có thể sử dụng như mảng mà bạn. a chứa địa chỉ của phần tử a[0]. Khi đó nếu sử dụng a[i] để truy xuất đến phần tử i thì nó sẽ trả về vị trí của a[0] + i * n (byte) - n tùy thuộc vào kiểu dữ liệu.Từ đó ta có thể truy xuất được đến các phần tử. Chỉ cần trước đó ta đã cấp phát cho con trỏ a là được

PhởCode viết 22:01 ngày 30/09/2018

uh mình biết nhưng mình đoán là bạn ấy không sử dụng làm mảng nên mới bị lỗi. mà bạn ấy cũng ko nói rõ bị lỗi gì nên mình đoán vậy thôi.

Lâm Khả Hân viết 21:57 ngày 30/09/2018

Hàm của mình bị sai chỗ if như bạn trên nói mình đã sửa được rồi. Xin cảm ơn

Bài liên quan
0