Làm thế nào để sắp xếp danh sách quản lý học sinh?

Em làm thế này thì sắp xếp danh sách mình phải làm sao… mò cả đêm vẫn mà viết vẫn bị lỗi

// DE TAI QUAN LY HOC SINH TRUNG HOC PHO THONG (GVCN)
 #include <stdio.h>
 #include <conio.h>
 #include <string.h>
typedef struct
{
       char ngay;
    char thang;
    int nam;    
}ngaythang;

typedef struct
{
    float van;
    float toan;
    float ly;
    float hoa;
    float sinh;
    float su;
    float dia;
    float anhvan;   
}diemcacmon;

typedef struct
{
    char mshs[100];
    char ten[100];
    ngaythang ngaysinh;
    char diachi[100];
    char sdt[100];
    char gioitinh[100];
    diemcacmon diemso;
    char xeploai[100]; 
}hocsinh;

void demsolan(int a)        // in so lan thuc hien chuong trinh
{
    FILE *f;
    f = fopen("dem.txt","a+b");
    int n;
    int c = fread(&n, sizeof(n), 1, f);
    fclose(f);
    f = fopen("dem.txt","w+b"); 
    if(c=0) n=0;  
    n=n+1;   
    fwrite(&n, sizeof(n), 1, 
    f);
    printf("Chuong trinh da thuc hien %d lan...\n", n);
    fclose(f);
    getch();
}

void nhaphs(hocsinh s)   // Nhap thong tin hoc sinh
{
    FILE *f;
    f=fopen("DanhSachHocSinh.txt","wb"); 
    int n; 
    printf("Nhap bao nhieu HS:"); scanf("%d",&n);   
    for(int i=1;i<=n;i++)
    {      
       printf("Sinh vien thu %d\n",i);
       fflush(stdin);
       printf("- MSHS:"); gets(s.mshs);
       printf("- HO VA TEN:"); gets(s.ten);
       printf("- GIOI TINH:"); gets(s.gioitinh);
       printf("- Ngay sinh:"); scanf("%d",&s.ngaysinh.ngay);
       printf("- Thang sinh:"); scanf("%d",&s.ngaysinh.thang);
       printf("- Nam sinh:"); scanf("%d",&s.ngaysinh.nam);
       fflush(stdin);
       printf("- SDT:"); gets(s.sdt);
       printf("- DIA CHI:"); gets(s.diachi);
       printf("NHAP DIEM CUA HOC SINH\n");
       printf("- Ngu Van:"); scanf("%f",&s.diemso.van);
       printf("- Toan:"); scanf("%f",&s.diemso.toan);
       printf("- Ly:"); scanf("%f",&s.diemso.ly);
       printf("- Hoa:"); scanf("%f",&s.diemso.hoa);
       printf("- Sinh:"); scanf("%f",&s.diemso.sinh);
       printf("- Su:"); scanf("%f",&s.diemso.su);
       printf("- Dia:"); scanf("%f",&s.diemso.dia);
       printf("- Anh Van:"); scanf("%1f",&s.diemso.anhvan);       
       fwrite(&s,sizeof(s),1,f);       
    }
    printf("-----------------------------------------------------------------\n");
    fclose(f);
    getch();
}


