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

Consulte este blog, a redação é muito clara e ótima. 10 Classificar 5 PAT Judge (25 pontos)
Para a utilização da função de biblioteca qsort, referem-se a introdução e utilização da linguagem C qsort função de biblioteca padrão .
Regras de classificação:
1. A pontuação total é alta, e a pontuação total é classificados em ordem decrescente.
2. A pontuação total é a mesma, classificada em ordem decrescente de acordo com o número de problemas perfeitamente resolvidos.
3. Se o número também for o mesmo, será ordenado em ordem crescente de acordo com o número do aluno.
4. Para aqueles que nunca enviaram nenhuma solução que passe no compilador, ou que nunca enviaram nenhuma solução, ela não será exibida na tabela de classificação.

Registro de erro:
1. O código é o seguinte. O Sid e Pid foram decrementados em um antes, portanto, não repita o decremento em um no código a seguir

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

2. Chame a função de biblioteca qsort (esta é a primeira vez que entendo e uso esta função)
se você precisar classificar em ordem crescente, quando a> b, k> 0, mas a classificação nesta questão está em ordem decrescente de pontuações, então quando Quando a> b, k <0
3.scanf ("% d% d% d", & Sid, & Pid, ​​& Pscore); Não há necessidade de adicionar espaços para ler dados inteiros, parece que os requisitos são não tão áspero quanto os caracteres
4. // errado usado (const pstu) b-> total_score Esta prioridade pode ser vista, porque aqui -> a prioridade é maior que o operador de conversão, então este colchete deve ser adicionado deve ser escrito como ((const pstu) b) -> total_score
5.LastRank = i + 1; // LastRank usado incorretamente ++; A classificação está errada aqui



#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;
}

Acho que você gosta

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