C++Primer第五版 7.1.3节练习

练习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;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值