C语言 · 分数统计

时间:2023-01-08 08:17:13
算法提高 分数统计  
时间限制:1.0s   内存限制:512.0MB
    
问题描述
  2016.4.5已更新此题,此前的程序需要重新提交。
问题描述
  给定一个百分制成绩T,将其划分为如下五个等级之一:
  90~100为A,80~89为B,70~79为C,60~69为D,0~59为E
  现在给定一个文件inp,文件中包含若干百分制成绩(成绩个数不超过100),请你统计五个等级段的人数,并找出人数最多的那个等级段,按照从大到小的顺序输出该段中所有人成绩(保证人数最多的等级只有一个)。要求输出到指定文件oup中。
输入格式
  若干0~100的正整数,用空格隔开
输出格式
  第一行为5个正整数,分别表示A,B,C,D,E五个等级段的人数
  第二行一个正整数,表示人数最多的等级段中人数
  接下来一行若干个用空格隔开的正整数,表示人数最多的那个等级中所有人的分数,按从大到小的顺序输出。
样例输入
100 80 85 77 55 61 82 90 71 60
样例输出
2 3 2 2 1
3
85 82 80
 
作者注释:蓝桥杯的后台编译时其实有N——表输入N个0~100的正整数即分数。
正确代码:
 1 #include <algorithm>  
 2 #include <iostream>  
 3 #include <string.h>  
 4 int num[1005];  
 5 using namespace std;  
 6 int main()  
 7 {  
 8     int n,i = 0,sum;  
 9     int temp[5][1005],dp[5] = {90,80,70,60,0};  
10     memset(temp,0,sizeof(temp));  
11     cin>>sum;  
12     for(;i < sum;i++)  
13     {  
14         cin>>num[i];  
15         for(int j = 0;j < 5;j++)  
16         {  
17             if(num[i] >= dp[j])  
18             {  
19                 temp[j][++temp[j][0]] = num[i];  
20                 break; 
21             }  
22         }  
23     }  
24     int maxn = 0,maxl = 0;  
25     for(int t = 0;t < 5;t++)  
26     {  
27         cout<<temp[t][0]<<" ";//输出每个等级的人数 
28         if(maxn < temp[t][0])  
29         {  
30             maxn = temp[t][0];  
31             maxl = t;  
32         }  
33     }  
34     cout<<endl<<maxn<<endl;  
35     sort(temp[maxl]+1,temp[maxl]+temp[maxl][0]+1);  
36     for(int t = temp[maxl][0];t >= 1;t--)  
37         cout<<temp[maxl][t]<<" ";  
38     return 0;  
39 } 
 
错误代码:
 1 #include<stdio.h>
 2 int main(){
 3     int n;
 4     int a=1,b=1,c=1,d=1,e=1;
 5     scanf("%d",&n);
 6     int score[n];
 7     int a1[5][n];
 8     for(int i=0;i<5;i++){
 9         a1[i][0]=0;
10     }
11     for(int i=0;i<n;i++){
12         scanf("%d",&score[i]);
13         if(score[i]>=90){
14             a1[0][a]=score[i]; 
15             a1[0][0]++;
16             a++;
17         }
18         else if(score[i]>=80 && score[i]<90){
19             a1[1][b]=score[i];
20             a1[1][0]++; 
21             b++;
22         }
23         else if(score[i]>=70 && score[i]<80){
24             a1[2][c]=score[i]; 
25             a1[2][0]++;
26             c++;
27         }
28         else if(score[i]>=60 && score[i]<70){
29             a1[3][d]=score[i];
30             a1[3][0]++; 
31             d++;
32         }
33         else if(score[i]<60){
34             a1[4][e]=score[i];
35             a1[4][0]++;
36             e++;
37         }
38     }
39     printf("%d %d %d %d %d\n",a1[0][0],a1[1][0],a1[2][0],a1[3][0],a1[4][0]);
40     
41     /*对各个等级人数进行冒泡降序*/
42     for(int i=0; i<5-1; i++){
43         for(int j=0; j<5-1-i; j++){
44             /*降序*/
45             if(a1[j][0]<a1[j+1][0]){
46                 int t = a1[j][0];
47                 a1[j][0] = a1[j+1][0];
48                 a1[j+1][0] = t;
49             }
50         }
51     }
52     printf("%d\n",a1[0][0]);
53     for(int i=1;i<=a1[0][0];i++){
54         printf("%d ",a1[1][i]);
55     }
56 }