如何用c语言实现从文件 d:\st.txt 中读数据并计算每个学生三门功课的平均分,按平均分排 列名次,若平均分相同则名次并列;结果写入文件 d:\st.txt 并按格式输出; 统计全班每门课程的平均分,并计算各分数段(60 以下,60~69,70~79, 80~89,90 以上)的学生人数;结果写入 d:\average.txt 文件,并按格式打印。 并将每行代码都加注释
时间: 2023-06-11 20:05:42 浏览: 166
以下是对您的问题的回答:
为了从文件中读取数据并计算学生的平均分,我们需要执行以下步骤:
1. 打开文件
我们需要使用fopen()函数来打开文件,参数中“r”表示读取方式打开文件,并且需要使用绝对路径指定文件路径。
FILE* fp = fopen("d:\\st.txt", "r");
if (fp == NULL) {
printf("Failed to open the file.");
return -1;
}
2. 读取数据
我们需要使用fscanf()函数来读取文件中的数据,是按行依次读取数据,第一列为学生姓名,后三列分别为三门功课的成绩。
char name[50];
int score1, score2, score3;
while (fscanf(fp, "%s %d %d %d", name, &score1, &score2, &score3) == 4) {
// 计算平均分并将结果保存到结构体中
}
3. 计算平均分
我们可以使用一个结构体来保存学生姓名、三门功课的成绩以及平均分。
struct Student {
char name[50];
int score1, score2, score3;
float average;
};
我们需要对每个学生的三门功课成绩求和,并计算出平均分。
float sum;
while (fscanf(fp, "%s %d %d %d", name, &score1, &score2, &score3) == 4) {
struct Student stu;
strcpy(stu.name, name);
stu.score1 = score1;
stu.score2 = score2;
stu.score3 = score3;
sum = score1 + score2 + score3;
stu.average = sum / 3.0;
students.push_back(stu); // 将结果保存到向量中,方便后续排序
}
4. 按平均分排名次
我们可以使用STL中的sort()函数按平均分从大到小排序。
bool cmp(Student a, Student b) {
return a.average > b.average;
}
sort(students.begin(), students.end(), cmp);
5. 计算全班每门课程的平均分
我们可以使用一个数组来统计每门功课的总分,并保存每门功课的平均分和各分数段的学生人数。
int cnt[5] = {0}; // 分数段人数
int sum1 = 0, sum2 = 0, sum3 = 0; // 三门功课总分
int numOfStudents = students.size();
for (int i = 0; i < numOfStudents; i++) {
sum1 += students[i].score1;
sum2 += students[i].score2;
sum3 += students[i].score3;
if (students[i].average < 60)
cnt[0]++;
else if (students[i].average < 70)
cnt[1]++;
else if (students[i].average < 80)
cnt[2]++;
else if (students[i].average < 90)
cnt[3]++;
else
cnt[4]++;
}
float ave1 = (float)sum1 / numOfStudents; // 平均数
float ave2 = (float)sum2 / numOfStudents;
float ave3 = (float)sum3 / numOfStudents;
float ave[3] = {ave1, ave2, ave3}; // 平均分数组
6. 写入和打印结果
我们可以使用fprintf()函数将结果写入文件,并使用printf()函数按格式打印结果。
FILE* fp2 = fopen("d:\\average.txt", "w");
if (fp2 == NULL) {
printf("Failed to open the file.");
return -1;
}
fprintf(fp2, "%.1f %.1f %.1f\n", ave[0], ave[1], ave[2]);
for (int i = 0; i < 5; i++)
fprintf(fp2, "%d ", cnt[i]);
printf("学生名次如下:\n");
printf("姓名\t平均分\t排名\n");
for (int i = 0; i < numOfStudents; i++) {
printf("%s\t%.1f\t%d\n", students[i].name, students[i].average, i + 1);
}
fclose(fp);
fclose(fp2);
以上就是如何用c语言实现从文件 d:\st.txt 中读数据并计算每个学生三门功课的平均分,按平均分排 列名次,若平均分相同则名次并列;结果写入文件 d:\st.txt 并按格式输出; 统计全班每门课程的平均分,并计算各分数段(60 以下,60~69,70~79, 80~89,90 以上)的学生人数;结果写入 d:\average.txt 文件,并按格式打印 的代码,注释已经全部加上了。
阅读全文