编写C语言程序,实现如下功能:文件score.txt中存放若干同学的学号及高数、英语、C语言三门课的成绩,格式如下:1001 张晓丽 90 80 70 利用结构体编写程序实现如下功能:1.从score。.xt中逐个读入每个同学的成绩,用函数实现2.计算每个同学的平均分,用函数实现3.成绩按平均分排序,用函数实现4.屏幕输出结果并写入文件score_avg.txt中,用函数实现
时间: 2024-02-18 20:05:07 浏览: 101
好的,以下是一个实现上述功能的 C 语言程序,注释中有详细的说明。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大学生数
#define MAX_NAME_LENGTH 20 // 姓名最大长度
#define FILENAME "score.txt" // 成绩文件名
#define OUT_FILENAME "score_avg.txt" // 平均分文件名
typedef struct {
int id; // 学号
char name[MAX_NAME_LENGTH + 1]; // 姓名
int scores[3]; // 三门课成绩
float avg; // 平均分
} Student;
int read_scores(Student students[], int max_num);
float calc_avg(Student *student);
int cmp_by_avg(const void *a, const void *b);
void write_avg_file(Student students[], int num);
int main() {
Student students[MAX_STUDENT_NUM]; // 学生数组
int num = read_scores(students, MAX_STUDENT_NUM); // 读入成绩,返回学生数目
// 计算每个学生的平均分
for (int i = 0; i < num; i++) {
students[i].avg = calc_avg(&students[i]);
}
// 按平均分排序
qsort(students, num, sizeof(Student), cmp_by_avg);
// 屏幕输出结果并写入文件
write_avg_file(students, num);
return 0;
}
// 从文件中读入成绩
int read_scores(Student students[], int max_num) {
FILE *fp;
int num = 0;
char line[1024];
fp = fopen(FILENAME, "r");
if (fp == NULL) {
printf("Error: cannot open file %s\n", FILENAME);
exit(1);
}
while (fgets(line, 1024, fp) != NULL) {
if (num >= max_num) {
printf("Error: too many students\n");
exit(1);
}
// 解析每行数据,读入学号、姓名、成绩
sscanf(line, "%d %s %d %d %d",
&students[num].id,
students[num].name,
&students[num].scores[0],
&students[num].scores[1],
&students[num].scores[2]);
num++;
}
fclose(fp);
return num;
}
// 计算学生的平均分
float calc_avg(Student *student) {
float sum = 0;
for (int i = 0; i < 3; i++) {
sum += student->scores[i];
}
return sum / 3;
}
// 按平均分排序的比较函数
int cmp_by_avg(const void *a, const void *b) {
Student *s1 = (Student *)a;
Student *s2 = (Student *)b;
if (s1->avg < s2->avg) return 1;
if (s1->avg > s2->avg) return -1;
return 0;
}
// 屏幕输出结果并写入文件
void write_avg_file(Student students[], int num) {
FILE *fp;
fp = fopen(OUT_FILENAME, "w");
if (fp == NULL) {
printf("Error: cannot open file %s\n", OUT_FILENAME);
exit(1);
}
printf("学号\t姓名\t高数\t英语\tC语言\t平均分\n");
fprintf(fp, "学号\t姓名\t高数\t英语\tC语言\t平均分\n");
for (int i = 0; i < num; i++) {
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",
students[i].id,
students[i].name,
students[i].scores[0],
students[i].scores[1],
students[i].scores[2],
students[i].avg);
fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%.2f\n",
students[i].id,
students[i].name,
students[i].scores[0],
students[i].scores[1],
students[i].scores[2],
students[i].avg);
}
fclose(fp);
}
```
这个程序实现了从文件中读入成绩、计算每个学生的平均分、按平均分排序、屏幕输出结果并写入文件等功能。你可以根据需要进行修改和完善。
阅读全文