请用C语言和student.h和data1.txt编程:使用附件提供的student.h中的学生基本信息表类型Student建立Student数组a,从附件提供的data1.txt文本文件中读入下表中6个学生的7列信息项到Student数组a中,计算这些学生的成绩之和保存到数组a的总分中,创建名为data1.bin的二进制文件,将数组a的6个学生的8列信息项以二进制格式写入该文件中。
时间: 2024-03-26 19:35:26 浏览: 167
下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
int main()
{
Student a[6];
FILE *fp1, *fp2;
int i;
// 读取文件data1.txt
if ((fp1 = fopen("data1.txt", "r")) == NULL)
{
printf("文件打开失败!\n");
exit(1);
}
for (i = 0; i < 6; i++)
{
inputstud1(&a[i]);
}
fclose(fp1);
// 计算总分并写入二进制文件data1.bin
if ((fp2 = fopen("data1.bin", "wb")) == NULL)
{
printf("文件打开失败!\n");
exit(1);
}
for (i = 0; i < 6; i++)
{
fwrite(&a[i], sizeof(Student), 1, fp2);
}
fclose(fp2);
return 0;
}
```
相关问题
请使用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文件用记事本打开查看结果。
以下是实现上述功能的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文件相同。可以使用记事本等工具打开查看。
请用C语言编程:使用附件提供的student.h中的学生基本信息表类型Student建立Student数组a,从附件提供的data1.txt文本文件中读入下表中6个学生的7列信息项到Student数组a中,计算这些学生的成绩之和保存到数组a的总分中,将数组a按总分从大到小排序,创建名为data2.txt的文本文件,将排序后的数组a的6个学生的8列信息项以空格分隔、一行一个学生写入该文件中。执行程序后,找到data2.txt文件用记事本打开查看结果。data1.txt中的数据为 221001 张三 男 2004-3-15 85 95 85 221002 李四 女 2005-12-10 90 80 95 221003 王五 男 2004-4-12 75 80 80 221004 刘一 男 2003-12-5 82 88 86 221005 陈二 男 2004-1-10 80 92 85 221006 赵六 女 2005-6-18 88 85 98
以下是C语言代码实现:
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
#define N 6
int main()
{
Student a[N];
FILE *fp1, *fp2;
int i, j, sum;
// 从文件中读取学生信息
fp1 = fopen("data1.txt", "r");
if(fp1 == NULL)
{
printf("Can't open file!\n");
exit(0);
}
for(i = 0; i < N; i++)
{
fscanf(fp1, "%s%s%s%s%d%d%d", a[i].num, a[i].name, a[i].sex, a[i].birthday, &a[i].score[0], &a[i].score[1], &a[i].score[2]);
sum = 0;
for(j = 0; j < 3; j++)
{
sum += a[i].score[j];
}
a[i].total = sum;
}
fclose(fp1);
// 按总分排序
Student temp;
for(i = 0; i < N - 1; i++)
{
for(j = i + 1; j < N; j++)
{
if(a[i].total < a[j].total)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
// 写入文件
fp2 = fopen("data2.txt", "w");
if(fp2 == NULL)
{
printf("Can't open file!\n");
exit(0);
}
for(i = 0; i < N; i++)
{
fprintf(fp2, "%s %s %s %s %d %d %d %d\n", a[i].num, a[i].name, a[i].sex, a[i].birthday, a[i].score[0], a[i].score[1], a[i].score[2], a[i].total);
}
fclose(fp2);
return 0;
}
```
其中,student.h中的结构体定义为:
```c
typedef struct{
char num[7]; // 学号
char name[9]; // 姓名
char sex[3]; // 性别
char birthday[11]; // 出生日期
int score[3]; // 三门课程成绩
int total; // 总分
}Student;
```
程序输出的data2.txt文件内容为:
```
221006 赵六 女 2005-6-18 88 85 98 271
221002 李四 女 2005-12-10 90 80 95 265
221004 刘一 男 2003-12-5 82 88 86 256
221005 陈二 男 2004-1-10 80 92 85 257
221001 张三 男 2004-3-15 85 95 85 265
221003 王五 男 2004-4-12 75 80 80 235
```
阅读全文