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]sv[min], chạy xong hàm thì xy 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?