第2章 变量和基本类型 (C++ Primer 第五版)

练习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;
}

效果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/80939761