void indiemhs(hocsinh s)  // In diem hoc sinh ra man hinh   
{
    FILE *f;        
    f=fopen("DanhSachHocSinh.txt","rb");    
    printf("   MSHS   |\tHO VA TEN\t |          NGU VAN  | TOAN |  LY  |  HOA  |  SINH  |  SU  |  DIA  | ANH VAN | TRUNG BINH | XEP LOAI\n");
    fread(&s,sizeof(s),1,f);            
    while(!feof(f))
    {   
    float a=((s.diemso.van*2)+(s.diemso.toan*2)+s.diemso.ly+s.diemso.hoa+s.diemso.sinh+s.diemso.su+s.diemso.dia+s.diemso.anhvan)/10;                                                            
        if(a>=8 && s.diemso.van>=6.5 && s.diemso.toan>=6.5 && s.diemso.ly>=6.5 && s.diemso.hoa>=6.5 && s.diemso.sinh>=6.5 && s.diemso.su>=6.5 && s.diemso.dia>=6.5 && s.diemso.anhvan>=6.5) printf(" %s   %s      \t\t%.1f     %.1f    %.1f    %.1f     %.1f      %.1f    %.1f      %.1f       %.1f      HSG\n",s.mshs,s.ten,s.diemso.van,s.diemso.toan,s.diemso.ly,s.diemso.hoa,s.diemso.sinh,s.diemso.su,s.diemso.dia,s.diemso.anhvan,a);
        else if(a>=6.5 && s.diemso.van>=5 && s.diemso.toan>=5 && s.diemso.ly>=5 && s.diemso.hoa>=5 && s.diemso.sinh>=5 && s.diemso.su>=5 && s.diemso.dia>=5 && s.diemso.anhvan>=5) printf(" %s   %s      \t\t%.1f     %.1f    %.1f    %.1f     %.1f      %.1f    %.1f      %.1f       %.1f      HSK\n",s.mshs,s.ten,s.diemso.van,s.diemso.toan,s.diemso.ly,s.diemso.hoa,s.diemso.sinh,s.diemso.su,s.diemso.dia,s.diemso.anhvan,a);
                else if (a>=5 && s.diemso.van>=3.5 && s.diemso.toan>=3.5 && s.diemso.ly>=3.5 && s.diemso.hoa>=3.5 && s.diemso.sinh>=3.5 && s.diemso.su>=3.5 && s.diemso.dia>=3.5 && s.diemso.anhvan>=3.5) printf(" %s   %s      \t\t%.1f     %.1f    %.1f    %.1f     %.1f      %.1f    %.1f      %.1f       %.1f      HSTB\n",s.mshs,s.ten,s.diemso.van,s.diemso.toan,s.diemso.ly,s.diemso.hoa,s.diemso.sinh,s.diemso.su,s.diemso.dia,s.diemso.anhvan,a);
                        else if(a>=3.5 && s.diemso.van>=2 && s.diemso.toan>=2 && s.diemso.ly>=2 && s.diemso.hoa>=2 && s.diemso.sinh>=2 && s.diemso.su>=2 && s.diemso.dia>=2 && s.diemso.anhvan>=2) printf(" %s   %s      \t\t%.1f     %.1f    %.1f    %.1f     %.1f      %.1f    %.1f      %.1f       %.1f       HSY\n",s.mshs,s.ten,s.diemso.van,s.diemso.toan,s.diemso.ly,s.diemso.hoa,s.diemso.sinh,s.diemso.su,s.diemso.dia,s.diemso.anhvan,a);
                                else printf(" %s   %s      \t\t%.1f     %.1f    %.1f    %.1f     %.1f      %.1f    %.1f      %.1f       %.1f       HSK\n",s.mshs,s.ten,s.diemso.van,s.diemso.toan,s.diemso.ly,s.diemso.hoa,s.diemso.sinh,s.diemso.su,s.diemso.dia,s.diemso.anhvan,a);
                        
        fread(&s,sizeof(s),1,f);
    }   
    printf("-------------------------------------------------------------------------------------------------\n");
    fclose(f);
    getch();
}

void inhs(hocsinh s)   // In thong tin hoc sinh ra man hinh
{
    FILE *f;
    f=fopen("DanhSachHocSinh.txt","rb");
    printf("  MSHS\t|\tHO VA TEN\t| GIOI TINH |  NAM SINH  |     SDT     |  DIA CHI\n");
    fread(&s,sizeof(s),1,f);    
    while(!feof(f))
    {
      printf("%s   %s\t   %s\t      %d-%d-%d\t   %s\t   %s\n",s.mshs,s.ten,s.gioitinh,s.ngaysinh.ngay,s.ngaysinh.thang,s.ngaysinh.nam,s.sdt,s.diachi);    
      fread(&s,sizeof(s),1,f);
    }
    printf("--------------------------------------------------------------------------------\n");
    fclose(f);
    getch();
}

void timkiemhs(hocsinh s)    // Tim kiem bang ma so hoc sinh
{
    char maso[10];  
    fflush(stdin);
    FILE *f;
    f=fopen("DanhSachHocSinh.txt","rb");        
    int timkiem=0;
    printf("- Nhap MSHS can tim:"); gets(maso);
    fflush(stdin);
    while(timkiem==0 && !feof(f))
    {
        fread(&s,sizeof(s),1,f);
        if(strcmp(s.mshs,maso)==0) timkiem=1;
    }
    printf("-----------------------------------\n");
    float a=((s.diemso.van*2)+(s.diemso.toan*2)+s.diemso.ly+s.diemso.hoa+s.diemso.sinh+s.diemso.su+s.diemso.dia+s.diemso.anhvan)/10;
    if(timkiem==1)
    {
        printf("Da tim thay hoc sinh co ma so:%s\n",maso);  
        printf("- HO VA TEN: %s\n",s.ten);
        printf("- GIOI TINH: %s\n",s.gioitinh); 
        printf("- Nam sinh: %d-%d-%d\n",s.ngaysinh.ngay,s.ngaysinh.thang,s.ngaysinh.nam);       
        printf("- SDT: %s\n",s.sdt); 
        printf("- DIA CHI :%s\n",s.diachi);
        printf("------------------------\n");
        printf("DIEM CUA HOC SINH""\n");
        printf("- Ngu Van: %.1f\n",s.diemso.van);
        printf("- Toan: %.1f\n",s.diemso.toan);
        printf("- Ly: %.1f\n",s.diemso.ly);
        printf("- Hoa: %.1f\n",s.diemso.hoa); 
        printf("- Sinh: %.1f\n",s.diemso.sinh);
        printf("- Su: %.1f\n",s.diemso.su);
        printf("- Dia: %.1f\n",s.diemso.dia); 
        printf("- Anh Van: %.1f\n",s.diemso.anhvan);
        printf("- Diem trung binh:%.1f\n",a);
        if(a>=8 && s.diemso.van>=6.5 && s.diemso.toan>=6.5 && s.diemso.ly>=6.5 && s.diemso.hoa>=6.5 && s.diemso.sinh>=6.5 && s.diemso.su>=6.5 && s.diemso.dia>=6.5 && s.diemso.anhvan>=6.5) printf("- Xep loai: Hoc sinh gioi.\n");
        else if(a>=6.5 && s.diemso.van>=5 && s.diemso.toan>=5 && s.diemso.ly>=5 && s.diemso.hoa>=5 && s.diemso.sinh>=5 && s.diemso.su>=5 && s.diemso.dia>=5 && s.diemso.anhvan>=5) printf("- Xep loai: Hoc sinh kha.\n");
                else if (a>=5 && s.diemso.van>=3.5 && s.diemso.toan>=3.5 && s.diemso.ly>=3.5 && s.diemso.hoa>=3.5 && s.diemso.sinh>=3.5 && s.diemso.su>=3.5 && s.diemso.dia>=3.5 && s.diemso.anhvan>=3.5) printf("- Xep loai: Hoc sinh trung binh.\n");
                        else if(a>=3.5 && s.diemso.van>=2 && s.diemso.toan>=2 && s.diemso.ly>=2 && s.diemso.hoa>=2 && s.diemso.sinh>=2 && s.diemso.su>=2 && s.diemso.dia>=2 && s.diemso.anhvan>=2) printf("- Xep loai: Hoc sinh yeu.\n");
                                else printf("- Xep loai: Hoc sinh kem.\n");       
    } else printf("Khong tim thay hoc sinh co ma so %s\n",maso);
    fclose(f);
    printf("-----------------------------------\n");
    getch();    
}

