C++ Primer(第五版)第七章 类 部分答案

第七章 类

    • 练习7.2
    • 练习7.3
    • 练习7.4
    • 练习7.6
    • 练习7.7
    • 练习7.9
    • 练习7.14、7.15、7.22
    • 练习7.23、7.24、7.26
    • 练习7.27

练习7.2

曾在 2.6.2 节的练习(第 76 页)中编写了一个 Sales_data类,请向这个类添加 combine 和 isbn 成员。

创建头文件sales.h

#ifndef SALES_H
#define SALES_H#include <string>
#include <stdlib.h>
using namespace std;struct Sales_data
{string isbn() const  //返回书的编号{return bookNo;}Sales_data& combine(const Sales_data& rhs);string bookNo;  //书编号unsigned units_sold = 0;  //售出的册数double revenue = 0.0;  //总销售额
};
Sales_data& Sales_data::combine(const Sales_data& rhs)
{units_sold += rhs.units_sold;revenue += rhs.units_sold;return *this;
}
#endif;

练习7.3

修改 7.1.1 节(第 229 页)的交易处理程序,令其使用这些成员。

#include <iostream>
using namespace std;
#include "sales.h"
#include <string>//读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价
int main()
{Sales_data total;  //保存当前求和结果的变量if (cin >> total.bookNo >> total.units_sold >> total.revenue){Sales_data trans;while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue){if (total.isbn() == trans.isbn())total.combine(trans);else{cout << total.bookNo << " 的总销售记录是:共售出 " << total.units_sold << " 本,总收入是 " << total.revenue;total = trans;}}cout << total.bookNo  << " 的总销售记录是:共售出 " << total.units_sold << " 本,总收入是 " << total.revenue << " 平均每本价格是 "<<total.revenue/total.units_sold;}
}

练习7.4

编写一个名为 Person 的类,使其表示人员的姓名和住址。使用 string 对象存放这些元素,接下来的练习将不断充实这个类的其他特征。

创建头文件person.h

#pragma once
#include<string>
using namespace std;
struct Person {string Name;string Address;
};

练习7.6

对于函数 add、read、和 print,定义你自己的版本。

创建头文件sales.h

#ifndef SALES_H
#define SALES_H#include <string>
#include <stdlib.h>
using namespace std;struct Sales_data
{string isbn() const{return bookNo;}Sales_data& combine(const Sales_data& rhs);istream& read(istream& is, Sales_data& item);ostream& print(ostream& os, Sales_data& item);Sales_data add(const Sales_data& lhs, const Sales_data& rhs);string bookNo;  //书编号unsigned units_sold = 0;  //售出的册数double revenue = 0.0;  //总销售额
};
Sales_data& Sales_data::combine(const Sales_data& rhs)
{units_sold += rhs.units_sold;revenue += rhs.units_sold;return *this;
}
istream& Sales_data::read(istream& is, Sales_data& item) //is用来代替cin,istream类和ostream类见后续的IO类型
{double price;is >> item.bookNo >> item.units_sold >> price;item.revenue = price * item.units_sold;return is;
}
ostream& Sales_data::print(ostream& os, Sales_data& item)
{os << item.isbn() << " 的总销售记录是:共售出 " << item.units_sold << " 本,总收入是 "<< item.revenue << " " << " 平均每本价格是 "<<item.revenue/item.units_sold;return os;
}
Sales_data Sales_data::add(const Sales_data& lhs, const Sales_data& rhs)
{Sales_data sum = lhs;  //把lhs的数据成员拷贝给sumsum.combine(rhs);  //把rhs的数据成员加到sum中return sum;
}#endif;

练习7.7

使用这些新函数重写 7.1.2 节(第 233 页)练习中的交易处理程序。

#include <iostream>
using namespace std;
#include "sales.h"
#include <string>//读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价
int main()
{Sales_data total;  if (total.read(cin,total)){Sales_data trans;while (total.read(cin,trans)){if (total.isbn() == trans.isbn())total.combine(trans);else{total.print(cout,total);cout << endl;total = trans;}}total.print(cout, total);cout << endl;}
}

练习7.9

对于 7.1.2节(第 233 页)练习中的代码,添加读取和打印 Person 对象的操作。

#pragma once
#include <string>
#include <iostream>
using namespace std;struct Person {string Name;string Address;istream& read(istream& is, Person& per);ostream& print(ostream& os, const Person& per);};
istream& Person::read(istream& is, Person& per)
{is >> per.Name >> per.Address;return is;
}ostream& Person::print(ostream& os, const Person& per)
{os << "名字为:" << per.Name << "  地址为:" << per.Address;return os;
}

练习7.14、7.15、7.22

7.14.编写一个构造函数,令其用我们提供的类内初始值显式地初始化成员。
7.15.为你的 Person 类添加正确的构造函数。
7.22.修改你的 Person 类使其隐藏实现的细节。

头文件

