将文件 stu_info2.txt 中学生信息读出,按照平均分排序处理,再重新写入文件 “stu_sort.txt”并保存于磁盘上。用C语言完成。
时间: 2024-03-04 20:50:17 浏览: 96
使用txt设计的学生信息查询系统
好的,这是一个文件读写和排序的问题,我将为您提供代码参考:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LINE_LEN 100 // 文件中每行最大长度
#define MAX_STU_NUM 100 // 最大学生人数
struct student {
char name[20]; // 姓名
int id; // 学号
int score[3]; // 3门课程成绩
double avg_score; // 平均成绩
};
int compare(const void *a, const void *b) {
struct student *s1 = (struct student *)a;
struct student *s2 = (struct student *)b;
return s1->avg_score > s2->avg_score ? -1 : 1;
}
int main() {
FILE *fp;
char line[MAX_LINE_LEN];
struct student stu_list[MAX_STU_NUM];
int count = 0;
// 读文件
fp = fopen("stu_info2.txt", "r");
if (fp == NULL) {
printf("Cannot open file stu_info2.txt\n");
return 1;
}
while (fgets(line, MAX_LINE_LEN, fp)) {
sscanf(line, "%s %d %d %d %d", stu_list[count].name, &stu_list[count].id,
&stu_list[count].score[0], &stu_list[count].score[1], &stu_list[count].score[2]);
stu_list[count].avg_score = (stu_list[count].score[0] + stu_list[count].score[1] + stu_list[count].score[2]) / 3.0;
count++;
}
fclose(fp);
// 排序
qsort(stu_list, count, sizeof(struct student), compare);
// 写文件
fp = fopen("stu_sort.txt", "w");
if (fp == NULL) {
printf("Cannot open file stu_sort.txt\n");
return 1;
}
for (int i = 0; i < count; i++) {
fprintf(fp, "%s %d %d %d %lf\n", stu_list[i].name, stu_list[i].id, stu_list[i].score[0],
stu_list[i].score[1], stu_list[i].score[2], stu_list[i].avg_score);
}
fclose(fp);
printf("Sort finished.\n");
return 0;
}
```
代码中定义了一个结构体 `student`,用于存储每个学生的信息,包括姓名、学号、三门课程成绩、平均成绩。首先读取文件,将每个学生的信息存储在结构体数组 `stu_list` 中,并计算平均成绩。然后使用 `qsort` 函数对学生信息进行排序,排序的依据是平均成绩。最后将排序结果写入文件,每行包括姓名、学号、三门课程成绩和平均成绩。
注意,这里的排序是按照平均分从高到低排序,因此 `compare` 函数返回的结果是 `s1->avg_score > s2->avg_score ? -1 : 1`,如果需要按照平均分从低到高排序,可以将返回值反过来。
另外,代码中没有对输入文件中的错误情况进行处理,如果文件格式错误或者内容不符合要求,程序可能会出现异常。在实际使用中需要进行适当的错误处理。
阅读全文