使用 Sales_data 类实现交易合并(三十)
1. Sales_data 类定义
假设 Sales_data 类定义在头文件 Sales_data.h 中,其基本定义如下:
// Sales_data.h
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data {
std::string bookNo; // ISBN 编号
unsigned units_sold = 0; // 售出数量,默认初始化为 0
double revenue = 0.0; // 销售收入,默认初始化为 0.0
};
#endif // SALES_DATA_H
该结构体通过类内初始值确保每个 Sales_data 对象创建时各数据成员具有合理的默认值。
2. 使用 Sales_data 类实现交易合并
下面的示例程序展示了如何使用 Sales_data 类进行交易合并操作。程序主要分为以下几个部分:
- 包含必要的头文件;
- 声明 Sales_data 对象,用于分别存储两笔交易数据;
- 从标准输入中读入每笔交易的 ISBN、销售数量和单价,并计算销售收入;
- 检查两笔交易的 ISBN 是否一致;如果一致则计算合计销售量、总销售额和平均价格,并输出;否则输出错误提示。
2.1 示例代码
#include <iostream>
#include <string>
#include "Sales_data.h"
int main() {
Sales_data data1, data2; // 用于存储两笔交易
double price = 0.0; // 用于临时存储单价
// 读入第一笔交易:ISBN、销售数量、单价
std::cin >> data1.bookNo >> data1.units_sold >> price;
// 计算第一笔交易的销售收入
data1.revenue = data1.units_sold * price;
// 读入第二笔交易:ISBN、销售数量、单价
std::cin >> data2.bookNo >> data2.units_sold >> price;
// 计算第二笔交易的销售收入
data2.revenue = data2.units_sold * price;
// 检查两笔交易的 ISBN 是否相同
if (data1.bookNo == data2.bookNo) {
// 计算合计销售量和销售收入
unsigned totalCnt = data1.units_sold + data2.units_sold;
double totalRevenue = data1.revenue + data2.revenue;
// 输出合并后的结果:ISBN、总销售量、总销售额
std::cout << data1.bookNo << " "
<< totalCnt << " "
<< totalRevenue << " ";
// 输出平均价格(若总销售量不为 0)
if (totalCnt != 0)
std::cout << totalRevenue / totalCnt << std::endl;
else
std::cout << "(no sales)" << std::endl;
return 0; // 成功标志
} else {
// 两笔交易的 ISBN 不一致,输出错误信息
std::cerr << "Data must refer to the same ISBN" << std::endl;
return -1; // 失败标志
}
}
2.2 程序说明
-
包含头文件
程序首先包含了<iostream>
和<string>
,以及自定义数据结构 Sales_data.h。由于 Sales_data 中使用了 string 类型,所以必须包含<string>
。 -
读取数据
程序定义了两个 Sales_data 对象data1
和data2
,用来存储两笔交易记录。通过std::cin
分别读取每笔交易的 ISBN(存储到bookNo
)、销售数量(存储到units_sold
)和单价(存储到临时变量price
)。然后,程序通过乘法计算出每笔交易的销售收入,并存储到revenue
成员中。 -
检查 ISBN 并求和
程序比较data1.bookNo
和data2.bookNo
,如果两者相同,则计算两笔交易的总销售数量和总销售收入,并进一步计算平均价格。如果总销售量为零,则输出 “(no sales)”;否则输出平均价格。 -
错误处理
如果两笔交易的 ISBN 不一致,则输出错误信息,并返回错误码 -1。
3. 小结
-
数据结构定义
使用 struct 定义 Sales_data 类型,将相关数据成员(ISBN、销售数量、销售收入)组合在一起,并利用类内初始值保证默认初始化。 -
分步处理交易数据
程序首先读取交易记录,再计算每笔交易的销售收入。然后检查 ISBN 是否一致,若一致则进行合并统计,否则输出错误信息。 -
代码组织
将 Sales_data 的定义放在单独的头文件中有助于代码模块化和维护,使用者只需包含头文件即可使用该数据结构。
这种简单的 Sales_data 使用示例为后续更复杂的类设计与操作打下基础。在后续章节中,我们将进一步探讨如何为自定义数据结构添加操作成员、运算符重载以及与模板相关的高级特性。
参考资料
- 《C++ Primer》关于 struct 和类的基本概念
- 各大 C++ 编码规范和示例程序
通过这篇示例,我们可以看到如何利用自定义数据结构处理实际问题,并为以后的 C++ 面向对象编程积累经验。