1.在C99标准中不允许将字符串(实际上是一个指针变量) 赋值给数组{可以直接定义/用strcpy函数/memset}
2.字符串不能直接比大小 要用strcmp函数
老问题:审题错误与信息点遗漏
新问题:结构体的分层比较(快排)
可以在结构体里再设一个f来记录等级,而不必新开一个数组;
此题的本质是分层排序,关键是确立优先级,注意边界
return德才分之和的那部分要记得加括号
typedef的使用
准考证号前置0的问题可以在输出时用%08d解决。
需要检查的地方:边界 题意(输入,输出,算法,时间/空间复杂度的估计,边界条件)
#include<stdio.h>
#include<stdlib.h>typedef struct
{int number,d,c,f;
}ks;int cmp(const void *a,const void *b)
{ks k1=*(ks *)a;ks k2=*(ks *)b;if(k1.f!=k2.f) return k1.f-k2.f;//先对考生的等级进行排序else if((k1.d+k1.c)!=(k2.d+k2.c)) return (k2.d+k2.c)-(k1.d+k1.c);//按总分排序else if(k1.d!=k2.d) return k2.d-k1.d;//如果总分也相同就按德分进行排序else return k1.number-k2.number;//最后按照名字排序
}
int main()
{int N,h,l,count=0;scanf("%d%d%d",&N,&l,&h);ks k[N];for(int i=0;i<N;i++){scanf("%d %d %d",&k[i].number,&k[i].d,&k[i].c);if(k[i].d>=l&&k[i].c>=l)//对德才分都高于最底线的进行等级的划分{count++;//达标人数if(k[i].d>=h&&k[i].c>=h) k[i].f=1;//德才分都高于高分线else if(k[i].d>=h) k[i].f=2;//德分高于高分线else if(k[i].d>=k[i].c) k[i].f=3;//德分高于才分else k[i].f=4;//其他情况}else k[i].f=5;//没超过分数线}qsort(k,N,sizeof(ks),cmp);printf("%d\n",count);for(int i=0;i<count;i++){printf("%08d %d %d\n",k[i].number,k[i].d,k[i].c);}
}