练习7.11
头文件:
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
using namespace std;
struct Sales_data {
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*n){}
Sales_data(std::istream &);
//定义isbn成员函数
std::string isbn() const { return bookNo; }
//声明combine成员函数
Sales_data& combine(const Sales_data&);
//声明avg_price成员函数
double avg_price() const;
//其他数据成员
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0;
};
istream& read(istream& is, Sales_data& item);
ostream& print(ostream& os, const Sales_data& item);
Sales_data add(const Sales_data& lhs, const Sales_data& rhs);
#endif
保存函数定义的源文件:
#include <iostream>
#include <vector>
#include <string>
#include "Sales_data.h"
using namespace std;
double Sales_data::avg_price() const {
if (units_sold)
return revenue / units_sold;
else
return 0;
}
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
istream& read(istream& is, Sales_data& item) {
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
ostream& print(ostream& os, const Sales_data& item) {
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
Sales_data add(const Sales_data& lhs, const Sales_data& rhs)
{
Sales_data sum = lhs;
sum.combine(rhs);
return sum;
}
Sales_data::Sales_data(istream& is) {
read(is, *this);
}
调用构造函数的源文件:
int main() {
Sales_data a;
print(cout,a) << endl; //空字符串 0 0 0
Sales_data b("PORT", 4, 6);
print(cout, b) << endl; //PORT 4 24 6
Sales_data c(cin);
print(cout, c);
}
练习7.12
struct Sales_data
{
Sales_data(istream& is)
{ read(is, *this); }
}
练习7.13
#include <iostream>
#include <vector>
#include <string>
#include "Sales_data.h"
using namespace std;
int main() {
Sales_data total(cin);//保存下一条交易记录的变量
//读入第一条交易记录,并确保有数据可以处理
if (cin)
{
Sales_data trans(cin);
do {
//如果我们在处理相同的书
if (total.isbn() == trans.isbn()) {
total.combine(trans);
}
else {
//打印前一笔交易的次数
print(cout, total) << endl;
total = trans;
}
} while (read(cin, trans));
print(cout, total) << endl;
}
else {
//没有输入
cerr << "No data?" << endl;
return -1;
}
return 0;
Sales_data a;
print(cout,a) << endl; //空字符串 0 0 0
Sales_data b("PORT", 4, 6);
print(cout, b) << endl; //PORT 4 24 6
Sales_data c(cin);
print(cout, c);
}