实验目的
一、 进一步掌握C语言的编程方法;
二、 进一步掌握数组的定义与使用;
三、 进一步掌握函数的定义和函数调用方法;
四、 学习和掌握结构体的定义和使用方法;
五、 学习和掌握文件的基本输入输出方法;
实验内容
编写一个通过键盘或文件输入学生信息,并将学生信息输出到文件和屏幕的程序。本次实验需要定义7个函数,其中,5个函数与实验十四一致(可直接使用实验十三编写的函数,或参考“优秀案例”中的相关程序),另外需要新编2个函数。程序的具体要求如下:
- 定义一个 student 结构体如下:
struct student {
char name[20]; /姓名/
float score[4]; /四门功课的成绩/
float average; /四门功课的平均成绩/
};
其中,name 中存放学生的姓名;score[4]数组中存放学生的英语、数学、物理、化学成绩;average中存放上述四门功课的平均成绩。
- 编写下面7个函数(前5个为实验十四中的函数,后2个为新编函数)。函数的具体要求:
void inputFromKeyboard(struct student stu[], int num)
从键盘输入学生信息的函数。stu 为结构体数组,num 为数组中元素的个数。
void outputToScreen(struct student stu[], int num)
将学生信息(姓名、各科成绩和平均成绩)输出到屏幕的函数。stu 为结构体数组,num 为数组中元素的个数(或学生人数)。
void averageScore(struct student stu[], int num)
计算学生平均成绩的函数。stu 为结构体数组,num 为数组中元素的个数。
int compare(struct student stu1, struct student stu2)
对两个学生的平均成绩进行比较。若学生1的平均成绩高于学生2,返回值为1,否则返回值为0。stu1 和stu2为两个结构体变量,分别代表学生1和学生2。
void sortByAverageScore(struct student stu[], int num)
根据学生的平均成绩对学生信息整体排序的函数,其中两学生成绩比较要求调用函数compare。stu 为结构体数组,num 为数组中元素的个数。
void inputFromFile(struct student stu[], int num, FILE *fp)
从文件输入学生信息(姓名、各科成绩和平均成绩)的函数。stu 为结构体数组,num 为数组中元素的个数,fp 为文件指针。(注:文件的打开和关闭放在主函数中,fp为以“读”方式打开的文本文件指针)。
void outputToFile(struct student stu[], int num, FILE *fp)
将学生信息(姓名、各科成绩和平均成绩)输出到文件的函数。stu 为结构体数组,num 为数组中元素的个数,fp 为文件指针。(注:文件的打开和关闭放在主函数中,fp为以“写”方式打开的文本文件指针)。
3)编写主函数对你所编写的上述7个函数进行调用验证。主函数应有以下功能(注意:文件的打开与关闭放在主函数中):
①利用结构体类型struct student定义结构体数组student_info[5]和结构体数组student_info1[5]; 同时用FILE定义文件指针fp;
②调用函数inputFromKeyboard由键盘输入学生的信息( 姓名、英语、数学、物理、化学成绩 )。5名学生信息可能如下:
孙颖莎 88.0 76.0 78.0 77.0
王曼昱 98.0 67.0 79.0 65.0
王艺迪 89.0 79.0 85.0 79.0
陈梦 90.0 95.0 97.0 85.0
钱天一 86.0 83.0 82.0 75.0
注:函数inputFromKeyboard输入参数为student_info和5
③调用函数averageScore求出每位学生的平均成绩;
注:函数averageScore输入参数为student_info和5;
④并以文本“写”方式打开文本student1.txt文件,调用函数outputToFile,将这5个同学的信息存入student1.txt 文本文件,关闭该文件;
注:函数outputToFile输入参数为student_info、5和已打开的文件指针fp。
⑤以文本“读”方式打开文本 student1.txt 文件,调用函数inputFromFile,将这5个同学的信息读入并存放到结构体数组student_info1中,关闭该文件;
注:函数inputFromFile输入参数为student_info1、5和已打开的文件指针fp。
⑥调用函数outputToScreen 将输入的学生信息(姓名、各科成绩和平均成绩)显示到屏幕上。
注:函数outputToScreen输入参数为student_info1和5;
⑦调用函数sortByAverageScore 根据学生的平均成绩对学生信息进行排序。
注:函数sortByAverageScore输入参数为student_info1和5;
⑧以文本“写”方式打开文本student2.txt文件,调用函数outputToFile,将排好后的学生信息存入student2.txt 文本文件,关闭该文件;
注:函数outputToFile输入参数为student_info1、5和已打开的文件指针fp。
⑨调用函数outputToScreen将排好后的学生信息显示到屏幕上。
注:函数outputToScreen输入参数为student_info1和5;
在程序执行后,使用windows的“记事本”文本编辑器打开文本文件student1.txt 和student2.txt查看是否正确。
实验代码
#include <stdio.h>
#include <stdlib.h>
struct student {
char name[20];
float score[4];
float average;
};
void inputFromKeyboard(struct student stu[], int num) {
int i;
for (i = 0; i < num; i++) {
scanf("%s %f %f %f %f", stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
}
}
void outputToScreen(struct student stu[], int num) {
int i;
printf("姓名\t英语\t数学\t物理\t化学\t平均成绩\n");
for (i = 0; i < num; i++) {
printf("%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].average);
}
printf("\n");
}
void averageScore(struct student stu[], int num) {
int i;
for (i = 0; i < num; i++) {
stu[i].average = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2] + stu[i].score[3]) / 4;
}
}
int compare(struct student stu1, struct student stu2) {
return stu1.average > stu2.average;
}
void sortByAverageScore(struct student stu[], int num) {
struct student temp;
int i, j;
for (i = 0; i < num - 1; i++) {
for (j = 0; j < num - 1 - i; j++) {
if (!compare(stu[j], stu[j + 1])) {
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
}
void inputFromFile(struct student stu[], int num, FILE* fp) {
int i;
for (i = 0; i < num; i++) {
fscanf(fp, "%s %f %f %f %f %f", stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3], &stu[i].average);
}
}
void outputToFile(struct student stu[], int num, FILE* fp) {
int i;
for (i = 0; i < num; i++) {
fprintf(fp, "%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].average);
}
}
int main() {
struct student student_info[5], student_info1[5];
FILE* fp;
inputFromKeyboard(student_info, 5);
averageScore(student_info, 5);
fp = fopen("student1.txt", "w");
outputToFile(student_info, 5, fp);
fclose(fp);
fp = fopen("student1.txt", "r");
inputFromFile(student_info1, 5, fp);
fclose(fp);
outputToScreen(student_info1, 5);
sortByAverageScore(student_info1, 5);
fp = fopen("student2.txt", "w");
outputToFile(student_info1, 5, fp);
fclose(fp);
outputToScreen(student_info1, 5);
return 0;
}
实验结果