如何用c语言实现 从文件 d:\st.txt 中读数据并计算每个学生三门功课的平均分,按平均分排 列名次,若平均分相同则名次并列;结果写入文件 d:\st.txt 并按格式输出;
时间: 2023-06-09 15:06:22 浏览: 99
C语言程序设计-输入2个学生3门课的成绩,计算学生成绩平均分,课程平均分和最高分.
5星 · 资源好评率100%
您好,以下是用 C 语言实现该功能的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[20];
int score[3];
double average;
int rank;
} Student;
int cmp(const void *a, const void *b) {
Student s1 = *(Student *)a;
Student s2 = *(Student *)b;
if (s1.average > s2.average) {
return -1;
} else if (s1.average < s2.average) {
return 1;
} else {
return 0;
}
}
int main() {
FILE *fp = fopen("d:\\st.txt", "r");
if (!fp) {
fprintf(stderr, "Failed to open file.\n");
return 1;
}
Student students[100];
int cnt = 0;
while (fscanf(fp, "%s%d%d%d", students[cnt].name, &students[cnt].score[0], &students[cnt].score[1], &students[cnt].score[2]) != EOF) {
students[cnt].average = (students[cnt].score[0] + students[cnt].score[1] + students[cnt].score[2]) / 3.0;
students[cnt].rank = 0;
cnt++;
}
qsort(students, cnt, sizeof(Student), cmp);
int last_rank = 1;
for (int i = 0; i < cnt; i++) {
if (i > 0 && students[i].average < students[i - 1].average) {
last_rank = i + 1;
}
students[i].rank = last_rank;
}
fp = fopen("d:\\st.txt", "w");
if (!fp) {
fprintf(stderr, "Failed to open file.\n");
return 1;
}
fprintf(fp, "名次\t姓名\t语文\t数学\t英语\t平均分\n");
for (int i = 0; i < cnt; i++) {
fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%.2f\n", students[i].rank, students[i].name, students[i].score[0], students[i].score[1], students[i].score[2], students[i].average);
}
fclose(fp);
return 0;
}
```
代码中使用了一个结构体 `Student` 来保存每个学生的信息,包括姓名、三科成绩、平均分和名次。使用 `fscanf` 从文件中读取数据,计算平均分并保存到结构体中,然后使用 `qsort` 对结构体数组进行排序,再计算每个学生的名次并输出到文件中。注意,为了避免文件覆盖,需要在读取完数据后关闭文件再重新打开以写入结果。
阅读全文