#include <iostream>
#include<string>
using namespace std;
class Sales_data{
friend std::istream& operator>>(std::istream&,Sales_data&);//友元函数
friend std::ostream& operator<<(std::ostream&,const Sales_data&);//友元函数
friend bool operator <(const Sales_data&,const Sales_data&);
friend bool operator==(const Sales_data&,const Sales_data&);
private:
std::string bookNo;//书籍编号,隐式初始化为空串
unsigned unit_sold = 0;//销售量,显示初始化为0
double sellingprice = 0.0;//原始价格、
double saleprice = 0.0;//实售价格
double discount=0.0;//销售折扣
public:
Sales_data() = default;
Sales_data(const std::string &book):bookNo(book){}
Sales_data(std::istream &is){is>>*this;}
Sales_data& operator +=(const Sales_data&);
std::string isbn() const{return bookNo;}
int esc=0;//退出输0,正常输入1
};
inline bool compareIsbn(const Sales_data &lhs,const Sales_data &rhs)
{
return lhs.isbn() ==rhs.isbn();
}
Sales_data operator + (const Sales_data&, const Sales_data&);
inline bool operator ==(const Sales_data &lhs,const Sales_data &rhs)
{
return lhs.unit_sold==rhs.unit_sold &&
lhs.sellingprice==rhs.sellingprice&&
lhs.saleprice==rhs.saleprice&&
lhs.isbn()==rhs.isbn();
}
inline bool operator !=(const Sales_data &lhs,const Sales_data &rhs)
{
return !(lhs == rhs);//基于==号运算符给出不等的定义
}
Sales_data& Sales_data::operator+=(const Sales_data& rhs)
{
unit_sold += rhs.unit_sold;
saleprice = (rhs.saleprice*rhs.unit_sold+saleprice*unit_sold)/(rhs.unit_sold+unit_sold);
if(sellingprice !=0)
discount=saleprice/sellingprice;
return *this;
}
Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs)
{
Sales_data ret(lhs);//把lhs的内容拷到临时变量ret中,这种作法便于运算
ret +=rhs;//把rhs的内容加到ret中
return ret;//返回ret
}
std::istream& operator>>(std::istream& in, Sales_data& s)
{
in>>s.bookNo>>s.unit_sold>>s.sellingprice>>s.saleprice>>s.esc;//退出s.esc=0;继续输入数据s.ecs=1
if(in && s.sellingprice!=0 )
s.discount=s.saleprice/s.sellingprice;
else
s=Sales_data();//输入错误,重置数据
return in;
}
std::ostream& operator<<(std::ostream& out,const Sales_data& s)
{
out<<s.isbn()<<" "<<s.unit_sold<<" "<<s.sellingprice<<" "<<s.saleprice<<" "<<s.discount;
return out;
}
int main()
{
Sales_data book;
int a =1;
std::cout<<"请输入销售记录"<<std::endl;
while(std::cin>>book)//cin遇到文件结束符ctrl+z就会跳出循环
{
std::cout<<"ISBN 、售出本数、原始价格、实售价格、折扣为、退出按零\n"<<book<<std::endl;
if(book.esc==0)
break;
}
book.esc = 1;
Sales_data trans1,trans2;
std::cout<<"请输入两条ISBN相同的销售记录"<<std::endl;
std::cin>>trans1>>trans2;
if(compareIsbn(trans1,trans2))
std::cout<<"汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为"
<<trans1+trans2<<std::endl;
else
std::cout<<"两条销售记录的ISBN不同"<<std::endl;
Sales_data total,trans;
trans.esc ==1;
std::cout<<"请输入几条ISBN相同的的销售记录:"<<std::endl;
if(std::cin>>total)
{
while(std::cin>>trans)
{
if(compareIsbn(total,trans))
{//ISBN相同
total = total +trans;
if(trans.esc ==0)
break;
}
else{
//ISBN不同
std::cout<<"当前书籍ISBN不同"<<std::endl;
break;
}
trans.esc==1;
}
std::cout<<"有效汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为"<<total<<std::endl;
}
else{
std::cout<<"没有数据"<<std::endl;
return -1;
}
trans1.esc =1;
trans2.esc =1;
int num =1;//记录当前书籍的销售记录总数
std::cout<<"请输入若干销售记录总数:"<<std::endl;
if(std::cin>>trans1)
{
if(trans1.esc !=0)
{
while(std::cin>>trans2)
{
if(compareIsbn(trans1,trans2))
{
num++;
if(trans2.esc==0)
break;
}
else{
//ISBN不同
std::cout<<trans1.isbn()<<"共有"<<num<<"条销售记录"<<std::endl;
trans1 = trans2;
num=1;
}
}
}
std::cout<<trans1.isbn()<<"共有"<<num<<"条销售记录"<<std::endl;
}
else {
std::cout<<"没有数据wqwq"<<std::endl;
return -1;
}
return 0;
}