实验目的
一、进一步熟悉C 语言中函数的编程方法;
二、进一步掌握C 语言中函数定义和调用方法;
三、学习和掌握结构体的定义和使用方法。
实验内容
本次实验要求定义5个函数,编写主函数调用自定义函
数进行验证。
- 定义一个 student 结构体如下:
struct student {
char name[20]; /姓名/
float score[4]; /四门功课的成绩/
float average; /四门功课的平均成绩/
};
其中,name 中存放同学的姓名;score[4]数组中存放同学的英语、数学、物理、化学成绩;average中存放上述四门功课的平均成绩。
- 编写下面5个函数。函数的具体要求:
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 为数组中元素的个数。
提示:两学生信息的交换参见第11章PPT中的第16个幻灯片。
3)编写主函数对你所编写的上述4个函数进行调用验证。主函数应有以下功能:
①利用结构体类型struct student定义5 个学生的结构体数组student_info [5];
②调用函数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的2个输入参数分别为数组名student_info和5(实参)。
③调用函数averageScore 求出每位学生的平均成绩。函数averageScore的输入参数分别为数组名student_info和5。
④调用函数outputToScreen 将每个学生的信息显示到屏幕上。函数outputToScreen的输入参数分别为数组名student_info和5。
⑤调用函数sortByAverageScore 根据学生的平均成绩对学生信息进行排序。函数sortByAverageScore的输入参数分别为数组名student_info和5。
⑥调用函数outputToScreen 将排序后的学生完整信息显示到屏幕上。
实验代码
#include<stdio.h>
#include<string.h>
struct student {
char name[20];
float score[4];
float average;
};
void inputFromKeyboard(struct student stu[], int num) {
printf("请输入%d个学生的姓名和四门功课成绩:\n",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);
}
}
void averageScore(struct student stu[], int num) {
int i;
float sum;
for (i = 0; i < num; i++) {
sum = 0;
for (int j = 0; j < 4; j++) {
sum += stu[i].score[j];
}
stu[i].average = sum / 4.0;
}
}
int compare(struct student stu1, struct student stu2) {
if (stu1.average > stu2.average) return 1;
return 0;
}
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 - i - 1; j++) {
if (compare(stu[j + 1], stu[j])) {
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
}
int main() {
struct student student_info[5];
inputFromKeyboard(student_info, 5);
averageScore(student_info, 5);
printf("\n");
outputToScreen(student_info, 5);
sortByAverageScore(student_info, 5);
printf("\n排序后学生的信息:\n");
outputToScreen(student_info, 5);
return 0;
}