MOOC Zhejiang University Data Structure-10-Sort 5 PAT Judge (25 puntos)

Consulte este blog, la redacción es muy clara y excelente. 10-Ordenar 5 PAT Juez (25 puntos)
Para el uso de la función de biblioteca qsort, se refieren a la introducción y el uso del lenguaje estándar C qsort función de biblioteca .
Reglas de ordenación:
1. La puntuación total es alta, y la puntuación total es ordenados en orden descendente.
2. La puntuación total es la misma, clasificada en orden descendente según el número de problemas perfectamente resueltos.
3. Si el número también es el mismo, se ordenará en orden ascendente según el número de alumno.
4. Para aquellos que nunca han enviado una solución que pueda aprobar el compilador, o que nunca han enviado ninguna solución, no se mostrará en la tabla de clasificación.

Registro de error:
1. El código es el siguiente. El Sid y Pid se han reducido en uno antes, así que no repita el decremento en uno en el siguiente código

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

2. Llame a la función de biblioteca qsort (esta es la primera vez que entiendo y uso esta función)
si necesita ordenar en orden ascendente, cuando a> b, k> 0, pero la clasificación en esta pregunta está en orden descendente de puntuaciones, por lo que cuando a> b, k <0
3.scanf ("% d% d% d", & Sid, & Pid, ​​& Pscore); No es necesario agregar espacios para leer datos enteros, parece que los requisitos son no tan duro como los caracteres
4. // mal usado (const pstu) b-> total_score Esta prioridad se puede ver, porque aquí -> la prioridad es mayor que el operador de conversión, por lo que este corchete debe agregarse debe escribirse como ((const pstu) b) -> total_score
5.LastRank = i + 1; // LastRank ++ mal usado; La clasificación es incorrecta aquí



#include<stdio.h>
#include<stdlib.h>
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;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43919570/article/details/105865804
Recomendado
Clasificación