假设有若干学生,每个学生有3门功课,从键盘上输入学生有关信息(学号、姓名、成),并计算其平均成绩,将原有数据和平均分保存在磁盘文件record中。具体要求如下: ●学生有关信息采用结构体类型存储。 fwrite()函数实现数据块输出到文件record。 •结合循环结构实现数据输入和输出。
时间: 2024-01-21 14:16:57 浏览: 69
以下是一个示例程序,可以实现输入学生信息,计算平均成绩并保存到文件中:
```c
#include <stdio.h>
#define MAX_STUDENTS 100
typedef struct {
int id;
char name[20];
float score[3];
float avg;
} Student;
int main() {
Student students[MAX_STUDENTS];
int num_students = 0;
// 输入学生信息
printf("请输入学生信息,每行格式为:学号 姓名 成绩1 成绩2 成绩3\n");
printf("输入 end 结束输入。\n");
while (num_students < MAX_STUDENTS) {
int id;
char name[20];
float score[3];
printf("请输入第%d个学生的信息:", num_students + 1);
if (scanf("%d", &id) != 1 || id == -1) {
break;
}
scanf("%s %f %f %f", name, &score[0], &score[1], &score[2]);
students[num_students].id = id;
strcpy(students[num_students].name, name);
students[num_students].score[0] = score[0];
students[num_students].score[1] = score[1];
students[num_students].score[2] = score[2];
num_students++;
}
// 计算平均成绩
for (int i = 0; i < num_students; i++) {
float sum = 0;
for (int j = 0; j < 3; j++) {
sum += students[i].score[j];
}
students[i].avg = sum / 3;
}
// 输出到文件
FILE *fp = fopen("record.dat", "wb");
if (fp == NULL) {
printf("无法打开文件 record.dat\n");
return 1;
}
fwrite(&num_students, sizeof(int), 1, fp);
fwrite(students, sizeof(Student), num_students, fp);
fclose(fp);
// 从文件中读取数据并输出
fp = fopen("record.dat", "rb");
if (fp == NULL) {
printf("无法打开文件 record.dat\n");
return 1;
}
int num_students_read;
fread(&num_students_read, sizeof(int), 1, fp);
Student students_read[MAX_STUDENTS];
fread(students_read, sizeof(Student), num_students_read, fp);
fclose(fp);
printf("从文件中读取的数据:\n");
for (int i = 0; i < num_students_read; i++) {
printf("%d %s %.1f %.1f %.1f %.1f\n", students_read[i].id,
students_read[i].name, students_read[i].score[0],
students_read[i].score[1], students_read[i].score[2],
students_read[i].avg);
}
return 0;
}
```
在这个程序中,我们首先定义了一个结构体类型 `Student`,用来存储每个学生的信息。然后在 `main()` 函数中定义了一个数组 `students`,用来存储所有学生的信息。我们通过一个循环结构,不断从键盘输入学生信息,直到输入 end 或者达到最大学生数。每输入一个学生的信息,就将其存储到数组 `students` 的相应位置上。在输入完所有学生信息后,我们再通过循环遍历 `students` 数组,计算每个学生的平均成绩,并将其保存到 `avg` 字段中。
接下来,我们使用 `fwrite()` 函数将学生信息输出到文件 `record.dat` 中。我们首先打开文件,然后先将学生数目写入文件中,再将整个 `students` 数组写入文件中。注意,我们使用二进制模式打开文件,并且将学生数目和学生信息都以二进制形式写入文件中。
最后,我们再使用 `fread()` 函数从文件中读取数据,并输出到屏幕上。我们先从文件中读取学生数目,然后定义一个新的数组 `students_read`,用来存储从文件中读取的学生信息。我们再使用 `fread()` 函数读取整个 `students_read` 数组,并逐个输出每个学生的信息。注意,在读取文件时,我们也需要使用二进制模式打开文件,并且将读取到的数据以二进制形式读取出来。
阅读全文