void themhocsinh(hocsinh s)  //them hoc sinh vao danh sach
{
    FILE *f;
    f=fopen("DanhSachHocSinh.txt","ab");
    int n;
    printf("Them bao nhieu HS:"); scanf("%d",&n);
    fread(&s,sizeof(s),1,f);
    for(int i=1;i<=n;i++)
    {
       fread(&s,sizeof(s),1,f);
       printf("Hoc sinh thu %d\n",i);
       fflush(stdin);
       printf("- MSHS:"); gets(s.mshs);
       printf("- HO VA TEN:"); gets(s.ten);
       printf("- GIOI TINH:"); gets(s.gioitinh);
       printf("- Ngay sinh:"); scanf("%d",&s.ngaysinh.ngay);
       printf("- Thang sinh:"); scanf("%d",&s.ngaysinh.thang);
       printf("- Nam sinh:"); scanf("%d",&s.ngaysinh.nam);
       fflush(stdin);
       printf("- SDT:"); gets(s.sdt);
       printf("- DIA CHI:"); gets(s.diachi);
       printf("NHAP DIEM CUA HOC SINH\n");
       printf("- Ngu Van:"); scanf("%f",&s.diemso.van);
       printf("- Toan:"); scanf("%f",&s.diemso.toan);
       printf("- Ly:"); scanf("%f",&s.diemso.ly);
       printf("- Hoa:"); scanf("%f",&s.diemso.hoa);
       printf("- Sinh:"); scanf("%f",&s.diemso.sinh);
       printf("- Su:"); scanf("%f",&s.diemso.su);
       printf("- Dia:"); scanf("%f",&s.diemso.dia);
       printf("- Anh Van:"); scanf("%1f",&s.diemso.anhvan);       
       fwrite(&s,sizeof(s),1,f);       
    }
    printf("-----------------------------------------------------------------\n");
    fclose(f);
    getch();
}

void sapxep(hocsinh s)
{
}

int main()
{
    int c;  int a;
    FILE *f;
    f=fopen("DanhSachHocSinh.txt","ab");            
    hocsinh hs; 
    for(;;)
    {
        printf("1. Nhap danh sach hoc sinh\n");
        printf("2. Xem danh sach hoc sinh\n");
        printf("3. Xem diem hoc sinh\n");
        printf("4. Tim kiem hoc sinh\n");
        printf("5. Them hoc sinh\n");
        printf("6. Xoa hoc sinh\n");        
        printf("10. Thoat ra\n");
        scanf("%d",&c);     
        if(c==1) nhaphs(hs); 
         else if(c==2) inhs(hs);
                else if(c==3) indiemhs(hs);
                       else if(c==4) timkiemhs(hs);
                               else if(c==5) themhocsinh(hs);
                                      else if(c==6) sapxep(hs);
                                             else if(c==10) 
                                               {
                                                   demsolan(a);
                                                    break;
                                               }
                                             
    }
    fclose(f);
    getch();
    return 0;           
}

e đọc file txt vào ram rồi sắp xếp mảng vừa đọc theo 1 tiêu chí sắp xếp nào đó như giảm dần đtb, sau đó ghi lại ra file,

1 Like

sắp xếp 1 mảng trong cấu trúc là tất cả các trường còn lại đều sắp xếp theo lun hả a

Mình thì mình trải thêm 1 dọc pointer (tạm) nữa, chứ vầy thì phê lắm :slight_smile:

Vả lại phần xếp loại có thể viết lại.

1 Like

Bạn phải viết 1 hàm so sánh 2 struct riêng, sau đó sort dựa trên kết quả so sánh.

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