Code sắp xếp không chạy

Mình Đang làm bài quản lý sinh viên có mục sắp xếp bằng các thuật toán chọn, chèn, trộn, nhanh cho danh sách sinh viên. Nhưng đến phần sắp xếp chọn mình chạy thử lại không thấy sắp xếp. Mọi người cho mình ý kiến với!

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

const char *FNAME = "Data.txt";		//char FNAME[] = "Data.txt";

typedef struct
{
	char HoVaTen[50], MaLop[10], MaSinhVien[10];
	float Diem;
	struct NgaySinh
	{
		int ngay, thang, nam;
	} ns;
} SinhVien;

int NhapHoSo(SinhVien sv[], int *n);
int LuuDanhSach(SinhVien sv[], int n);
int InDanhSach(SinhVien sv[], int n);
int SXChon(char khoa, SinhVien sv[], int n);
int SXChen(char khoa);
int SXNhanh(char khoa);
int SXTron(char khoa);
int TKTuanTu(char khoa, SinhVien sv[], int n);
int TKNhiPhan(char khoa);
int LopSoLuong();
int PhanLoaiKetQua();

char Menu()
{
	system("cls");
	printf("\n\n==================== CHUONG TRINH QUAN LY SINH VIEN ====================\n\n\n");
	printf("\t\t\t1. Them Moi Ho So\n\n");
	printf("\t\t\t2. In Danh Sach\n\n");
	printf("\t\t\t3. Sap Xep\n\n");
	printf("\t\t\t4. Tim kiem\n\n");
	printf("\t\t\t5. Thong Ke\n\n");
	printf("\t\t\t6. Thoat\n\n");
	getch();
}

