01/10/2018, 15:31

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("

==================== CHUONG TRINH QUAN LY SINH VIEN ====================


");
	printf("			1. Them Moi Ho So

");
	printf("			2. In Danh Sach

");
	printf("			3. Sap Xep

");
	printf("			4. Tim kiem

");
	printf("			5. Thong Ke

");
	printf("			6. Thoat

");
	getch();
}

int NhapHoSo(SinhVien sv[], int *n) //tro den o nho can lay gia tri
{
	int  i, j;
	system("cls");
	printf("

==================== MOI BAN NHAP THONG TIN SINH VIEN ====================


");
	printf("			So Sinh Vien Can Them: ");
	scanf("%d", &*n);
	for(i = 0; i < *n; i++)
	{
		printf("			Sinh Vien %d
", i + 1);
		fflush(stdin);
		printf("			Ma Lop: ");
		gets(sv[i].MaLop);
		printf("			Ma Sinh Vien: ");
		gets(sv[i].MaSinhVien);
		fflush(stdin);
		printf("			Ho 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] = '';
//		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("			Ngay Thang Nam Sinh: 
");
		do {
			printf("				Ngay: ");
			scanf("%d", &sv[i].ns.ngay);
			if((sv[i].ns.ngay < 1)||(sv[i].ns.ngay > 31)) 
				printf("				NGAY SINH KHONG HOP LE!!
");
		} while((sv[i].ns.ngay < 1)||(sv[i].ns.ngay > 31));
		do {
			printf("				Thang: ");
			scanf("%d", &sv[i].ns.thang);
			if((sv[i].ns.thang < 1)||(sv[i].ns.thang > 12))
				printf("				THANG SINH KHONG HOP LE!!
");
		} while((sv[i].ns.thang < 1)||(sv[i].ns.thang > 12));
		do {
			printf("				Nam: ");
			scanf("%d", &sv[i].ns.nam);
			if((sv[i].ns.nam < 1900)||(sv[i].ns.nam > 2016))
				printf("			NAM SINH KHONG HOP LE!!
");
		} while((sv[i].ns.nam < 1900)||(sv[i].ns.nam > 2016));
		do {
		printf("			Diem Trung Binh Tich Luy: ");
		scanf("%f", &sv[i].Diem);
		if((sv[i].Diem < 0)||(sv[i].Diem > 10))
			printf("			DIEM TRUNG BINH TICH LUY KHONG HOP LE!!
");
		} while((sv[i].Diem < 0)||(sv[i].Diem > 10));
		printf("
");
	}
	printf("		LUU 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  |
", 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, "----------------------------------------------------------------------
");
	}
	fclose(f);
	return 0;
}
int InDanhSach(SinhVien sv[], int n) 
{
	system("cls");
	char kitu[1000];
	printf("

	==================== DANH SACH SINH VIEN ====================


");
	printf("|   Lop   | Ma Sinh Vien |     Ho Va Ten     |   Ngay Sinh   | DTBTL |
");
	printf("=====================================================================
");
	FILE *p;
	p = fopen(FNAME, "r");
	while (fgets(kitu, 1000, p) != NULL)
	{
		printf("%s", kitu);
	}
	printf("
Nhan Phim Bat Ki De Tiep Tuc!");
	fclose(p);
	return 0;
}
int SapXep(SinhVien sv[], int n)
{
	system("cls");
	printf("

==================== CHON PHUONG PHAP SAP XEP ====================


");
	printf("			a. Selection Sort

");
	printf("			b. Insertion Sort

");
	printf("			c. Quick Sort

");
	printf("			d. Merge Sort

");
	printf("			e. Quay Lai

");
	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("
	******************");
			printf("
	* SELECTION SORT *");
			printf("
	******************
");
			SXChon(sx, sv, n);
			break;
		case 'b':
			system("cls");
			printf("
	******************");
			printf("
	* INSERTION SORT *");
			printf("
	******************
");
			SXChen(sx);
			break;
		case 'c':
			system("cls");
			printf("
	******************");
			printf("
	*   QUICK SORT   *");
			printf("
	******************
");
			SXNhanh(sx);
			break;
		case 'd':
			system("cls");
			printf("
	******************");
			printf("
	*   MERGE SORT   *");
			printf("
	******************
");
			SXTron(sx);
			break;
	}
	getch();
	return 0;
}
int SXChon(char khoa, SinhVien sv[], int n)
{
	printf("
		CHON KHOA DE SAP XEP

");
	printf("		a. Ma Sinh Vien

");
	printf("		b. Ho Va Ten

");
	printf("		c. Ngay Sinh

");
	printf("		d. Diem TBTL

");
	printf("		e. Tro lai
");
	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("
		Sap Xep Theo Ma Sinh Vien!

");
			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("
		Sap Xep Theo Ho Va Ten!

");
			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("
		Sap Xep Theo Ngay Sinh!

");
			break;
		case 'd':
			system("cls");
			printf("
		Sap Xep Theo DTBTL!

");
			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("
		CHON KHOA DE SAP XEP

");
	printf("		a. Ma Sinh Vien

");
	printf("		b. Ho Va Ten

");
	printf("		c. Ngay Sinh

");
	printf("		d. Diem TBTL

");
	printf("		e. Tro lai
");
	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("
		Sap Xep Theo Ma Sinh Vien!

");
			break;
		case 'b':
			system("cls");
			printf("
		Sap Xep Theo Ho Va Ten!

");
			break;
		case 'c':
			system("cls");
			printf("
		Sap Xep Theo Ngay Sinh!

");
			break;
		case 'd':
			system("cls");
			printf("
		Sap Xep Theo DTBTL!

");
			break;
	}
	getch();
	return 0;
}
int SXNhanh(char khoa)
{
	printf("
		CHON KHOA DE SAP XEP

");
	printf("		a. Ma Sinh Vien

");
	printf("		b. Ho Va Ten

");
	printf("		c. Ngay Sinh

");
	printf("		d. Diem TBTL

");
	printf("		e. Tro lai
");
	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("
		Sap Xep Theo Ma Sinh Vien!

");
			break;
		case 'b':
			system("cls");
			printf("
		Sap Xep Theo Ho Va Ten!

");
			break;
		case 'c':
			system("cls");
			printf("
		Sap Xep Theo Ngay Sinh!

");
			break;
		case 'd':
			system("cls");
			printf("
		Sap Xep Theo DTBTL!

");
			break;
	}
	getch();
	return 0;
}
int SXTron(char khoa)
{
	printf("
		CHON KHOA DE SAP XEP

");
	printf("		a. Ma Sinh Vien

");
	printf("		b. Ho Va Ten

");
	printf("		c. Ngay Sinh

");
	printf("		d. Diem TBTL

");
	printf("		e. Tro lai
");
	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("
		Sap Xep Theo Ma Sinh Vien!

");
			break;
		case 'b':
			system("cls");
			printf("
		Sap Xep Theo Ho Va Ten!

");
			break;
		case 'c':
			system("cls");
			printf("
		Sap Xep Theo Ngay Sinh!

");
			break;
		case 'd':
			system("cls");
			printf("
		Sap Xep Theo DTBTL!

");
			break;
	}
	getch();
	return 0;
}
int TimKiem(SinhVien sv[], int n)
{
	char ch;
	system("cls");
	printf("

==================== CHON PHUONG PHAP TIM KIEM ====================


");
	printf("		a. Tuan Tu

");
	printf("		b. Nhi Phan

");
	printf("		c. Tro lai
");
	do
	{
		ch=getch();
	} while (!((ch=='a')||(ch=='b')||(ch=='c')));
	if (ch=='c') return 0;
	switch (ch)
	{	
		case 'a': 
			system("cls");
			printf("
	********************");
			printf("
	* TIM KIEM TUAN TU *"); 
			printf("
	********************
");
			TKTuanTu(ch, sv, n);
			break;
		case 'b': 
			system("cls");
			printf("
	*********************");
			printf("
	* TIM KIEM NHI PHAN *"); 
			printf("
	*********************
");
			break;
		default:
			printf("NHAP SAI! MOI NHAP LAI!");
			getch();
	}
	getch();
	return 0;
}
int TKTuanTu(char khoa, SinhVien sv[], int n)
{
	system("cls");
	printf("
		CHON KHOA DE TIM KIEM

");
	printf("		a. Ma Sinh Vien

");
	printf("		b. Ho Va Ten

");
	printf("		c. Ngay Sinh

");
	printf("		d. DTBTL

");
	printf("		e. Tro Lai 

");
	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("		Tim Kiem Theo Ma Sinh Vien

");
			printf("Moi Nhap Ma Sinh Vien: ");
			gets(msv);
			break;
		case 'b':
			char hvt[50];
			printf("		Tim Kiem Theo Ho Va Ten

");
			printf("Moi Nhap Ho Va Ten: ");
			gets(hvt);
			break;
		case 'c':
			int d, m, y;
			printf("Tim Kiem Theo Ngay Sinh

");
			printf("Moi Nhap Ngay Thang Nam Sinh: ");
			printf("
Ngay: ");
			scanf("%d", &d);
			printf("
Thang: ");
			scanf("%d", &m);
			printf("
Nam: ");
			scanf("%d", &y);
			break;
		case 'd':
			float diem;
			printf("Tim Kiem Theo DTBTL

");
			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 ====================


");
	printf("		a. Lop - So Luong Sinh Vien

");
	printf("		b. Phan Loai Ket Qua Hoc Tap

");
	printf("		c. Tro lai

");
	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;
}
Lương Thế Hải viết 17:37 ngày 01/10/2018

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

Quang Bờm viết 17:36 ngày 01/10/2018

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

Lương Thế Hải viết 17:46 ngày 01/10/2018

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

Quang Bờm viết 17:44 ngày 01/10/2018

đó

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ương Thế Hải viết 17:31 ngày 01/10/2018

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
Bài liên quan
0