左嘉


私信TA

用户名:zuojia

访问量:88603

签 名:

Jz

等  级
排  名 5
经  验 34537
参赛次数 226
文章发表 72
年  龄 40
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

解题思路:
从题目描述得知,成绩个数不超过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 人评分

  评论区

  • «
  • »