练习11:使用对象数组管理学生信息¶
任务描述¶
设计 Student 类,并使用最多容纳 5 条记录的全局学生对象数组管理学生信息。实现添加学生记录、输出全部记录和计算平均成绩三个普通函数。
本题将综合练习带参构造函数的调用、对象数组的初始化,以及通过对象数组访问对象成员。
相关知识¶
带参构造函数与对象创建¶
定义对象时传入实参,会自动调用与参数匹配的构造函数:
构造函数不能像普通成员函数一样由对象直接调用;它只能在对象创建时自动执行。
对象数组¶
对象数组会在创建时为每个元素调用构造函数。若类没有无参构造函数,则需要为每个数组元素提供构造参数:
本题的 Student 类只要求提供带参构造函数,因此全局数组的 5 个元素都应使用上述方式初始化。studentCount 记录当前已添加的学生数量,添加时将新记录存入 students[studentCount]。
对象数组元素的访问¶
数组下标运算符 [] 先选中对象,再用 . 访问该对象的公有成员:
平均成绩与输出精度¶
计算平均值时,应使用 float 或 double 保存结果,避免整数除法丢失小数部分。使用 <iomanip> 中的 std::fixed 和 std::setprecision(4) 可使平均成绩固定输出 4 位小数。
编程要求¶
- 使用 C++11 标准编写程序。
- 在
Student.h中声明Student类。学号、姓名、分数均为公有数据成员:
- 在类中声明公有带参构造函数:
- 在
Student.h中声明以下普通函数:
- 在
Student.cpp中定义一个最多容纳 5 个元素的全局Student对象数组,以及记录当前学生数的计数变量。 -
完成三个普通函数:
-
Add:在学生表末尾添加一条记录; PrintAll:按“学号 姓名 成绩”的格式逐行输出已添加记录;-
Average:计算已添加学生的平均成绩,并按“平均成绩 计算结果”的格式输出,保留 4 位小数。 -
本题测试数据不超过 5 条记录。
test函数使用std::ostringstream捕获PrintAll与Average的输出,并用assert验证结果。 - 在
main函数中调用test。
待完成代码¶
Student.h¶
Student.cpp¶
main.cpp¶
#include "Student.h"
#include <cassert>
#include <iostream>
#include <sstream>
void test() {
Add(0, "李红霞", 96.0f);
Add(1, "张如雪", 85.0f);
Add(2, "刘俊民", 76.0f);
std::ostringstream output;
std::streambuf* oldBuffer = std::cout.rdbuf(output.rdbuf());
PrintAll();
Average();
std::cout.rdbuf(oldBuffer);
assert(output.str() ==
"0 李红霞 96\n"
"1 张如雪 85\n"
"2 刘俊民 76\n"
"平均成绩 85.6667\n");
}
int main() {
test();
std::cout << "本关测试通过" << std::endl;
return 0;
}
测试说明¶
按顺序添加以下三条记录:(0, 李红霞, 96)、(1, 张如雪, 85)、(2, 刘俊民, 76)。预期输出为:
平均值的计算为 (96 + 85 + 76) / 3 = 85.6667(保留 4 位小数)。可使用以下命令编译三个文件:
开始你的任务吧,祝你成功!