统计成绩:给出n 个学生的考试成绩表,每条信息由姓名和分数组成,试设 计一个算法: 1.按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同 一名次; 2.按名次列出每个学生的姓名与分数。 输入要求 输入n+1 行,前n 行是n 个学生的信息(姓名,成绩),每个学生信息占一行, 姓名、成绩用空格分隔,成绩之后没有空格。最后,第n+1 行是输入结束标志:00(空 格分隔的二个0)。其中,姓名为字符串类型,成绩为浮点数类型。 输出要求 总计n 行,每行是一个学生的信息(名次、姓名、成绩),名次、姓名、成绩 用空格分隔。其中,成绩输出保留两位小数。用c语言写出代码
时间: 2024-02-25 16:55:10 浏览: 94
以下是参考代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN 20
// 学生结构体
typedef struct {
char name[MAX_NAME_LEN + 1];
float score;
int rank;
} Student;
int main() {
int n = 0;
Student students[100];
float scores[100] = {0}; // 分数数组,用于排序
char name[MAX_NAME_LEN + 1];
float score;
// 输入学生信息,统计人数、分数
while (scanf("%s%f", name, &score) == 2) {
if (strcmp(name, "00") == 0 && score == 0) {
break;
}
strcpy(students[n].name, name);
students[n].score = score;
n++;
scores[n - 1] = score;
}
// 计算每个学生的名次
for (int i = 0; i < n; i++) {
int rank = 1;
for (int j = 0; j < n; j++) {
if (scores[j] > students[i].score) {
rank++;
}
}
students[i].rank = rank;
}
// 按分数排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (scores[j] < scores[j + 1]) {
float temp = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = temp;
}
}
}
// 按名次列出每个学生的姓名与分数
for (int i = 0; i < n; i++) {
printf("%d %s %.2f\n", students[i].rank, students[i].name, students[i].score);
}
return 0;
}
```
阅读全文