练习7.6:对于add, read和print,定义你自己的版本。
答案:见Sales_data.h头文件
练习7.7:使用这些新函数重写7.1.2节(第233页)练习中的交易处理程序。
答:见云盘程序 练习7.7.cpp
练习7.8:为什么read函数将其Sales_data参数定义为普通的引用,而print将其参数定义成常量引用?
答:read里面涉及到revenue的计算,item.revenue被更新,因此定义为普通的引用。
而print里仅仅只是打印出需要打印的成员,不涉及成员变量的赋值。
练习7.9:对于7.1.2节(第233页)练习中的代码,添加读取和打印Person对象的操作。
答:答:见云盘程序 练习7.9.cpp
练习7.10:在下面if语句中,条件部分的作用是什么?
If(read(read(cin,data1),data2)
由内往外读read(cin,data1) ,向data1里输入内容
往外read(read(cin,data1),data2)首先将里面data1输入内容,如果data1的内容不空,再向data2输入内容,即将data1的内容输入到data2;
最外层判断 当两次读入的内容都不空时,即把data1的内容输入到data2,条件为真
练习7.6
/*
*练习7.6
*2015/7、1
*问题描述:练习7.6:对于add, read和print,定义你自己的版本。
*功能:完善之前的类,定义成一个头文件
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*
*/
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
using namespace std;
struct Sales_data{
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
string isbn() const {return bookNo;}
Sales_data& combine(const Sales_data&);
double avg_price() const;
};
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;
}
Sales_data add(const Sales_data&, const Sales_data&);
ostream &print(ostream&, const Sales_data&);
istream &read(istream&, Sales_data&);
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;
}
#endif
练习7.7
/*
*练习7.7
*2015/7/1
*问题描述:练习7.7:使用这些新函数重写7.1.2节(第233页)练习中的交易处理程序。
*功能:调用编写好的类
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*
*/
#include <iostream>
#include "Sales_data.h"
using namespace std;
int main()
{
Sales_data total;
if(read(cin,total))
{
Sales_data trans;
while(read(cin, trans)){
if(total.isbn() == trans.isbn())
total.combine(trans);
else{
print(cout, total) << endl;
total = trans;
}
}
print(cout, total) << endl;
}else{
cerr << "No data?!" << endl;
}
return 0;
}