卧龙小说网> 奇幻玄幻> 普通的冒险故事> 2.6.3节练习

2.6.3节练习

2.6.3节练习

2.6.3节练习

练习2.42:根据你自己的理解重写一个Sales_data.h头文件,并以此为基础重做2.6.2节(第67页)的练习。

出题思路:本题旨在考查自定义头文件并基于头文件编写程序的方法。

解答:

将上题答案中类的定义放置于Sales_data.h头文件中,具体的使用方法与第1章练习1.20~练习1.25类似。

Sales_data.h头文件的内容是:

#ifndef SALES_DATA_H_INCLUDED

#define SALES_DATA_H_INCLUDED

#include <iostream>

#include <string>

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&);

public: // 构造函数的3种形式

Sales_data() = default;

Sales_data(const std::string &book): bookNO(book) { }

Sales_data(stdLListream &is) { is >> *this; }

public:

Sales_data& operator += (const Sales_data&);

std::string isbn() const { return bookNO; }

private:

std::string bookNO; // 书籍编号,隐式初始化为空串

unsigned units_sold = 0; // 销售量,显式初始化为0

double sellingprice = 0.0; // 原始价格,显式初始化为0.0

double saleprice = 0.0; // 实售价格,显式初始化为0.0

double discount = 0.0; // 折扣,显式初始化为0.0

};

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.units_sold == rhs.units_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)

{

units_sold += rhs.units_sold;

saleprice = (rhs.saleprice * rhs.units_sold + saleprice * units_sold) / (rhs.units_sold * units_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的内容加入其中

return ret; // 返回ret

}

std::istream& operator >>(std::istream in Sales_data& s)

{

in >> s.bookNO >> s.units_sold >> s.sellingprice >> s.saleprice;

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.units_sold << " " << s.sellingprice << " " << s.saleprice << " " << s.discount;

return out;

}

#endif // SALES_DATA_H_INCLUDED

main.cpp源文件内容是:

#include <iostream>

#include "Sales_data.h"

int main()

{

Sales_data book;

std::cout << "请输入销售记录:" << std::endl;

while (std::cin >> book) {

std::cout << " ISBN、售出本数、原始价格、实售价格、折扣为" << book << std::endl;

}

Sales_data trans1 trans2;

std::cout << "请输入两条ISBN相同的销售记录:" << std::endl;

if (std::cin >> total) {

while (std::cin >> trans)

if (compareIsbn(total trans)) // ISBN相同

total = total + trans;

else { // ISBN不同

std::cout << "当前书籍ISBN不同" << std::endl;

break;

}

std::cout << "有效汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为" << total << std::endl;

}

else {

std::cout << "没有数据" << std::endl;

return -1;

}

int num = 1; // 记录当前书籍的销售记录总额

std::cout << "请输入若干销售记录:" << std::endl;

if (std::cin >> trans1) {

while (std::cin >> trans2)

if (compareIsbn(trans1 trans2)) // ISBN相同

num++;

else { // ISBN不同

std::cout << trans1.isbn() << "共有" << num << "条销售记录" << std::endl;

trans1 = trans2;

num = 1;

}

stdLLcout << trans1.isbn() << "共有" << num << "条销售记录" << std::endl;

}

else {

std::cout << "没有数据" << std::endl;

return -1;

}

return 0;

}


普通的冒险故事提示您:看后求收藏(卧龙小说网http://www.wolongxs.com),接着再看更方便。

好书推荐:《我的剧本世界在自主运行》《我是舰娘》《交错世界之学院都市》《认清现实后,她们开始追夫火葬场》《好徒儿你就饶了为师伐》《带着修真界仙子们天下无敌》《剑来》《修炼成仙的我只想养成女徒弟》《足控勇者的目标是魔王的丝袜》《被触手怪养大的少女》

目录 加书签 已经最新了