解题思路:
从题目描述得知,成绩个数不超过1000个,可以定义两个成绩数组a[1000]和b[1000],数组a存放每位学生的成绩;若他们的成绩都处于同一个等级段,要用b保存人数最多的那个等级中所有人的分数,也需要1000个单元。然后定义等级表g,可以用成绩分数除以10作为下标访问g,得到字符表示的等级,再用等级字符减'A'作为下标访问数组p,记录每个等级分别有多少人。输入每个成绩时,先查表得到成绩所属的等级,再将对应等级的人数加1,若某等级段人数更多,就记录其人数,并保存好相应的等级段编号;每个成绩都输入并处理后,输出各个等级段的人数、人数最多的等级段中人数;这之后,遍历成绩数组,根据事先保存好的等级段编号,将人数最多等级段中所有人的分数取出,从大到小排序,得到结果。
注意事项:
A,B,C,D,E五个等级段,分别对应编号:从0到4,作为下标访问数组,存取每个等级段的人数。
参考代码:
#include<stdio.h> #include<stdlib.h> int main(){ int y(const void *,const void *); int i,j,k,m,n,a[1000],b[1000],p[5]={0}; char g[]="EEEEEEDCBAA"; scanf("%d",&n); m=0; for(i=0;i<n;i++){ scanf("%d",a+i); j=g[a[i]/10]-'A';//查表得到成绩的等级 p[j]++;//对应等级的人数加1 if(p[j]>m){ m=p[j];//编号为j的等级段,人数更多 k=j; } } for(i=0;i<5;i++) printf("%d ",p[i]); printf("\n%d\n",m); for(j=i=0;i<n;i++)//遍历数组a,若编号为k的等级段,人数最多 if(g[a[i]/10]==(k+'A')) b[j++]=a[i];//将这些人的分数存入数组b qsort(b,j,sizeof(int),y);//从大到小进行快速排序 for(i=0;i<j;i++) printf("%d ",b[i]); printf("\n"); return 0; } int y(const void *u,const void *v){ return *(int *)v-*(int *)u; }
0.0分
0 人评分
WU-判定字符位置 (C++代码)浏览:1471 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:818 |
1035 题解浏览:875 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |
C二级辅导-温度转换 (C语言代码)浏览:802 |
一元一次方程 (C语言代码)浏览:4247 |
淘淘的名单 (C语言代码)浏览:1309 |
C语言程序设计教程(第三版)课后习题12.1 (C语言代码)浏览:689 |
【出圈】 (C++代码)简单循环浏览:699 |
孤独的骑士 (C语言代码)浏览:1416 |