c++primer_plus_练习2.41

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值