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

#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: \n\tNgay: ");scanf("%d",&sv[i].NS.Ngay);
		printf("\tThang: ");	scanf("%d",&sv[i].NS.Thang);
		printf("\tNam: "); 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("\n=======================");
		printf("\nma sinh vien: %d", sv[i].MaSV );
		printf("\nten lop: %s",sv[i].TenLop);
		printf("\nsinh vien: %s",sv[i].HoTen);
		printf("\nngay sinh: %d/%d/%d ",sv[i].NS.Ngay,sv[i].NS.Thang,sv[i].NS.Nam);
		printf("\ndiem 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);
}
1 Like

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] và sv[min], chạy xong hàm thì x và y bị xoá chứ không tác động đến sv.

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;
			}
		}
	}
}

hàm sortMaSinhVien() bạn cũng truyền tham trị kìa :smiley:
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.

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’

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.

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

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

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

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

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

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

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

#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

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

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

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