如何通过c语言从文件 d:\st.txt 中读数据并计算每个学生三门功课的平均分,按平均分排 列名次,若平均分相同则名次并列;结果写入文件 d:\st.txt 并按格式输出;
时间: 2023-06-10 12:04:21 浏览: 139
您好!感谢您的提问。根据您的需求,可以通过以下代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM_STUDENT 100 // 最大学生数
#define MAX_LENGTH_NAME 20 // 最大姓名长度
struct Student { // 定义学生结构体
char name[MAX_LENGTH_NAME];
float score[3];
float avg_score;
int rank;
};
int main() {
struct Student stu[MAX_NUM_STUDENT]; // 定义学生数组
FILE *fp_read = fopen("d:\\st.txt", "r"); // 打开读取文件
FILE *fp_write = fopen("d:\\st_out.txt", "w"); // 打开写入文件
if (fp_read == NULL || fp_write == NULL) { // 打开文件失败
printf("Failed to open file\n");
exit(1);
}
int count = 0; // 学生计数器
while (!feof(fp_read)) { // 读取文件中的学生信息
if (fscanf(fp_read, "%s %f %f %f", stu[count].name, &stu[count].score[0],
&stu[count].score[1], &stu[count].score[2]) == 4) {
// 计算平均分
stu[count].avg_score = (stu[count].score[0] + stu[count].score[1] + stu[count].score[2]) / 3;
count++; // 学生计数器加1
}
}
for (int i = 0; i < count; i++) { // 计算名次
stu[i].rank = 1; // 初始化名次为1
for (int j = 0; j < count; j++) {
if (stu[j].avg_score > stu[i].avg_score) { // 比较平均分
stu[i].rank++; // 名次加1
} else if (stu[j].avg_score == stu[i].avg_score && j < i) {
stu[i].rank++; // 平均分相同时,比较学生编号,所以名次加1
}
}
}
// 冒泡排序,按照名次从小到大排序
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (stu[j].rank > stu[j+1].rank) {
struct Student tmp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = tmp;
}
}
}
// 写入文件并输出
fprintf(fp_write, "姓名\t\t成绩1\t成绩2\t成绩3\t平均分\t名次\n");
for (int i = 0; i < count; i++) {
fprintf(fp_write, "%-16s%.2f\t%.2f\t%.2f\t%.2f\t%d\n", stu[i].name, stu[i].score[0],
stu[i].score[1], stu[i].score[2], stu[i].avg_score, stu[i].rank);
printf("%-16s%.2f\t%.2f\t%.2f\t%.2f\t%d\n", stu[i].name, stu[i].score[0],
stu[i].score[1], stu[i].score[2], stu[i].avg_score, stu[i].rank);
}
fclose(fp_read); // 关闭读取文件
fclose(fp_write); // 关闭写入文件
return 0;
}
```
以上代码将从 "d:\st.txt" 中读取学生信息,计算每个学生三门功课的平均分,并按照平均分排列名次。如果平均分相同,则名次并列。最后,将结果写入 "d:\st_out.txt" 文件,并按照指定格式输出到终端。请按要求修改文件路径及格式。
阅读全文