西绿柿556 2021-11-12 20:14 采纳率: 40%
浏览 90
已结题

C语言成绩排序(想考试及格)

题目:期中考试已经结束了,计算机系将要进行年级成绩排名。排名的规则如下:

  1. 以期中考试的平均成绩为排名依据(满分为100分);
  2. 对学生A,如果一共有K个学生的平均成绩比A的平均成绩高,则学生A的年级排名为K+1;
  3. 如果学生A和学生B的平均成绩相同,则他们的排名相同。
    希望你能编写一个程序来实现排名和统计名次。
    输入格式
      第一行为一个整数N(1<=N<=1000),表示学生的人数。随后有N行,每行有两个非负整数描述一个学生的信息,依次为学号和平均成绩。

输出格式
  输出共有N行,按照名次从高到低每行输出一名学生的信息(若名次相同,则学号小的先输出),依次为:名次,学号,平均成绩,其间用一个空格隔开。

输入样例
样例一
5
1000 95
1001 100
1002 94
1006 95
1007 100
样例二
20 
2191 37 
5618 47 
1146 15 
6029 4 
2757 16 
5968 83 
1205 46 
7473 13 
2301 35 
1343 1 
6113 31 
4238 15 
1709 43 
4330 47 
8444 5 
3282 9 
2549 68 
5415 75 
6875 50 
1757 10 
输出样例
样例一
1 1001 100
1 1007 100
3 1000 95
3 1006 95
5 1002 94
样例二
1 5968 83 
2 5415 75 
3 2549 68 
4 6875 50 
5 4330 47 
5 5618 47 
7 1205 46 
8 1709 43 
9 2191 37 
10 2301 35 
11 6113 31 
12 2757 16 
13 1146 15 
13 4238 15 
15 7473 13 
16 1757 10 
17 3282 9 
18 8444 5 
19 6029 4 
20 1343 1
我的答案:#include <stdio.h>
#define N 1000

int main() {
int n, i, j, t, k, m;
int a[N], c[N], b[N];
scanf("%d\n", &n);
for (i = 0; i <= n - 1; i++) {
scanf("%d %d\n", &b[i], &a[i]);
}
for (i = 0; i <= n - 1; i++) {
for (j = 0; j <= n - i - 1; j++) {
if (a[j] < a[j + 1]) {
t = a[j + 1];
a[j + 1] = a[j];
a[j ] = t;
m = b[j + 1];
b[j + 1] = b[j ];
b[j] = m;
} else {
t = a[j ];
a[j ] = a[j + 1];
a[j + 1] = t;
m = b[j ];
b[j ] = b[j + 1];
b[j + 1] = m;
}
}
}
k = 1;
c[0] = 1;
for (i = 1; i <= n; i++) {
if (a[i] != a[i - 1]) {
c[i] = ++k;
} else {
c[i] = k;
k = k++;
}
}

for (i = 0; i < n; i++) {
    printf("%d %d %d\n", c[i], b[i], a[i]);
}
return 0;

}
运行答案出错,两个小时没找出来bug在哪里

  • 写回答

1条回答 默认 最新

  • qza2468 2021-11-12 20:33
    关注
    int main() {
        int grades[1000][2];    // 1000个二元数组,保存学号和成绩
        int n;
        // 输入成绩
        scanf("%d", &n);
        for (int i = 0; i < n; i++){
            scanf("%d%d", &grades[i][0], &grades[i][0]);
        }
    
        for (int i = 0; i < n; i++){
            for (int j = 0; j < i; j++) {
                // 如果成绩少
                if (grades[i][1] > grades[j][1]) {
                    //交换成绩
                    int temp = grades[i][1];
                    grades[i][1] = grades[j][1];
                    grades[j][1] = temp;
                    //交换学号
                    temp = grades[i][0];
                    grades[i][0] = grades[j][0];
                    grades[j][0] = temp;
                }
                // 如果成绩相同,学号多
                else if (grades[i][1] == grades[j][1] && grades[i][0] < grades[j][0]) {
                    //交换成绩
                    int temp = grades[i][1];
                    grades[i][1] = grades[j][1];
                    grades[j][1] = temp;
                    //交换学号
                    temp = grades[i][0];
                    grades[i][0] = grades[j][0];
                    grades[j][0] = temp;
                }
            }
        }
    
        // keep 自己在纸上理解一下
        int keep = 0;
        int keep_rank = 0;
        for (int i = 0; i < n; i++){
            if (!keep) {
                keep_rank = i;
            }
            if (i != n - 1 && grades[i][1] == grades[i + 1][1]) {    // 避免超出数组范围
                keep = 1;
            }
            else {
                keep = 0;
            }
    
            printf("%d %d %d\n", keep_rank, grades[i][0], grades[i][1]);
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月28日
  • 已采纳回答 11月20日
  • 创建了问题 11月12日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 如何将下列的“无限压缩存储器”设计出来
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口