C++ 项目实战书店销售记录统计程序(十)
一、问题描述
我们希望实现一个程序:
从文件中读取若干条销售记录,按照 ISBN 归类,统计每本书的总销量、总销售额以及平均售价。
数据要求:
- 每条销售记录包括:
ISBN 售出册数 单价
- 同一个 ISBN 的记录 在输入中是连续出现的
二、设计思路
程序中我们使用两个 Sales_item
类型的变量:
变量名 | 作用 |
---|---|
total | 保存当前 ISBN 的累计数据 |
trans | 用于读取每一条新的销售记录 |
程序逻辑:
- 尝试读取第一条记录并存入
total
; - 如果读取成功,进入循环读取剩余数据;
- 每读取一条记录:
- 若
trans.isbn()
等于total.isbn()
,合并记录; - 否则,输出当前
total
,并将其更新为trans
;
- 若
- 所有数据读取完后,输出最后一条
total
。
三、程序源码
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item total; // 保存当前 ISBN 的累计销售数据
// 1. 读取第一条记录,并检查输入是否成功
if (std::cin >> total) {
Sales_item trans; // 保存当前读取的销售记录
// 2. 读取剩余记录
while (std::cin >> trans) {
if (total.isbn() == trans.isbn()) {
total += trans; // 合并数据
} else {
std::cout << total << std::endl; // 输出上一 ISBN 的结果
total = trans; // 开始统计新的 ISBN
}
}
// 3. 输出最后一本书的统计结果
std::cout << total << std::endl;
} else {
// 4. 无输入数据,打印错误信息
std::cerr << "No data?!" << std::endl;
return -1;
}
return 0;
}
四、输入示例
0-201-70353-X 2 24.99
0-201-70353-X 3 24.99
0-201-88954-X 1 30.00
五、输出结果
0-201-70353-X 5 124.95 24.99
0-201-88954-X 1 30.00 30.00
六、关键知识点回顾
输入流控制循环
while (std::cin >> trans)
这是 C++ 中读取不定数量输入的标准方式。
成员函数调用
total.isbn()
通过成员函数访问 Sales_item
对象的 ISBN,而不直接访问内部数据。
运算符重载:+=
total += trans;
用于将两条销售记录合并(前提是 ISBN 相同)。
七、总结
这个程序是对 C++ 基础语法的综合应用:
- ✔️ 类的使用与封装
- ✔️ 成员函数的调用
- ✔️ 输入输出流处理
- ✔️ 条件语句和循环
- ✔️ 运算符重载应用
它是一个很适合入门 C++ 项目实战的案例,也为后续学习文件流、容器(如 map
)、算法等内容打下了基础。