int NhapHoSo(SinhVien sv[], int *n) //tro den o nho can lay gia tri
{
	int  i, j;
	system("cls");
	printf("\n\n==================== MOI BAN NHAP THONG TIN SINH VIEN ====================\n\n\n");
	printf("\t\t\tSo Sinh Vien Can Them: ");
	scanf("%d", &*n);
	for(i = 0; i < *n; i++)
	{
		printf("\t\t\tSinh Vien %d\n", i + 1);
		fflush(stdin);
		printf("\t\t\tMa Lop: ");
		gets(sv[i].MaLop);
		printf("\t\t\tMa Sinh Vien: ");
		gets(sv[i].MaSinhVien);
		fflush(stdin);
		printf("\t\t\tHo Va Ten: ");
		gets(sv[i].HoVaTen);
//		while(sv.HoVaTen[0] == ' ')
//		{
//			for(i = 0; i < strlen(sv.HoVaTen); i++)
//				sv.HoVaTen[i] = sv.HoVaTen[i + 1];
//		}
//		i = 0;
//		while(i < strlen(sv.HoVaTen))
//		{
//			if(sv.HoVaTen[i] == ' ' && sv.HoVaTen[i + 1] == ' ')
//			{
//				for(j = i; j < strlen(sv.HoVaTen); j++)
//					sv.HoVaTen[j] = sv.HoVaTen[j + 1];
//				i--;
//			}
//			i++;
//		}
//		while(sv.HoVaTen[strlen(sv.HoVaTen) - 1] == ' ')
//			sv.HoVaTen[strlen(sv.HoVaTen)-1] = '\0';
//		strlwr(sv.HoVaTen);
//		sv.HoVaTen[0] = toupper(sv.HoVaTen[0]);
//		for(i = 0; i < strlen(sv.HoVaTen); i++)
//		{
//			if(sv.HoVaTen[i] == ' ') 
//				sv.HoVaTen[i + 1] = toupper(sv.HoVaTen[i + 1]);
//		}
		printf("\t\t\tNgay Thang Nam Sinh: \n");
		do {
			printf("\t\t\t\tNgay: ");
			scanf("%d", &sv[i].ns.ngay);
			if((sv[i].ns.ngay < 1)||(sv[i].ns.ngay > 31)) 
				printf("\t\t\t\tNGAY SINH KHONG HOP LE!!\n");
		} while((sv[i].ns.ngay < 1)||(sv[i].ns.ngay > 31));
		do {
			printf("\t\t\t\tThang: ");
			scanf("%d", &sv[i].ns.thang);
			if((sv[i].ns.thang < 1)||(sv[i].ns.thang > 12))
				printf("\t\t\t\tTHANG SINH KHONG HOP LE!!\n");
		} while((sv[i].ns.thang < 1)||(sv[i].ns.thang > 12));
		do {
			printf("\t\t\t\tNam: ");
			scanf("%d", &sv[i].ns.nam);
			if((sv[i].ns.nam < 1900)||(sv[i].ns.nam > 2016))
				printf("\t\t\tNAM SINH KHONG HOP LE!!\n");
		} while((sv[i].ns.nam < 1900)||(sv[i].ns.nam > 2016));
		do {
		printf("\t\t\tDiem Trung Binh Tich Luy: ");
		scanf("%f", &sv[i].Diem);
		if((sv[i].Diem < 0)||(sv[i].Diem > 10))
			printf("\t\t\tDIEM TRUNG BINH TICH LUY KHONG HOP LE!!\n");
		} while((sv[i].Diem < 0)||(sv[i].Diem > 10));
		printf("\n");
	}
	printf("\t\tLUU DU LIEU THANH CONG! NHAN PHIM BAT KI DE TIEP TUC!");

	getch();
	return 0;
}
int LuuDanhSach(SinhVien sv[], int n)
{
	int i;
	FILE *f = fopen(FNAME,"a");
	if (f==NULL)
	{
        printf("FILE ERROR ");
        exit(1);
    }
    for(i = 0; i < n; i++)
    {
    	fprintf(f, "|  %s  |  %s  |  %s  |  %d/%d/%d  |  %f  |\n", sv[i].MaLop, sv[i].MaSinhVien, sv[i].HoVaTen, sv[i].ns.ngay, sv[i].ns.thang, sv[i].ns.nam, sv[i].Diem);
		fprintf(f, "----------------------------------------------------------------------\n");
	}
	fclose(f);
	return 0;
}
int InDanhSach(SinhVien sv[], int n) 
{
	system("cls");
	char kitu[1000];
	printf("\n\n\t==================== DANH SACH SINH VIEN ====================\n\n\n");
	printf("|   Lop   | Ma Sinh Vien |     Ho Va Ten     |   Ngay Sinh   | DTBTL |\n");
	printf("=====================================================================\n");
	FILE *p;
	p = fopen(FNAME, "r");
	while (fgets(kitu, 1000, p) != NULL)
	{
		printf("%s", kitu);
	}
	printf("\nNhan Phim Bat Ki De Tiep Tuc!");
	fclose(p);
	return 0;
}
int SapXep(SinhVien sv[], int n)
{
	system("cls");
	printf("\n\n==================== CHON PHUONG PHAP SAP XEP ====================\n\n\n");
	printf("\t\t\ta. Selection Sort\n\n");
	printf("\t\t\tb. Insertion Sort\n\n");
	printf("\t\t\tc. Quick Sort\n\n");
	printf("\t\t\td. Merge Sort\n\n");
	printf("\t\t\te. Quay Lai\n\n");
	char sx;
	do
	{
		sx=getch();
	} while (!((sx=='a')||(sx=='b')||(sx=='c')||(sx=='d')||(sx=='e')));
	if (sx=='e') return 0;
	switch(sx)
	{
		case 'a':
			system("cls");
			printf("\n\t******************");
			printf("\n\t* SELECTION SORT *");
			printf("\n\t******************\n");
			SXChon(sx, sv, n);
			break;
		case 'b':
			system("cls");
			printf("\n\t******************");
			printf("\n\t* INSERTION SORT *");
			printf("\n\t******************\n");
			SXChen(sx);
			break;
		case 'c':
			system("cls");
			printf("\n\t******************");
			printf("\n\t*   QUICK SORT   *");
			printf("\n\t******************\n");
			SXNhanh(sx);
			break;
		case 'd':
			system("cls");
			printf("\n\t******************");
			printf("\n\t*   MERGE SORT   *");
			printf("\n\t******************\n");
			SXTron(sx);
			break;
	}
	getch();
	return 0;
}
int SXChon(char khoa, SinhVien sv[], int n)
{
	printf("\n\t\tCHON KHOA DE SAP XEP\n\n");
	printf("\t\ta. Ma Sinh Vien\n\n");
	printf("\t\tb. Ho Va Ten\n\n");
	printf("\t\tc. Ngay Sinh\n\n");
	printf("\t\td. Diem TBTL\n\n");
	printf("\t\te. Tro lai\n");
	do
	{
		khoa = getch();
	}
	while (!((khoa == 'a')||(khoa == 'b')||(khoa == 'c')||(khoa == 'd')||(khoa == 'e')));
	if(khoa == 'e')
		return 0;
	int i, j;
	switch(khoa)
	{
		case 'a':
			system("cls");
			printf("\n\t\tSap Xep Theo Ma Sinh Vien!\n\n");
			for(i = 0; i < n - 1; i ++) {
				for( j = i + 1; j < n; j++) {
					if(sv[i].MaSinhVien > sv[j].MaSinhVien)
					{
						SinhVien a;
						a = sv[i];
						sv[i] = sv[j];
						sv[j] = a;
					}
				}
			}
			break;
		case 'b':
			system("cls");
			printf("\n\t\tSap Xep Theo Ho Va Ten!\n\n");
			for (i = 0; i < n - 1; i++) {
        		for (j = i + 1 ; j < n; j++) {
            		if (strcmp(sv[i].HoVaTen,sv[j].HoVaTen)>0) {
                		SinhVien b;
                		b = sv[i];
                		sv[i] = sv[j];
                		sv[j] = b;
            		}
        		}
    		}
    		InDanhSach(sv, n);
			break;
		case 'c':
			system("cls");
			printf("\n\t\tSap Xep Theo Ngay Sinh!\n\n");
			break;
		case 'd':
			system("cls");
			printf("\n\t\tSap Xep Theo DTBTL!\n\n");
			for(i = 0; i < n - 1; i++) {
				for(j = i + 1; j < n; j++) {
					if(sv[i].Diem > sv[j].Diem) {
						SinhVien d;
						d = sv[i];
						sv[i] = sv[j];
						sv[j] = d;
					}
				}
			}
			InDanhSach(sv, n);
			break;
	}
	InDanhSach(sv, n);
	getch();
	return 0;
}
int SXChen(char khoa)
{
	printf("\n\t\tCHON KHOA DE SAP XEP\n\n");
	printf("\t\ta. Ma Sinh Vien\n\n");
	printf("\t\tb. Ho Va Ten\n\n");
	printf("\t\tc. Ngay Sinh\n\n");
	printf("\t\td. Diem TBTL\n\n");
	printf("\t\te. Tro lai\n");
	do
	{
		khoa = getch();
	}
	while (!((khoa == 'a')||(khoa == 'b')||(khoa == 'c')||(khoa == 'd')||(khoa == 'e')));
	if(khoa == 'e')
		return 0;
	switch(khoa)
	{
		case 'a':
			system("cls");
			printf("\n\t\tSap Xep Theo Ma Sinh Vien!\n\n");
			break;
		case 'b':
			system("cls");
			printf("\n\t\tSap Xep Theo Ho Va Ten!\n\n");
			break;
		case 'c':
			system("cls");
			printf("\n\t\tSap Xep Theo Ngay Sinh!\n\n");
			break;
		case 'd':
			system("cls");
			printf("\n\t\tSap Xep Theo DTBTL!\n\n");
			break;
	}
	getch();
	return 0;
}
int SXNhanh(char khoa)
{
	printf("\n\t\tCHON KHOA DE SAP XEP\n\n");
	printf("\t\ta. Ma Sinh Vien\n\n");
	printf("\t\tb. Ho Va Ten\n\n");
	printf("\t\tc. Ngay Sinh\n\n");
	printf("\t\td. Diem TBTL\n\n");
	printf("\t\te. Tro lai\n");
	do
	{
		khoa = getch();
	}
	while (!((khoa == 'a')||(khoa == 'b')||(khoa == 'c')||(khoa == 'd')||(khoa == 'e')));
	if(khoa == 'e')
		return 0;
	switch(khoa)
	{
		case 'a':
			system("cls");
			printf("\n\t\tSap Xep Theo Ma Sinh Vien!\n\n");
			break;
		case 'b':
			system("cls");
			printf("\n\t\tSap Xep Theo Ho Va Ten!\n\n");
			break;
		case 'c':
			system("cls");
			printf("\n\t\tSap Xep Theo Ngay Sinh!\n\n");
			break;
		case 'd':
			system("cls");
			printf("\n\t\tSap Xep Theo DTBTL!\n\n");
			break;
	}
	getch();
	return 0;
}
int SXTron(char khoa)
{
	printf("\n\t\tCHON KHOA DE SAP XEP\n\n");
	printf("\t\ta. Ma Sinh Vien\n\n");
	printf("\t\tb. Ho Va Ten\n\n");
	printf("\t\tc. Ngay Sinh\n\n");
	printf("\t\td. Diem TBTL\n\n");
	printf("\t\te. Tro lai\n");
	do
	{
		khoa = getch();
	}
	while (!((khoa == 'a')||(khoa == 'b')||(khoa == 'c')||(khoa == 'd')||(khoa == 'e')));
	if(khoa == 'e')
		return 0;
	switch(khoa)
	{
		case 'a':
			system("cls");
			printf("\n\t\tSap Xep Theo Ma Sinh Vien!\n\n");
			break;
		case 'b':
			system("cls");
			printf("\n\t\tSap Xep Theo Ho Va Ten!\n\n");
			break;
		case 'c':
			system("cls");
			printf("\n\t\tSap Xep Theo Ngay Sinh!\n\n");
			break;
		case 'd':
			system("cls");
			printf("\n\t\tSap Xep Theo DTBTL!\n\n");
			break;
	}
	getch();
	return 0;
}
int TimKiem(SinhVien sv[], int n)
{
	char ch;
	system("cls");
	printf("\n\n==================== CHON PHUONG PHAP TIM KIEM ====================\n\n\n");
	printf("\t\ta. Tuan Tu\n\n");
	printf("\t\tb. Nhi Phan\n\n");
	printf("\t\tc. Tro lai\n");
	do
	{
		ch=getch();
	} while (!((ch=='a')||(ch=='b')||(ch=='c')));
	if (ch=='c') return 0;
	switch (ch)
	{	
		case 'a': 
			system("cls");
			printf("\n\t********************");
			printf("\n\t* TIM KIEM TUAN TU *"); 
			printf("\n\t********************\n");
			TKTuanTu(ch, sv, n);
			break;
		case 'b': 
			system("cls");
			printf("\n\t*********************");
			printf("\n\t* TIM KIEM NHI PHAN *"); 
			printf("\n\t*********************\n");
			break;
		default:
			printf("NHAP SAI! MOI NHAP LAI!");
			getch();
	}
	getch();
	return 0;
}
int TKTuanTu(char khoa, SinhVien sv[], int n)
{
	system("cls");
	printf("\n\t\tCHON KHOA DE TIM KIEM\n\n");
	printf("\t\ta. Ma Sinh Vien\n\n");
	printf("\t\tb. Ho Va Ten\n\n");
	printf("\t\tc. Ngay Sinh\n\n");
	printf("\t\td. DTBTL\n\n");
	printf("\t\te. Tro Lai \n\n");
	do
	{
		khoa = getch();
	}
	while (!((khoa == 'a')||(khoa == 'b')||(khoa == 'c')||(khoa == 'd')||(khoa == 'e')));
	if(khoa == 'e')
		return 0;
	switch(khoa) {
		case 'a':
			char msv[50];
			printf("\t\tTim Kiem Theo Ma Sinh Vien\n\n");
			printf("Moi Nhap Ma Sinh Vien: ");
			gets(msv);
			break;
		case 'b':
			char hvt[50];
			printf("\t\tTim Kiem Theo Ho Va Ten\n\n");
			printf("Moi Nhap Ho Va Ten: ");
			gets(hvt);
			break;
		case 'c':
			int d, m, y;
			printf("Tim Kiem Theo Ngay Sinh\n\n");
			printf("Moi Nhap Ngay Thang Nam Sinh: ");
			printf("\nNgay: ");
			scanf("%d", &d);
			printf("\nThang: ");
			scanf("%d", &m);
			printf("\nNam: ");
			scanf("%d", &y);
			break;
		case 'd':
			float diem;
			printf("Tim Kiem Theo DTBTL\n\n");
			printf("Moi Nhap DTBTL: ");
			scanf("%f", &diem);
			break;
		default:
			printf("NHAP SAI! MOI NHAP LAI!");
	}
	getch();
	return 0;
}
int TKNhiPhan(char khoa)
{
}
int ThongKe()
{
	char ch;
	system("cls");
	printf("==================== THONG KE BAO CAO ====================\n\n\n");
	printf("\t\ta. Lop - So Luong Sinh Vien\n\n");
	printf("\t\tb. Phan Loai Ket Qua Hoc Tap\n\n");
	printf("\t\tc. Tro lai\n\n");
	do
	{
		ch=getch();
	} while (!((ch=='a')||(ch=='b')||(ch=='c')));
	if (ch=='c') return 0;
	switch (ch)
	{	
		case 'a': LopSoLuong(); break;
		case 'b': PhanLoaiKetQua(); break;
	}
	return 0;
}
int LopSoLuong()
{
	return 0;
}
int PhanLoaiKetQua()
{
	return 0;
}
int main()
{
	SinhVien sv[100];
	int n;
	char mn = 0;
	do
	{
		mn = Menu();
		switch(mn)
		{
			case '1':	NhapHoSo(sv, &n);	LuuDanhSach(sv, n); break;
			case '2':	InDanhSach(sv, n);	break;
			case '3':	SapXep(sv, n);	break;
			case '4':	TimKiem(sv, n);		break;
			case '5':	ThongKe();		break;
			case '6':	exit(0);
			default:
				printf("NHAP SAI! MOI NHAP LAI!");
				getch();
		}
		system("pause>nul");
	} while(mn != '6');
	getch();
	return 0;
}

