01/10/2018, 09:22

Sắp xếp mảng cấu trúc

Em có một mảng cấu trúc như ntn, dù thuật toán sắp xếp đã đúng như k hiểu sao lại k thực hiện sắp xếp.
mặc dùng dùng như thế này ở bài khác lại chạy đc. mong mọi người giúp với

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
struct ngaysinh{
	int Ngay , Thang, Nam;
};
struct sinhvien {
	int MaSV;
	char TenLop[10];
	char HoTen[30];
	float Diem;
	ngaysinh NS;//nam sinh
};
void nhap(sinhvien sv[], int &n){
	printf("Nhap so luong sinh vien:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("Nhap ma sinh vien: "); fflush(stdin); scanf("%d",&sv[i].MaSV );
		printf("Nhap ten lop: ");fflush(stdin); gets(sv[i].TenLop);
		printf("Nhap ho ten sinh vien: "); fflush(stdin); gets(sv[i].HoTen);
		printf("Nhap ngay sinh: 
	Ngay: ");scanf("%d",&sv[i].NS.Ngay);
		printf("	Thang: ");	scanf("%d",&sv[i].NS.Thang);
		printf("	Nam: "); scanf("%d",&sv[i].NS.Nam);
		printf("Nhap diem tb"); fflush(stdin);scanf("%f",&sv[i].Diem);
	}	
}

void print(sinhvien sv[], int n){
	for(int i=0;i<n;i++){
		printf("
=======================");
		printf("
ma sinh vien: %d", sv[i].MaSV );
		printf("
ten lop: %s",sv[i].TenLop);
		printf("
sinh vien: %s",sv[i].HoTen);
		printf("
ngay sinh: %d/%d/%d ",sv[i].NS.Ngay,sv[i].NS.Thang,sv[i].NS.Nam);
		printf("
diem tb: %f",sv[i].Diem);
	}
}
void selectionSort (int a[], int n){
	for(int i=0;i<n-1;i++){
		int min=i;
		for(int j=i+1;j<n;j++){
			if(a[j]<a[min]){
				min=j;
			}
			if(min!=i){
				int temp = a[i];
				a[i] =  a[min];
				a[min] = temp;
			}
		}
	}
}
void swap (sinhvien x, sinhvien y){
	sinhvien temp = x;
	x=y;
	y=temp;
}
void sortMaSinhVien(sinhvien sv[], int n){
	for(int i=0;i<n-1;i++){
		int min=i;
		for(int j=i+1;j<n;j++){
			if(sv[i].MaSV<sv[min].MaSV){
				min=j;
			}
			if(min!=i){
				swap(sv[i],sv[min]);
			}
		}
	}
}
int main(){
	sinhvien sv[100];
	int n;
	nhap(sv,n);
	
	sortMaSinhVien(sv,n);
	print(sv,n);
}
Trần Hoàn viết 11:28 ngày 01/10/2018
void swap (sinhvien x, sinhvien y){
	sinhvien temp = x;
	x=y;
	y=temp;
}

Ví dụ hàm trên chẳng hạn. Mình nghĩ là vì bạn truyền tham chiếu giá trị chứ không phải tham chiếu địa chỉ nên x, y chỉ đóng vai trò biến cục bộ, là bản sao của sv[i]sv[min], chạy xong hàm thì xy bị xoá chứ không tác động đến sv.

Nguyen Dinh viết 11:28 ngày 01/10/2018

Mặc dù loại bỏ swap đi rồi. nhưng nó vẫn không sắp xếp được bạn ah. mình cũng k hiểu sao nữa

void sortMaSinhVien(sinhvien sv[], int n){
	for(int i=0;i<n-1;i++){
		int min=i;
		for(int j=i+1;j<n;j++){
			if(sv[i].MaSV<sv[min].MaSV){
				min=j;
			}
			if(min!=i){
				sinhvien temp = sv[i];
				sv[i] = sv[min];
				sv[min] = temp;
			}
		}
	}
}
Trần Hoàn viết 11:36 ngày 01/10/2018

hàm sortMaSinhVien() bạn cũng truyền tham trị kìa
tham biến thì có & đấy
kiểu như scanf() ý, có & nên mới tác động được vào biến đầu vào.

Nguyen Dinh viết 11:33 ngày 01/10/2018
void sortMaSinhVien(sinhvien &sv[], int n){
  for(int i=0;i<n-1;i++){
		int min=i;
		for(int j=i+1;j<n;j++){
			if(sv[i].MaSV<sv[min].MaSV){
				min=j;
			}
			if(min!=i){
				swap(sv[i],sv[min]);
			}
		}
	}
}

Bị lỗi này bạn ơi

[Error] declaration of ‘sv’ as array of references
[Error] expected ‘)’ before ‘,’ token
[Error] expected unqualified-id before ‘int’

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

Thế thì ở trên mình sai rồi XD
Hóng có cao nhân nào đọc code hiểu được vấn đề giúp thớt cái.

rogp10 viết 11:25 ngày 01/10/2018

scanf không có & đó đâu nó là hàm C mà.

sv[i].MaSV<sv[min].MaSV chỗ này phải là sv[j]…

[Error] declaration of ‘sv’ as array of references

Không có tham chiếu mảng đâu mà cũng không cần vì có trỏ đi chỗ khác đâu

Trường Vũ viết 11:34 ngày 01/10/2018

sai hàm so sánh rồi, bỏ cả swap vs sort đi

Trường Vũ viết 11:33 ngày 01/10/2018

ví dụ bạn so sánh giữa các mảng dựa trên tiêu chí điểm tb thì b phải dựa vào điểm tb chứ phần so sánh kia là dùng cho mảng có một phần tử, còn mảng này của b có mấy cái liền

Nguyen Dinh viết 11:23 ngày 01/10/2018

Mình bỏ dấu & trước sinhvien sv[] rồi
còn scanf thì vẫn phải có & chứ.

với lại cái sv[min] là đúng rồi vì mình dùng thuật toán selectionSort

Nguyen Dinh viết 11:31 ngày 01/10/2018

mình chi sắp xếp theo Mã sinh viên thôi mà bạn. là cái sv[i].MaSV mà

anon71098895 viết 11:27 ngày 01/10/2018

#include<stdio.h> #include<conio.h> int so1,so2,kq; int main(); { kq= (so1+so2); printf("Nhap 2 so"); scanf(%d,&so1); scanf(%d,&so2); scanf(%d,&kq); printf("Tong 2 so la:%d",kq); _getch(); }

bi loi [Error] expected unqualified-id before '{' token la sao anh? tks a

rogp10 viết 11:34 ngày 01/10/2018

Bạn vui lòng lập thớt mới. Đây chỉ là lỗi cú pháp.

anon71098895 viết 11:38 ngày 01/10/2018

Ban ko tra loi o day dc ha ban, ban giup minh duoc k?

Bài liên quan
0