题目描述 某班开设有英语、数学、程序设计三门课程,该班同学信息保存在文本文件student.txt中,编写程序从文件读入该班同学信息,分别按总成绩和英语成绩排序。该班同学不多于50人。 输入描述 文本文件student.txt,每行数据描述一个同学信息,包括名字、英语、数学、程序设计成绩 输出描述 该班同学总成绩排序和英语成绩排序,成绩相同时按输入次序。 每项占12位。 样例输入 文本文件student.txt,内容格式如下 张三 80 90 88 李四 66 80 90 王五 50 78 87 Jack 68 86 70 Tom 60 88 96 样例输出 Name English Math C Total 张三 80 90 88 258 Tom 60 88 96 244 李四 66 80 90 236 Jack 68 86 70 224 王五 50 78 87 215 Name English Math C Total 张三 80 90 88 258 Jack 68 86 70 224 李四 66 80 90 236 Tom 60 88 96 244 王五 50 78 87 215
时间: 2024-02-10 21:05:20 浏览: 53
以下是 C 语言的代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 50
#define MAX_NAME_LEN 20
typedef struct {
char name[MAX_NAME_LEN];
int english;
int math;
int c;
int total;
} Student;
void sort_by_total(Student students[], int n);
void sort_by_english(Student students[], int n);
int main() {
FILE *fp;
Student students[MAX_STUDENTS];
int i, n = 0;
fp = fopen("student.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
while (fscanf(fp, "%s %d %d %d", students[n].name, &students[n].english, &students[n].math, &students[n].c) == 4) {
students[n].total = students[n].english + students[n].math + students[n].c;
n++;
}
fclose(fp);
sort_by_total(students, n);
printf("%-12s%-12s%-12s%-12s%-12s\n", "Name", "English", "Math", "C", "Total");
for (i = 0; i < n; i++) {
printf("%-12s%-12d%-12d%-12d%-12d\n", students[i].name, students[i].english, students[i].math, students[i].c, students[i].total);
}
sort_by_english(students, n);
printf("%-12s%-12s%-12s%-12s%-12s\n", "Name", "English", "Math", "C", "Total");
for (i = 0; i < n; i++) {
printf("%-12s%-12d%-12d%-12d%-12d\n", students[i].name, students[i].english, students[i].math, students[i].c, students[i].total);
}
return 0;
}
void sort_by_total(Student students[], int n) {
int i, j;
Student temp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (students[i].total < students[j].total || (students[i].total == students[j].total && i > j)) {
temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
}
void sort_by_english(Student students[], int n) {
int i, j;
Student temp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (students[i].english < students[j].english || (students[i].english == students[j].english && i > j)) {
temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
}
```
代码解释:
1. 首先,我们定义了一个常量 `MAX_STUDENTS`,用于存储最多的学生人数,以及一个常量 `MAX_NAME_LEN`,用于存储学生名字的最大长度。
2. 然后,我们定义了一个结构体 `Student`,用于存储每个学生的信息,包括名字、英语成绩、数学成绩、程序设计成绩、总成绩。
3. 接着,我们定义了两个排序函数 `sort_by_total` 和 `sort_by_english`,分别用于按总成绩和英语成绩排序。这里采用的是冒泡排序的方法。如果成绩相同,则按输入顺序排序。
4. 在 `main` 函数中,我们打开输入文件 `student.txt`,并检查是否成功打开。如果打开失败,我们输出错误信息并返回 1。
5. 接下来,我们使用 `fscanf()` 函数从文件中读取学生信息,并计算每个学生的总成绩。每读取一行,就将其存储在一个 `Student` 结构体中,并将该结构体存储在一个数组 `students` 中。
6. 然后,我们按总成绩排序,并输出排序结果。这里使用 `printf()` 函数按指定格式输出每个学生的信息。
7. 最后,我们按英语成绩排序,并再次输出排序结果。
阅读全文