相对于V1.0,有如下改动:
1.由struct类型替换成了class类型并进行封装
2.添加了新的接口函数add()
3.将接口函数更改为Sales_data的友元函数
4.添加了能够使Sales_data进行初始化的构造函数
#include<iostream>
#include<string>
#include<Windows.h>
using namespace std;
class Sales_data {
friend istream &read(istream&, Sales_data&);
friend ostream &print(ostream&, Sales_data&);
friend Sales_data add(Sales_data&, Sales_data&);
public:
Sales_data() = default;
Sales_data(const string &s) :bookNo(s) {};
Sales_data(const string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(p) {};
Sales_data(istream &is) { read(is, *this); }
Sales_data& Sales_data::combine(const Sales_data &rhs) {
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
string Sales_data::isbn() const { return bookNo; }
private:
double Sales_data::avg_price() const { return units_sold ? revenue / units_sold : 0; }
unsigned units_sold = 0;
double revenue = 0.0;
string bookNo;
};
istream &read(istream &div, Sales_data& a)
{
double price = 0;
div >> a.bookNo >> a.units_sold >> price;
a.revenue = price*a.units_sold;
return div;
}
ostream &print(ostream &div, Sales_data& a)
{
div << a.bookNo << " " << a.units_sold << " " << a.revenue << " " << a.avg_price();
return div;
}
Sales_data add(Sales_data &a, Sales_data &b)
{
Sales_data c = a;
if (a.isbn() == b.isbn())
{
c.combine(b);
}
return c;
}
int main()
{
Sales_data total(cin);//使用istream为参数的构造函数初始化total
Sales_data trans;
while (read(cin, trans)) {
if (total.isbn() == trans.isbn())
total.combine(trans);
else {
print(cout, total);
cout << endl;
total = trans;
}
}
print(cout, total);
cout << endl;
system("pause");
return 0;
}