#pragma once
#include <string>
#include <iostream>
using namespace std;
'''构造函数可以有多个,发生了重载,实例化的时候只能调用一个'''
class Person 
{
public://1、无参构造函数,可以直接Person p创建实例Person() = default;  //2、无参显示构造,可以直接Person p创建实例,和默认无参构造无法发生重载Person():Name("megumi"),Address("japan"){} //3、有参构造函数,需要Person p("sanae","erci")创建实例Person(string N, string A) :Name(N), Address(A) {} //4、类外构造函数的声明Person(istream& is);istream& read(istream& is, Person& per);  //读取函数ostream& print(ostream& os, const Person& per);  //输出函数
private:string Name;string Address;
};//类外构造函数的定义
Person::Person(istream &is)
{read(is,*this);
}istream& Person::read(istream& is, Person& per)
{is >> per.Name >> per.Address;return is;
}ostream& Person::print(ostream& os, const Person& per)
{os << "名字为:" << per.Name << "  地址为:" << per.Address;return os;
}

主程序

#include <iostream>
using namespace std;
#include "person.h"
int main()
{//1和2采用这种实例化Person per;per.print(cout, per);cout<<endl;//3采用这种实例化Person per1("sanae","beijing");per1.print(cout,per1);cout<<endl;//4类外构造函数的使用Person per2(cin);per2.print(cout,per2);}

练习7.23、7.24、7.26

头文件screen.h

#pragma once
#include <string>
#include <iostream>
using namespace std;class Screen
{
public:typedef string::size_type pos;Screen() = default;Screen(pos ht, pos wd) :height(ht), width(wd) { }Screen(pos ht,pos wd,char c):height(ht),width(wd),contents(ht*wd,c) { }char get() const   //读取光标处的字符{return contents[cursor];  //隐式内联}inline char get(pos ht, pos wd) const; //显示内联Screen& move(pos r, pos c);  //能在之后被设为内联private:pos cursor = 0;pos height = 0, width = 0;string contents;
};
char Screen::get(pos r, pos c) const
{pos row = r * width;return contents[row + c];
}
inline Screen& Screen::move(pos r, pos c) //内联,最好用这种方法,容易理解
{pos row = r * width;cursor = row + c;return *this;
}

练习7.27

头文件screen.h

#pragma once
#include <string>
#include <iostream>
using namespace std;class Screen
{
public:typedef string::size_type pos;Screen() = default;Screen(pos ht, pos wd) :height(ht), width(wd) { }Screen(pos ht,pos wd,char c):height(ht),width(wd),contents(ht*wd,c) { }char get() const   //读取光标处的字符{return contents[cursor];  //隐式内联}inline char get(pos ht, pos wd) const; //显示内联Screen& move(pos r, pos c);  //负责移动光标,能在之后被设为内联Screen& set(char);Screen& set(pos r, pos col, char ch);Screen& display(ostream& os){do_display(os);return *this;}const Screen& display(ostream& os) const{do_display(os);return *this;}private:pos cursor = 0; //光标的位置pos height = 0, width = 0; //屏幕的宽高string contents; //存放数据//该函数负责显示Screen的内容void do_display(ostream& os) const{os << contents;}
};
char Screen::get(pos r, pos c) const
{pos row = r * width;return contents[row + c];
}
inline Screen& Screen::move(pos r, pos c) //内联,最好用这种方法,容易理解
{pos row = r * width;cursor = row + c;return *this;
}
inline Screen& Screen::set(char c)
{contents[cursor] = c; //设置当前光标所在位置的新值return *this; //将this对象作为左值返回
}
inline Screen& Screen::set(pos r, pos col, char ch)
{contents[r * width + col] = ch; //设置给定位置的新值return *this;  //将this对象作为左值返回
}

主程序

#include "screen.h"int main()
{Screen myScreen(5, 5, 'x'); //创建一个有5*5个x的对象myScreen.move(4, 0).set('#').display(cout);//移动光标4*5+0下,把那个位置的x替换成#,并且显示出来cout << '\n';myScreen.display(cout);cout << '\n';
}

结果为:

xxxxxxxxxxxxxxxxxxxx#xxxx
xxxxxxxxxxxxxxxxxxxx#xxxx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arpanet(阿帕网)

“阿帕”&#xff08;ARPA&#xff09;&#xff0c;是美国高级研究计划署&#xff08;Advanced Research Project Agency&#xff09;的简称。他的核心机构之一是信息处理技术办公室&#xff08;IPTO Information Processing Techniques Office&#xff09;&#xff0c;一直在关…

mongodb数据库淘汰_mongodb 内存数据淘汰策略

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼About MongoMongoDB uses memory mapped files.This means the the operating system essentially controls what is paged in and out of memory (to and from disk).The RulesIf your indexes working set exceed memory, the l…

Markdown常用转义字符

如果字符无法正常输出&#xff0c;则在前面加\试试。 空格&#xff1a; 数学公式 数学公式要使用$$&#xff0c;需将公式放在两个$中间。 下标: _上标: ^分数&#xff1a;方法1&#xff1a;\frac{分子}{分母} 方法2&#xff1a;分子 \over 分母 对于\frac的方法…

互联网工程任务组(IETF)

国际互联网工程任务组&#xff08;The Internet Engineering Task Force&#xff0c;简称 IETF&#xff09;是一个公开性质的大型民间国际团体&#xff0c;汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员&#xff0c;并欢迎所有对此行业感兴趣…

javafx 打印控件_Java的新视差控件(JavaFX)

javafx 打印控件介绍 视差是一种视觉效果&#xff0c;您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下&#xff0c;当您在道路上行驶时&#xff0c;您会看到附近的树木在快速移动&#xff0c;而距离较远的树木将沿同一方向移动但速度较慢&#xff0c;结果是您…

beoplay耳机序列号查询_BOSE耳机序列号如何查询?

展开全部 大多数序列号可在产品的背面或底部找到,一般位于条形码旁。e69da5e6ba903231313335323631343130323136353331333431363532序列号长度为 17 位(还有一些耳机是 4 位),可包含字母和数字。 另外,与 Bose Connect 应用程序兼容的产品将在应用程序的设置和gt; 产品信息下…

编译原理总概述笔记

编译原理编译原理程序设计语言分类翻译编译解释编译的转换过程两阶段的转换三阶段的转换编译程序的工作词法分析语法分析中间代码生成优化目标代码生成表格与表格管理出错处理语句翻译实例过程编写编译程序方式编译原理 是介绍高级程序设计语言变换成计算机硬件所能识别的机器…

RFC(一系列以编号排定的文件)

Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society&#xff08;ISOC&#xff09;赞助发行。基本的互联网通信协议都有在RFC文件内…

deprecated_使用Java的@Deprecated前瞻

deprecated我偶尔会遇到一种情况&#xff0c;我需要引入新的API或构造以供其他人试用&#xff0c;但是我知道在使用某些API后&#xff0c;它可能会根据其他人的反馈而改变。 在这种情况下&#xff0c;我想以某种方式注释该构造&#xff0c;以警告其他开发人员此新添加的构造的暂…

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字&#xff1a;云计算XEN Hypervisor FusionSphere摘要&#xff1a;本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析&#xff0c;总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点&#xff0c;为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd&#xff0c;用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…

文件的 MD5 签名介绍

在 RFC1321 中有 MD5 的详细描述。简单的说&#xff0c;MD5 根据文件的内容用算法产生一个唯一的128位签名&#xff0c;用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的理论可能性&#xff0c;但截止到目前还没有人能够做到。所以在文件使用…

apache.camel_Apache Camel 2.21发布–新增功能

apache.camel我们刚刚发布了Apache Camel 2.21&#xff0c;我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供&#xff0c; 我们计划在2018年夏季之前发布。 1&#xff09;处理大型JMS消息 我们在JMS组件中添加了…

人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。

每一日你所付出的代价都比前一日高&#xff0c;因为你的生命又消短了一天&#xff0c;所以每一日你都要更积极。今天太宝贵&#xff0c;不应该为酸苦的忧虑和辛涩的悔恨所销蚀&#xff0c;抬起下巴&#xff0c;抓住今天&#xff0c;它不再回来。一个人失败的最大原因&#xff0…

精通 RPM 之校验篇_检验篇_检测篇

文章目录一、校验介绍二、参考示例&#xff08;一&#xff09;校验某个已安装的软件包的所有文件&#xff08;一&#xff09;校验系统中所有已安装的软件包&#xff08;二&#xff09;校验含有指定文件的软件包&#xff08;三&#xff09;校验指定类别的软件包&#xff08;四&a…

python关于路径需使用的方法笔记

关于python中有关路径实现代码的方法常用的python方法join()方法split()方法关于文件路径\ / // \\的用法解释斜杠/反斜杠\读取某个路径的文件双斜杠//双反斜杠\\\os.path库的方法连接路径与路径或文件名获取绝对路径获取当前文件的绝对路径返回文件名字返回文件所在文件夹的路…

不同的Hibernate命名策略

本文讨论了hibernate提供的不同命名策略&#xff0c;以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后&#xff0c;我们将研究一下在Hibernate和配置中实施自…

设置按峰值带宽计费_西部数码使用指南:云服务器计费模式说明

版权归西部数码所有&#xff0c;原文链接&#xff1a;https://www.west.cn/faq/list.asp?unid2370一、付费模式1、包年包月先付费后使用模式&#xff0c;资源固定&#xff0c;按年或者按月付费购买可享受较大的价格优惠&#xff0c;帮您更大程度节省支出&#xff0c;并且时间固…

信号处理基本概念

信号处理 信号是传递信息的函数&#xff0c;也是独立变量的函数&#xff0c;这个变量可以是时间空间位置等。如图像的灰度值等就是空间位置的函数&#xff0c;声压随着时间在变化&#xff0c;就是时间的函数。 连续信号就是在某个时间区间&#xff0c;除有限间断点外所有瞬时…

如何理解计算机程序中的宏?

计算机科学里的宏是一种抽象&#xff08;Abstraction&#xff09;&#xff0c;它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言&#xff0c;宏展开在编译时发生&#xff0c;进行宏展开的工具常被称为宏展开器。 宏…