Code quản lý sinh viên mảng một chiều C không sắp xếp được

Thầy em cho bài tập quản lý sinh viên bằng mảng 1 chiều, nhưng khi em sắp xếp theo điểm hay theo tên thì giá trị lại không như nhau. Ví dụ như nhập A = 8đ, B=9đ sau khi sắp xếp thì giảm dần nhưng A = 9, B = 8. các bác xem giúp em.

#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
void textcolor(int x)
{
    HANDLE mau;
    mau = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(mau,x);
}
char ten[100][50];
int tuoi[100];
float diem[10];
void Nhapds(int n){
    for(int i=0;i<n;i++){
    fflush(stdin);
    printf("Ten sinh vien : ");
    gets(ten[i]);
    fflush(stdin);
    printf("Tuoi : ");
    scanf("%d",&tuoi[i]);
    printf("Diem : ");
    scanf("%f",&diem[i]);
    }
fflush(stdin);
}
void Xuat(int n){
    printf("---------------------------------------\n");
    printf("| %20s | %5s | %5s|\n","Ho va ten      ","Tuoi","Diem");
    printf("---------------------------------------");
    for(int i=0;i<n;i++){
        printf("\n| %20s | %5d | %5.2f|",ten[i],tuoi[i],diem[i]);
    }
}
void Sapxepdiem( int n){
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(diem[i]<diem[j]){
                float temp = diem[i];
                diem[i] = diem[j];
                diem[j] = temp;
            }
        }
    }
    printf("DANH SACH SINH VIEN THEO DIEM TB\n");
    printf("---------------------------------------\n");
    printf("| %20s | %5s | %5s|\n","Ho va ten      ","Tuoi","Diem");
    printf("---------------------------------------");
    for(int i=0;i<n;i++){
        printf("\n| %20s | %5d | %5.2f|",ten[i],tuoi[i],diem[i]);
    }
}
void Sapxepten(int n){
    char temp[100];
    for(int i=0;i<n;i++){
      for(int j=i+1;j<n;j++)
      {
        if(stricmp(ten[i],ten[j])>0)
         {
            strcpy(temp,ten[i]);
            strcpy(ten[i],ten[j]);
            strcpy(ten[j],temp);        
         }
      }
    }
    printf("\nDANH SACH SINH VIEN THEO TEN\n");
    Xuat(n);
}
void Tim(int n){
    char find[100];
    int flag =0;
    printf("\nNhap MSSV can tim : ");
    gets(find);
    for(int i =0 ;i<n;i++){
        if(stricmp(find,ten[i])==0){
            printf("---------------------------------------\n");
            printf("| %20s | %5s | %5s|\n","Ho va ten      ","Tuoi","Diem");
            printf("---------------------------------------");
            printf("\n| %20s | %5d | %5.2f|",ten[i],tuoi[i],diem[i]);
            flag = 1;
        }
    }
    if(flag == 0){
        printf("\nKhong co sinh vien can tim");
    }

}
main(){
    int n;
    char ten[100][50];
    int tuoi;
    float diem;
    printf("Nhap so sinh vien : ");
    scanf("%d",&n);
    Nhapds(n);
    Sapxepdiem(n);
    Sapxepten(n);
    Tim(n);
    
}

Bạn chỉ sắp xếp và hoán đổi vị trí của tên mà KHÔNG hoán đổi vị trí của tuổi và điểm.

1 Like

nhưng nếu sắp xếp luôn cái biến khác thì nó cũng đâu giống dữ liệu đầu vào đâu bác, em chỉ muốn sắp xếp 1 biến diem thôi. Sắp xếp các biến khác nó cũng lộn tùm phèo lên

Nếu bạn muốn sắp sếp theo 1 biến (mảng) nhưng CHỈ hoán đổi biến đó thì nó sai, bạn tự chịu. Đã sai rồi đấy.

Sắp xếp theohoán đổi có khác nhau đấy. Mình đang nói đến việc hoán đổi.
Bạn phải phải hoán đổi đồng loạt các giá trị tương ứng với Sinh viên đó chứ bạn!

Ten: [a, d, c, b]
Tuoi: [20, 22, 21, 31]
Diem: [9, 5, 4, 8]

Có phải khi sắp xếp theo tên thì các giá trị tương ứng (tuổi và điểm) cũng phải đổi chỗ theo tên đó (hoán đổi vị trí)?

Ten: [a, b, c, d] <
Tuoi: [20, 31, 21, 22]
Diem: [9, 8, 4, 5]

Theo điểm:

Ten: [a, b, d, c]
Tuoi: [20, 31, 22, 21]
Diem: [9, 8, 5, 4] <

Phải không?
Thế bạn có biết chỗ mình nói là hoán đổi vị trí là chỗ nào trong đoạn mã của bạn không?

3 Likes

Xếp theo điểm thì điểm là khóa sắp xếp chứ cũng phải đổi cả 3 thành phần.

4 Likes

Cảm ơn bác em làm được rồi, hoán vị luôn 2 cái biến kia là được Capture

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