C++primer第五版第一章答案(附头文件源码)

C++Primer第五版第一章答案

初学者不懂.h内的语法可以先不用搞明白,懂得调用函数就行了

Sales_item.h

#ifndef SALESITEM_H
#define SALESITEM_H

#include <iostream>
#include <cstring>
using namespace std;

class Sales_item
{
	friend istream& operator >>(istream&, Sales_item&);			
	friend ostream& operator <<(ostream&, const Sales_item&);	
	friend bool operator <(const Sales_item&, const Sales_item&);
	friend bool
		operator == (const Sales_item&, const Sales_item&);
public:
	//Sales_item() = default;
	Sales_item()
		:units_sold(0), revenue(0.0) {}
	Sales_item(const string& book)
		:bookNo(book), units_sold(0), revenue(0.0) {}
	Sales_item(istream& is) { is >> *this; }
public:
	Sales_item& operator +=(const Sales_item&);

	string isbn()const				//获取编号
	{
		return bookNo;
	}
	double avg_price()const;		//平均价格
private:
	string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
	//unsigned units_sold;
	//double revenue;
};


inline				//对比函数
bool compareIsbn(const Sales_item& l, const Sales_item& r)
{
	return l.isbn() == r.isbn();
}

inline				//重载==,如果参数都相同就返回true
bool operator == (const Sales_item& l, const Sales_item& r)
{
	//需要是友元函数
	return l.units_sold == r.units_sold && l.revenue == r.revenue &&
		l.isbn() == r.isbn();
}

inline 
bool operator !=(const Sales_item& l, const Sales_item& r)
{
	return !(r == r);		//利用了前面重载的'=='
}

//默认两个对象有同一个书的编号 重载+=返回原来的对象 用&
Sales_item& Sales_item::operator+=(const Sales_item& rhs)
{
	//units_sold默认是this->units_sold
	units_sold += rhs.units_sold;
	this->revenue += rhs.revenue;
	return *this;
}

Sales_item
operator + (const Sales_item& l, const Sales_item& r)
{
	Sales_item tmp(l);		//拷贝构造,放到tmp中过渡
	tmp += r;
	return tmp;
}

istream&		//因为存在连读的情况,因此返回引用
operator >> (istream& in, Sales_item& s)
{
	//读取到的内容放到s中
	double price;
	cout << "Please input bookNo:";
	in >> s.bookNo;
	cout << "Please input units_sold:";
	in >> s.units_sold;
	cout << "Please input price:";
	in>>price;
	if (in)
		s.revenue = s.units_sold * price;
	else
		s = Sales_item();	//空的
	return in;
}

ostream&
operator <<(ostream& out, const Sales_item& s)
{
	out << "书编号为:" << s.isbn() << "\n书的销售额为:" << s.units_sold << "\n书的总收入为:" << s.revenue << "\n书的平均价格为:"
		<< s.avg_price() << endl;
	return out;
}

double Sales_item::avg_price()const
{
	if (units_sold)
		return revenue / units_sold;
	else
		return 0;
}

#endif // !SALESITEM_H

1.5.1节练习

下面所有的程序都调用了头文件,仅仅显示主函数

练习1.20
#include"Sales_item.h"

int main()
{
	Sales_item item1, item2;
	cin >> item1 >> item2;
	cout << "item1的内容:\n";
	cout << item1 << endl;
	cout << "item2的内容:\n";
	cout << item2 << endl;
}
练习1.21
#include"Sales_item.h"
int main()
{
    //书能相加,默认是isbn编号相同,请输入时isbn输入相同的编号
	Sales_item item1, item2;
	cin >> item1 >> item2;
	cout << item1 + item2 << endl;
}
练习1.22
#include"Sales_item.h"


int main()
{
	Sales_item item1, item2, item3;
	for (int i = 0; i < 3; i++) {
		cin >> item1;
		item2 += item1;
	}
	cout << item2 << endl;
}
练习1.23 1.24
#include"Sales_item.h"


int main()
{
	Sales_item item1, item2;
	cin >> item1;
    int num = 1;
    while (cin >> item2)
    {
        if(item1.isbn() == item2.isbn())
        {
            item1 += item2;
            ++num;
        }else {
            cout << item1.isbn() << "occurc" << num << "times" <<endl;
            item1 = item2;
            num = 1;
        }
    }
}
练习1.6

所有接口都在Sales_item.h中,可以自行调用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值