本关任务:假设有若干学生,每个学生有3门功课,从键盘上输入学生有关信息(学号、姓名、成绩),并计算其平均成绩,将原有数据和平均分保存在磁盘文件record中。具体要求如下: 学生有关信息采用结构体类型存储。 fwrite()函数实现数据块输出到文件record。 结合循环结构实现数据输入和输出。
时间: 2024-02-22 11:57:25 浏览: 60
好的,让我来帮你解决这个问题。
以下是可以实现上述功能的C语言代码:
```c
#include <stdio.h>
#define MAX_STUDENT 50 // 最大学生数
// 定义学生结构体
struct student {
int id;
char name[20];
float score[3];
float avg_score;
};
int main() {
struct student stu[MAX_STUDENT];
int num = 0; // 实际学生数
FILE *fp; // 文件指针
int i, j;
// 输入学生信息
while (1) {
printf("请输入学生%d的信息,格式为:学号 姓名 成绩1 成绩2 成绩3(用空格分隔),输入-1结束:\n", num+1);
scanf("%d", &stu[num].id);
if (stu[num].id == -1) {
break;
}
scanf("%s%f%f%f", stu[num].name, &stu[num].score[0], &stu[num].score[1], &stu[num].score[2]);
num++;
if (num == MAX_STUDENT) {
printf("已达到最大学生数,停止输入。\n");
break;
}
}
// 计算平均分
for (i = 0; i < num; i++) {
float sum = 0;
for (j = 0; j < 3; j++) {
sum += stu[i].score[j];
}
stu[i].avg_score = sum / 3;
}
// 将学生信息输出到文件
fp = fopen("record", "wb");
if (fp == NULL) {
printf("打开文件失败!\n");
return 1;
}
fwrite(stu, sizeof(struct student), num, fp);
fclose(fp);
// 显示学生信息和平均分
printf("学生信息和平均分如下:\n");
for (i = 0; i < num; i++) {
printf("学号:%d\t姓名:%s\t成绩1:%4.1f\t成绩2:%4.1f\t成绩3:%4.1f\t平均分:%4.1f\n",
stu[i].id, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].avg_score);
}
return 0;
}
```
代码解释:
1. 定义了一个学生结构体,包含学号、姓名、3门成绩和平均分;
2. 使用循环结构,从键盘输入学生信息,如果输入-1则终止输入;
3. 计算每个学生的平均分;
4. 使用fwrite()函数将学生信息输出到文件record中;
5. 最后,显示学生信息和平均分。
注意事项:
1. 代码中使用了#define定义了最大学生数,可以根据需要修改。
2. 文件操作中,使用"wb"表示以二进制写入方式打开文件,如果文件不存在则创建,如果文件已存在则清空文件内容。
3. 在使用fwrite()函数输出学生信息时,第一个参数为待输出数据的起始地址,第二个参数为每个数据块的大小,第三个参数为数据块的个数,第四个参数为输出文件指针。在本代码中,第一个参数为结构体数组的首地址,第二个参数为结构体的大小,第三个参数为实际学生数。
4. 在输出学生信息时,使用printf()函数按格式输出即可。
希望可以帮助到你,有任何问题欢迎随时提出。
阅读全文