慕课浙大数据结构-10-排序5 PAT Judge (25分)

参考这篇博客,写的非常清晰,太棒了。10-排序5 PAT Judge (25分)
对于qsort库函数的使用,参考C语言标准库函数qsort排序的介绍与使用.
排序规则:
1.总分高,总分降序排序。
2.总分相同,根据完美解决问题的数量降序排序。
3.如果数量也相同,则根据学号升序排列。
4.对于那些从来没有提交过任何可以通过编译器的解决方案的人,或者从来没有提交过任何解决方案的人,不显示在排序表中。

错误记录:
1.代码如下,之前对Sid和Pid已经进行了减一操作,在以后的代码中不要重复减一

 if(student[--Sid].problems[--Pid]<Pscore){//这里的if判断是否可以交换顺序 试一下最后
            if(Pscore>-1){
                student[Sid].visited = 1;//wrong used  student[--Sid].visited

2.对qsort库函数的调用(这是我第一次看懂并使用这个函数)
如果需要升序排列,则当a>b时,k>0,但是本题中排名是按照分数降序排列,因此当a>b时,k<0
3.scanf("%d%d%d",&Sid,&Pid,&Pscore);对于整型数据的读取不需要加空格,似乎要求不像字符那样苛刻了
4.//wrong used(const pstu)b->total_score 这个优先级可以看一下,由于这里->优先级高于强制类型转换运算符,因此这个括号必须加应该写成((const pstu)b)->total_score
5.LastRank = i+1;//wrong used LastRank++;名次这里写错了



#include
#include
typedef struct stu *pstu;
struct stu{
    int id,cnt,total_score,visited,problems[6];
}student[10005];
int cmp(const void *a,const void *b){
    int k;
    if(((const pstu)a)->total_score < ((const pstu)b)->total_score) k=1;//wrong used(const pstu)b->total_score 这个优先级可以看一下
    else if(((const pstu)a)->total_score > ((const pstu)b)->total_score) k=-1;
    else{
        if(((const pstu)a)->cnt < ((const pstu)b)->cnt) k=1;
        else if(((const pstu)a)->cnt > ((const pstu)b)->cnt) k=-1;
        else{
            if(((const pstu)a)->id > ((const pstu)b)->id) k=1;
            else k=-1;
        }
    }
    return k;
}
int main(){
    int stu_num,exe_num,rec_num,Sid,Pid,Pscore;
    int full_score[5];
    int i,j;
    scanf("%d %d %d",&stu_num,&exe_num,&rec_num);
    for(i=0;i<exe_num;++i){
        scanf("%d",&full_score[i]);
    }
    for(i=0;i<stu_num;++i){
        student[i].id = i+1;
        student[i].cnt = 0;
        student[i].total_score = 0;
        student[i].visited = 0;
        for(j=0;j<exe_num;++j){
            student[i].problems[j]=-2;
        }
    }
    for(i=0;i<rec_num;++i){
        scanf("%d%d%d",&Sid,&Pid,&Pscore);
        if(student[--Sid].problems[--Pid]<Pscore){//这里的if判断是否可以交换顺序 试一下最后
            if(Pscore>-1){
                student[Sid].visited = 1;//wrong used  student[--Sid].visited
            }
            student[Sid].problems[Pid] = Pscore;//wrong used student[--Sid].problems[--Pid]
        }
    }
    for(i=0;i<stu_num;++i){
        for(j=0;j<exe_num;++j){
            if(student[i].problems[j]>0){
                student[i].total_score += student[i].problems[j];
            }
            if(student[i].problems[j]==full_score[j]){
            student[i].cnt++;
            }
        }
    }
    qsort(student,stu_num,sizeof(struct stu),cmp);
    int LastScore=student[0].total_score,LastRank=1;
    for(i=0;i<stu_num;++i){
        if(student[i].visited == 1){
            if(LastScore == student[i].total_score){
                printf("%d %05d %d", LastRank,student[i].id,student[i].total_score);
            }
            else{
                LastRank = i+1;//wrong used LastRank++;
                LastScore =student[i].total_score;
                printf("%d %05d %d",LastRank,student[i].id,student[i].total_score);
            }
            for(j=0;j<exe_num;++j){
                if(student[i].problems[j]==-1){
                    student[i].problems[j] = 0;
                }
                if(student[i].problems[j]>=0){
                    printf(" %d",student[i].problems[j]);
                }
                else{
                    printf(" -");
                }
            }
            printf("\n");
        }
    }
    return 0;
}

你可能感兴趣的:(菜菜做题,c语言)