这个排序排不了和排名输出错误?

img

img

img

img

img

img


是排序拍不了和排名输出错误,如果可以的话可以有结构体数组和指针两种方式吗?

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
/***********Begin***********/
struct birthday{
   int year;
   int month;
   int day;
};
struct STUDENT{
   long num;
   char name[11];
   char sex[5];
   struct birthday bir;
   float score[4],total,average,rank;
};
/***********End*************/
void Input(struct STUDENT *stud, int n);
void Print(struct STUDENT *stud, int n);
void TotalAndAverage(struct STUDENT *stud, int n);
void RankByTotal(struct STUDENT *stud, int n);
int main()
{
    int n;
    /***********Begin***********/
    printf("Input n(n<=30):");
    scanf("%d",&n);
    struct STUDENT *stud=(struct STUDENT *)malloc(n*sizeof(struct STUDENT));

    Input(stud, n);

    TotalAndAverage(stud, n);

    RankByTotal(stud, n);

    Print(stud, n);

    /***********End*************/
   
    return 0;
}
void Input(struct STUDENT *stud, int n)
{
    /***********Begin***********/
     for(int i=0;i<n;i++){
         scanf("%ld %s %s %d %d %d ", &stud[i].num, stud[i].name, stud[i].sex,
                            &stud[i].bir.year,&stud[i].bir.month,&stud[i].bir.day);
         for(int j=0;j<4;j++)
             scanf("%f", &stud[i].score[j]);
     }
    /***********End*************/
}
void Print(struct STUDENT *stud, int n)
{
    printf("%8s%12s%10s%11s%10s%10s%10s%10s%10s%10s%5s\n",
           "NO.","Name","Sex","Birthday","Computer",
           "English","Math","Music","Total","Average","Rank");
    for(int i=0;i<n;i++)
    {
        printf("%8ld%12s%10s%5d%3d%3d",stud[i].num,stud[i].name,stud[i].sex,
                             stud[i].bir.year,stud[i].bir.month,stud[i].bir.day);
        for(int j=0;j<4;j++)
            printf("%10.0f",stud[i].score[j]);
        printf("%10.0f%10.0f%5.0f\n",stud[i].total,stud[i].average,stud[i].rank);
    }
}
void TotalAndAverage(struct STUDENT *stud, int n)
{
    /***********Begin***********/
     float x=0;
     for(int i=0;i<n;i++){
         x=0;
         for(int j=0;j<4;j++){
             x=(*stud).score[j]+x;
         }
         (*stud).total=x;
         x=x/4.0;  
         (*stud).average=x;
         stud++;
     }
    /***********End*************/
}
void RankByTotal(struct STUDENT *stud, int n)
{
     /***********Begin***********/
     int i,j,k;
     int *tmp=(int *)malloc(sizeof(int)*n);
     for(i = 0;i < n; i++) tmp[i] = 0;
     for (i = 0; i < n - 1; i++)
          for (j = i + 1; j < n; j++)
              if (stud[i].total == stud[j].total)
                  tmp[i]++;
     for (i = 0;i < n; i++){
         for (j = 0, k = 1; j < n; j++)
             if (tmp[j] == 0 && stud[i].total < stud[j].total) k++;
         stud[i].rank = k;
     }
     free(tmp);
     /***********End*************/
}