请使用C语言和上述的student.h和data1.txt编程:使用附件提供的student.h中的学生基本信息表类型Student建立Student数组a,从附件提供的data1.txt文本文件中读入下表中6个学生的7列信息项到Student数组a中,计算这些学生的成绩之和保存到数组a的总分中,将数组a按总分从大到小排序,创建名为data2.txt的文本文件,将排序后的数组a的6个学生的8列信息项以空格分隔、一行一个学生写入该文件中。执行程序后,找到data2.txt文件用记事本打开查看结果。
时间: 2024-03-17 11:41:12 浏览: 76
以下是实现上述功能的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
#define N 6 // 学生个数
/* 从文件中读取学生信息 */
void read_student_info(Student a[])
{
FILE *fp;
if ((fp = fopen("data1.txt", "r")) == NULL) {
printf("File open error!\n");
exit(0);
}
for (int i = 0; i < N; i++) {
inputstud1(&a[i]); // 逐行输入学生信息
}
fclose(fp);
}
/* 计算学生总分 */
void calc_total_score(Student a[])
{
for (int i = 0; i < N; i++) {
int total = 0;
for (int j = 0; j < 3; j++) {
total += a[i].grade[j];
}
a[i].grade[3] = total; // 总分保存在a[i].grade[3]中
}
}
/* 按总分从大到小排序 */
void sort_by_total_score(Student a[])
{
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
if (a[i].grade[3] < a[j].grade[3]) {
Student tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}
/* 写入排序后的学生信息到文件 */
void write_student_info(Student a[])
{
FILE *fp;
if ((fp = fopen("data2.txt", "w")) == NULL) {
printf("File open error!\n");
exit(0);
}
for (int i = 0; i < N; i++) {
fprintf(fp, "%s %s %s %d-%d-%d %d %d %d %d\n", a[i].no, a[i].name, a[i].sex,
a[i].birth.y, a[i].birth.m, a[i].birth.d, a[i].grade[0], a[i].grade[1],
a[i].grade[2], a[i].grade[3]);
}
fclose(fp);
}
int main()
{
Student a[N];
read_student_info(a); // 从文件中读取学生信息
calc_total_score(a); // 计算学生总分
sort_by_total_score(a); // 按总分从大到小排序
write_student_info(a); // 写入排序后的学生信息到文件
printf("Done!\n");
return 0;
}
```
执行程序后,会在当前目录下生成一个名为data2.txt的文件,其中包含了排序后的学生信息,格式与data1.txt文件相同。可以使用记事本等工具打开查看。
阅读全文