练习20:使用 vector 管理学生分数¶
任务描述¶
设计分数表类 ScoreList,使用 std::vector<int> 动态保存任意数量的分数,并实现添加分数、计算平均分和输出全部分数的功能。
相关知识¶
vector 与动态数组¶
std::vector 是可自动扩容的动态数组容器。与手动使用 new[]/delete[] 相比,它会自动管理内存,通常更安全方便。
vector 常用操作¶
push_back(value):在末尾添加元素;size():获取元素数量;operator[]:通过下标访问元素。
遍历时可使用范围 for 循环:
编程要求¶
- 使用 C++11 标准编写程序。
- 在
ScoreList.h中声明ScoreList类,私有成员为std::vector<int> scores。 - 声明并实现:
Add使用push_back添加分数;Average返回平均分。若列表为空,返回0.0。Print按“分数列表:90 85 76”的格式输出,元素间一个空格,末尾换行。- 在
test中添加三项分数,使用assert验证长度、平均分和输出。
待完成代码¶
ScoreList.h¶
#ifndef SCORE_LIST_H
#define SCORE_LIST_H
#include <cstddef>
#include <vector>
// TODO:声明 ScoreList 类
#endif
ScoreList.cpp¶
main.cpp¶
#include "ScoreList.h"
#include <cassert>
#include <iostream>
#include <sstream>
void test() {
ScoreList scores;
scores.Add(90);
scores.Add(85);
scores.Add(76);
assert(scores.Size() == 3);
assert(scores.Average() == (90.0 + 85.0 + 76.0) / 3.0);
std::ostringstream output;
std::streambuf* oldBuffer = std::cout.rdbuf(output.rdbuf());
scores.Print();
std::cout.rdbuf(oldBuffer);
assert(output.str() == "分数列表:90 85 76\n");
}
int main() {
test();
std::cout << "本关测试通过" << std::endl;
return 0;
}
测试说明¶
三项分数为 90、85、76,平均分为 251 / 3。预期输出:
开始你的任务吧,祝你成功!