练习2.42解答
仍然是解决本书开头提出的书店问题,输入一系列交易记录(每本书的isbn,销量,销售价格),输出每本书的isbn,销售量,销售额及平均售价。假设每个isbn书的销售记录都在一起。
工程架构
代码
Sales_item.h
#ifndef SALES_ITEM_H
#define SALES_ITEM_H
#include<iostream>
#include<string>
using namespace std;
class Sales_item{
friend istream& operator >> (istream &,Sales_item&);
friend ostream& operator << (ostream &,Sales_item&);//注意这里的引用不要忘了
friend bool operator < (const Sales_item&,const Sales_item&);
friend bool operator == (const Sales_item&,const Sales_item&);
public:
string bookNo;//isbn号
unsigned volumeOfSales=0;//销量
double sellingPrice=0.0;//售价
double salesMoney=0.0;//销售额
double avgPrice=0.0;//平均售价
public:
Sales_item()=default;
Sales_item(const string & book):bookNo(book){}
Sales_item(istream &is){is>>*this;}
public:
Sales_item& operator+=(const Sales_item&);
string isbn() const{return bookNo;}
};
inline bool compareIsbn(const Sales_item& s1,const Sales_item& s2){
return s1.isbn()==s2.isbn();
}
std::istream& operator >> (std::istream& in,Sales_item& s){
in>>s.bookNo>>s.volumeOfSales>>s.sellingPrice;
s.salesMoney=s.volumeOfSales*s.sellingPrice;
s.avgPrice=s.salesMoney/s.volumeOfSales;
return in;
}
ostream& operator << (ostream& out,Sales_item& s){
out<<s.isbn()<<" "<<s.volumeOfSales<<" "<<s.salesMoney<<" "<<s.avgPrice<<endl;
return out;
}
Sales_item& Sales_item::operator += (const Sales_item& s){
this->volumeOfSales+=s.volumeOfSales;
this->salesMoney+=s.salesMoney;
this->avgPrice=this->salesMoney/this->volumeOfSales;
return *this;
}
Sales_item operator + (const Sales_item& s1,const Sales_item& s2){
Sales_item res(s1);
res+=s2;
return res;
}
#endif // SALES_ITEM_H
main.cpp
#include <iostream>
#include <cstdio>
#include"Sales_item.h"
using namespace std;
typedef char * p;
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
freopen("err.txt","w",stderr);
Sales_item trans,total;
if(cin>>total){
while(cin>>trans){
if(trans.isbn()==total.isbn()){
total+=trans;
}
else{
cout<<total;
total=trans;
}
}
cout<<total;
}else{
cerr<<"No data?!"<<endl;
return -1;
}
return 0;
}
效果