Mình chưa thấy phần sắp xếp trong các hàm sắp xếp của bạn nên chúng không được sắp xếp là điều đương nhiên
bạn thêm phần sắp xếp vào là ok

1 Like

Có vẻ lỗi không sắp xếp được là do mình lưu dữ liệu nhập vào file txt và chương trình không sắp xếp được dữ liệu đó vì mình chưa gọi ra hay sao ấy. bạn có cách nào lấy dữ liệu từ file ra để thao tác sắp xếp không chỉ mình với

Bạn tìm cho mình đoạn mã sắp xếp trong hàm của bạn

đó

switch(khoa)
	{
		case 'a':
			system("cls");
			printf("\n\t\tSap Xep Theo Ma Sinh Vien!\n\n");
			for(i = 0; i &lt; n - 1; i ++) {
				for( j = i + 1; j &lt; n; j++) {
					if(sv[i].MaSinhVien &gt; sv[j].MaSinhVien)
					{
						SinhVien a;
						a = sv[i];
						sv[i] = sv[j];
						sv[j] = a;
					}
				}
			}
			break;
		case 'b':
			system("cls");
			printf("\n\t\tSap Xep Theo Ho Va Ten!\n\n");
			for (i = 0; i &lt; n - 1; i++) {
        		for (j = i + 1 ; j &lt; n; j++) {
            		if (strcmp(sv[i].HoVaTen,sv[j].HoVaTen)&gt;0) {
                		SinhVien b;
                		b = sv[i];
                		sv[i] = sv[j];
                		sv[j] = b;
            		}
        		}
    		}
    		InDanhSach(sv, n);
			break;
		case 'c':
			system("cls");
			printf("\n\t\tSap Xep Theo Ngay Sinh!\n\n");
			break;
		case 'd':
			system("cls");
			printf("\n\t\tSap Xep Theo DTBTL!\n\n");
			for(i = 0; i &lt; n - 1; i++) {
				for(j = i + 1; j &lt; n; j++) {
					if(sv[i].Diem &gt; sv[j].Diem) {
						SinhVien d;
						d = sv[i];
						sv[i] = sv[j];
						sv[j] = d;
					}
				}
			}
			InDanhSach(sv, n);
			break;
	}

Lỗi không hiện theo đúng thứ tự sắp xếp của bạn có thể là do hàm InDanhSach() của bạn
Tại hàm này bạn chỉ in thông tin trong file Data.txt mà dữ liệu trong file này không được thay đổi nên dù bạn đã sắp xếp nhưng vẫn không hiện kết quả sắp xếp
Giải quyết:

  • Cập nhật lại file Data.txt để in ra kết quả chính xác
  • Tại hàm InDanhSach() bạn cho in mảng SinhVien
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?