当前位置: 首页 > news >正文

C++ primer plus第十五章编程练习答案

1.对Tv 和 Remote 类做如下修改:
a,让它们互为友元;
b.在 Remote类中添加一个状态变量成员,该成员描述遥控器是处于常规模式还是互动模式:
c,在 Remote 中添加一个显示模式的方法
d.在T类中添加一个对 Remote 中新成员进行切换的方法,该方法应仅当 TV 处于打开状态时才能运行。
编写一个小程序来测试这些新特性。

#include <iostream>
#include "tv.h"int main()
{using std::cout;Tv s42;cout << "Initial settings for 42\" TV:\n";s42.settings();s42.onoff();s42.chanup();cout << "\nAdjusted settings for 42\" TV:\n";s42.settings();Remote grey;grey.set_chan(s42, 10);grey.volup(s42);grey.volup(s42);s42.set_status(grey);cout << "\n42\" settings after using remote:\n";s42.settings();grey.show_status();Tv s58(Tv::On);s58.set_mode();grey.set_chan(s58, 28);s58.set_status(grey);cout << "\n58\" settings:\n";s58.settings();grey.show_status();return 0;
}
#ifndef TV_H_
#define TV_H_
#include <iostream>class Remote; //先声明Remote类然后再定义, 以便编译器有足够的信息编译使用Remote类的方法;class Tv
{
public:friend class Remote;enum { Off, On };enum { MinVal, MaxVal = 20 };enum { Antenna, Cable };enum { TV, DVD };Tv(int s = Off, int mc = 125) : state(s), volume(5),maxchannel(mc), channel(2), mode(Cable), input(TV) {}void onoff() { state = (state == On) ? Off : On; }bool ison() const { return state == On; }bool volup();bool voldown();void chanup();void chandown();void set_mode() { mode = (mode == Antenna) ? Cable : Antenna; }void set_input() { input = (input == TV) ? DVD : TV; }void settings() const;void set_status(Remote &r); //对Remote类中状态成员进行切换的方法;private:int state;int volume;int maxchannel;int channel;int mode;int input;
};class Remote
{
private:int mode;int status; //状态变量成员;public:friend class Tv;enum { Convention, Interaction }; //Convention表示常规模式, Interaction表示互动模式;Remote(int m = Tv::TV, int s = Convention) : mode(m), status(s) {} //默认为常规模式;bool volup(Tv &t) { return t.volup(); }bool voldown(Tv &t) { return t.voldown(); }void onoff(Tv &t) { t.onoff(); }void chanup(Tv &t) { t.chanup(); }void chandown(Tv &t) { t.chandown(); }void set_chan(Tv &t, int c) { t.channel = c; }void set_mode(Tv &t) { t.set_mode(); }void set_input(Tv &t) { t.set_input(); }void show_status() const;
};inline void Tv::set_status(Remote &r)
{if (ison()){r.status = Remote::Convention == r.status ? Remote::Interaction : Remote::Convention;}
}inline void Remote::show_status() const
{std::cout << "Status = " << (status == Convention ? "Convention" : "Interaction") << std::endl;
}#endif
#include <iostream>
#include "tv.h"bool Tv::volup()
{if (volume < MaxVal){volume++;return true;}return false;
}bool Tv::voldown()
{if (volume > MinVal){volume--;return true;}return false;
}void Tv::chanup()
{channel = channel < maxchannel ? 1 + channel : 1;
}void Tv::chandown()
{channel = channel > 1 ? channel - 1 : maxchannel;
}void Tv::settings() const
{using std::cout;using std::endl;cout << "TV is " << (state == Off ? "Off" : "On") << endl;if (state == On){cout << "Volume setting = " << volume << endl;cout << "Channel setting = " << channel << endl;cout << "Mode = ";cout << (mode == Antenna ? "antenna" : "cable") << endl;cout << "Input = ";cout << (input == TV ? "TV" : "DVD") << endl;}
}

2.修改程序清单 15.11,使两种异常类型都是从头文件stdexcepi>提供的 logic_error 类派生出来的类让每个 what()方法都报告函数名和问题的性质。异常对象不用存储错误的参数值,而只需支持 what()方法

#include <iostream>
#include <cmath>
#include "exc_mean.h"double hmean(double a, double b);
double gmean(double a, double b);int main()
{using std::cin;using std::cout;using std::endl;double x, y, z;cout << "Enter two numbers: ";while (cin >> x >> y){try{z = hmean(x, y);cout << "Harmonic mean of " << x << " and " << y;cout << " is " << z << endl;z = gmean(x, y);cout << "Geometric mean of " << x << " and " << y;cout << " is " << z << endl;cout << "Enter next set of numbers <q to quit>: ";}catch (bad_hmean &bg){cout << bg.what(); //调用what方法打印hmean中的异常;cout << "Try again.\n";continue;}catch (bad_gmean &hg){cout << hg.what(); //调用what方法打印gmean中的异常;cout << "Sorry, you don't get to play any more.\n";break;}}cout << "Bye!\n";return 0;
}double hmean(double a, double b)
{if (a == -b){throw bad_hmean();}return 2.0 * a * b / (a + b);
}double gmean(double a, double b)
{if (a < 0 || b < 0){throw bad_gmean();}return std::sqrt(a * b);
}
#ifndef EXC_MEAN_H_
#define EXC_MEAN_H_
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;class bad_hmean : public logic_error
{
public:explicit bad_hmean(const string &s = "Error in bad_hmean object\nhmean() arguments should be a != -b\n") : logic_error(s) {}
};class bad_gmean : public logic_error
{
public:explicit bad_gmean(const string &s = "Error in bad_hmean object\ngmean() arguments should be >= 0\n") : logic_error(s) {}
};#endif

3.这个练习与编程练习2相同,但异常类是从一个这样的基类派生而来的:它是从 logic_crror 派生而来的,并存储两个参数值。异常类应该有一个这样的方法:报告这些值以及函数名。程序使用一个 catch块来捕获基类异常,其中任何一种从该基类异常派生而来的异常都将导致循环结束。

#include <iostream>
#include <cmath>
#include "exc_mean.h"double hmean(double a, double b);
double gmean(double a, double b);int main()
{using std::cin;using std::cout;using std::endl;double x, y, z;cout << "Enter two numbers: ";while (cin >> x >> y){try{z = hmean(x, y);cout << "Harmonic mean of " << x << " and " << y;cout << " is " << z << endl;z = gmean(x, y);cout << "Geometric mean of " << x << " and " << y;cout << " is " << z << endl;cout << "Enter next set of numbers <q to quit>: ";}catch (mean &m) //捕获基类以及派生类的任何异常;{cout << "Sorry, you don't get to play any more.\n";break;}}cout << "Bye!\n";return 0;
}double hmean(double a, double b)
{if (a == -b){bad_hmean temp("hmean", a, b);temp.mesg();throw temp;}return 2.0 * a * b / (a + b);
}double gmean(double a, double b)
{if (a < 0 || b < 0){bad_gmean temp("gmean", a, b);temp.mesg();throw temp;}return std::sqrt(a * b);
}
#ifndef EXC_MEAN_H_
#define EXC_MEAN_H_
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;class mean : public logic_error
{
private:double v1;double v2;public:mean(const string &s = "none", double a = 0.0, double b = 0.0) : logic_error(s), v1(a), v2(b) {}const double &val1() const { return v1; }const double &val2() const { return v2; }
};class bad_hmean : public mean
{
public:bad_hmean(const string &s = "none", double a = 0.0, double b = 0.0) : mean(s, a, b) {}void mesg() const;
};inline void bad_hmean::mesg() const
{cout << "hmean(" << val1() << ", " << val2() << "):" << endl;cout << "hmean() arguments should be a != b" << endl;
}class bad_gmean : public mean
{
public:bad_gmean(const string &s = "none", double a = 0.0, double b = 0.0) : mean(s, a, b) {}void mesg() const;
};inline void bad_gmean::mesg() const
{cout << "gmean(" << val1() << ", " << val2() << "):" << endl;cout << "gmean() arguments should be >= 0" << endl;
}#endif

4.程序清单 15.16 在每个 ty 后面都使用两个 catch 块,以确保 nbad index 异常导致方法 abel_val()被调用。请修改该程序在每个 ty 块后面只使用一个 catch 块并使用 RTTI 来确保合适时调用 abel_val()

#include <iostream>
#include "sales.h"int main()
{using std::cin;using std::cout;using std::endl;double vals1[12] ={1220, 1100, 1122, 2212, 1232, 2334,2884, 2393, 3302, 2922, 3002, 3544};double vals2[12] ={12, 11, 22, 21, 32, 34,28, 29, 33, 29, 32, 35};Sales sales1(2011, vals1, 12);LabeledSales sales2("Blogstar", 2012, vals2, 12);cout << "First try block:\n";try{int i;cout << "Year = " << sales1.Year() << endl;for (i = 0; i < 12; ++i){cout << sales1[i] << ' ';if (i % 6 == 5){cout << endl;}}cout << "Year = " << sales2.Year() << endl;cout << "Label = " << sales2.Label() << endl;for (i = 0; i <= 12; ++i){cout << sales2[i] << ' ';if (i % 6 == 5){cout << endl;}}cout << "End of try block 1.\n";}catch (Sales::bad_index &bad){cout << bad.what();LabeledSales::nbad_index *ni;if (ni = dynamic_cast<LabeledSales::nbad_index *>(&bad)) //RTTI识别类型;{cout << "Company: " << ni->label_val() << endl;cout << "bad index: " << ni->bi_val() << endl;}else{cout << "bad index: " << bad.bi_val() << endl;}}cout << "\nNext try block:\n";try{sales2[2] = 37.5;sales1[20] = 23345;cout << "End of try block 2.\n";}catch (Sales::bad_index &bad){cout << bad.what();LabeledSales::nbad_index *ni;if (ni = dynamic_cast<LabeledSales::nbad_index *>(&bad)) //RTTI识别类型;{cout << "Company: " << ni->label_val() << endl;cout << "bad index: " << ni->bi_val() << endl;}else{cout << "bad index: " << bad.bi_val() << endl;}}cout << "done\n";return 0;
}

相关文章:

C++ primer plus第十五章编程练习答案

1.对Tv 和 Remote 类做如下修改: a&#xff0c;让它们互为友元; b.在 Remote类中添加一个状态变量成员&#xff0c;该成员描述遥控器是处于常规模式还是互动模式: c&#xff0c;在 Remote 中添加一个显示模式的方法 d.在T类中添加一个对 Remote 中新成员进行切换的方法&#xf…...

【精品】商品规格 数据库表 设计

特点 同一类商品的规格项分组一样同一类商品的规格项一样不同商品的规格值是不同的 规格参数规格组规格项&#xff1a;规格值本博客对应的SQL文件下载地址&#xff1a;https://download.csdn.net/download/lianghecai52171314/88306884 方案一 数据库设计 查询17号商品的规…...

无人机集群路径规划MATLAB:孔雀优化算法POA求解无人机集群三维路径规划

一、无人机模型简介 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 二、孔雀优化算法POA介绍 孔雀优化算法( Peafowl Optimization Algorithm, POA), 是由 Jingbo Wang 等于2022 年提出的一种群体智能优化算法。其灵感来源于孔雀的群体行为。 智能优化算法&am…...

Dockerfile创建镜像异常问题解决

Dockerfile创建 dockerfile文件一定要在Linux创建&#xff0c;windows会默认结尾带 /r 会导致生成的镜像文件无法启动&#xff0c;且报错十分诡异。 镜像启动查看日志可以通过 docker logs [容器ID] 来查看 由于是启动jar包&#xff0c;docker logs 显示的报错是&#xff1a…...

使用libcurl请求https的get/post

最近有个需求&#xff0c;需要用c请求下我自己的服务器&#xff0c;周末看了一下怎么发起http请求。 官方文档见&#xff1a; https://curl.se/libcurl/c/example.html 官网的demo是基于c的&#xff0c;我用的时候报错了。下面是我写的get/post的方法&#xff0c;同步执行。 n…...

AUTOSAR规范与ECU软件开发(实践篇)7.3 MCAL模块配置方法及常用接口函数介绍之GPT的配置

目录 1、前言 2 、Gpt模块 (1) Gpt General配置 (2) GptChannelConfigSet配置 (3) GptClockReferencePonit配置...

Android 性能优化--内存优化分析总结

一、内存优化概念 1.1 为什么要做内存优化&#xff1f; 内存优化一直是一个很重要但却缺乏关注的点&#xff0c;内存作为程序运行最重要的资源之一&#xff0c;需要运行过程中做到合理的资源分配与回收&#xff0c;不合理的内存占用轻则使得用户应用程序运行卡顿、ANR、黑屏&…...

buuctf web 前5题

目录 一、[极客大挑战 2019]EasySQL 总结&#xff1a; 二、[极客大挑战 2019]Havefun 总结&#xff1a; 三、[HCTF 2018]WarmUp 总论&#xff1a; 四、[ACTF2020 新生赛]Include 总结&#xff1a; 五、[ACTF2020 新生赛]Exec 总结&#xff1a; 一、[极客大挑战 2019]…...

stable diffusion实践操作-提示词-人物服饰

系列文章目录 stable diffusion实践操作-提示词 文章目录 系列文章目录前言一、提示词汇总1.1 人物服饰11.2 人物服饰2 前言 本文主要收纳总结了提示词-人物服饰。 一、提示词汇总 1.1 人物服饰1 耳饰帽子内裤内衣上身饰品手部[月牙耳环][头顶光环][丁字裤][胸罩][披风][太…...

Tomcat加载静态资源--防止SpringMVC拦截

最简洁方式&#xff1a;使用API 在配置文件下写配置类SpringMvcSupport&#xff0c;并且让SpringMVC扫描到此文件夹ComponentScan({"com.itheima.controller","com.itheima.config"}) SpringMvcSupport配置类如下 Configuration public class SpringMvcS…...

【AI数字人】如何基于ER-NeRF自训练AI数字人

文章目录 环境配置前期准备数据预处理音频预处理训练bug测试度量标准用指定的声音进行推理参考ER-NeRF,能够以更小的模型尺寸和更快的速度训练合成逼真的3D talking portrait。 环境配置 ER-NeRF项目开源于两个月前,相比于两年前的AD-NeRF,使用更新版本的tensorflow和各种…...

多目标应用:基于多目标哈里斯鹰优化算法(MOHHO)的微电网多目标优化调度研究MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标哈里斯鹰优化算法MOHHO 多目标哈里斯鹰优化算法&#xff08;Multi-Objective Harris Hawks Optimizer&#…...

[运维|中间件] 东方通TongWeb忘记密码后修改密码

参考文献 Tongweb忘记密码处理办法 修改密码 以下步骤将thanos用户密码修改为 thanos123.com 编辑twusers.properties文件 vim /path/to/TongWeb7.0/conf/security/twusers.properties将thanos的内容修改为默认的密码信息&#xff1a; thanos3d6391e41e9c4319$3$6774c6fc9…...

无涯教程-Android Mock Test函数

本节介绍了与 Android 相关的各种模拟测试。您可以在本地计算机上下载这些样本模拟测试,并在方便时离线解决。每个模拟测试均随附一个模拟测试键,可让您验证最终分数并为自己评分。 Mock Test I Mock Test II Mock Test III Mock Test IV Q 1 -什么是Android&#xff1f; A -A…...

保留网络[02/3]:大型语言模型转换器的继任者”

一、说明 在这项工作中&#xff0c;我们提出保留网络&#xff08;RETNET&#xff09;作为基础架构大型语言模型的结构&#xff0c;同时实现训练并行&#xff0c; 推理成本低&#xff0c;性能好。我们从理论上推导出这种联系 复发与关注之间。然后我们提出保留机制 序列建模&…...

微信小程序-生成canvas图片并保存到手机相册

wxml页面 <button class"rightbtn bottomBtnCss" catch:tap"canvasImg"><image src{{imgUrl}}/images/mine/jspj-icon.png class"restNumImg"></image><text class"btnText">生成图片</text></but…...

设计模式8:代理模式-动态代理

上一篇&#xff1a;设计模式8&#xff1a;代理模式-静态代理 目录 如何理解“动态”这两个字&#xff1f;动态代理简单的代码实例一个InvocationHandler代理多个接口有动态代理&#xff0c;为什么还要用Cglib代理&#xff1f; 如何理解“动态”这两个字&#xff1f; “动态”…...

tcp字节传输(java)-自定义包头和数据识别

1、背景 tcp传输的时候会自动拆包&#xff0c;因此服务端接收的数据段可能跟客户端发送过来的数据段长度不一致&#xff0c;比如客户端一次发送10000个字节。但是服务端接收了两次才接收完整&#xff08;例如第一次接收6000字节&#xff0c;第二次接收4000字节&#xff09;。但…...

pyspark 系统找不到指定的路径; \Java\jdk1.8.0_172\bin\java

使用用具PyCharm 2023.2.1 1&#xff1a;pyspark 系统找不到指定的路径&#xff0c; Java not found and JAVA_HOME environment variable is not set. Install Java and set JAVA_HOME to point to the Java installation directory. 解决方法&#xff1a;配置正确环境变量…...

UE4 Physics Constraint Actor 实现钟摆效果

放入场景&#xff0c;然后将一个球体放入场景 选择小球 将小球改为Movable 选择模拟物理&#xff0c;并将小球移除平衡点 就实现了...

UE4/UE5 动画控制

工程下载​ ​​​​​​​​​​​​​https://mbd.pub/o/bread/ZJ2cm5pu 蓝图控制sequence播放/倒播动画&#xff1a; 设置开启鼠标指针&#xff0c;开启鼠标事件 在场景中进行过场动画制作 设置控制事件...

Springboot整合shiro

导入依赖 <!-- 引入springboot的web项目的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> ​ <!-- shiro --><depende…...

阻塞/非阻塞、同步/异步(网络IO)

1.阻塞/非阻塞、同步/异步(网络IO) 【思考】典型的一次 IO 的两个阶段是什么&#xff1f; 数据就绪 和 数据读写 数据就绪 &#xff1a;根据系统 IO 操作的就绪状态 阻塞 非阻塞 数据读写 &#xff1a;根据应用程序和内核的交互方式 同步 异步 陈硕&#xff1a;在处理 IO …...

为什么大家会觉得考PMP没用?

一是在于PMP这套知识体系&#xff0c;是一套底层的项目管理逻辑框架&#xff0c;整体是比较抽象的。大家在学习工作之后&#xff0c;会有人告诉你很多职场的一些做事的规则&#xff0c;比如说对于沟通&#xff0c;有人就会告诉如何跟客户沟通跟同事相处等等&#xff0c;这其实就…...

AVR128单片机 USART通信控制发光二极管显示

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void port_init(void) { PORTA 0xFF; DDRA 0x00;//输入 PORTB 0xFF;//低电平 DDRB 0x00;//输入 PORTC 0xFF;//低电平 DDRC 0xFF;//输出 PORTE 0xFF; DDRE 0xfE;//输出 PO…...

为什么5G 要分离 CU 和DU?(4G分离RRU 和BBU)

在 Blog 一文中&#xff0c;5G--BBU RRU 如何演化到 CU DU&#xff1f;_5g rru_qq_38480311的博客-CSDN博客 解释了4G的RRU BBU 以及 5G CU DU AAU&#xff0c;主要是讲了它们分别是什么。但是没有讲清楚 为什么&#xff0c;此篇主要回答why。 4G 为什么分离基站为 RRU 和 BBU…...

Python中的数据输入

获取键盘输入 input语句 使用input()可以从键盘获取输入&#xff0c;使用一个变量来接收 print("你是谁&#xff1f;") name input() print(f"我知道了&#xff0c;你是{name}")# print("你是谁&#xff1f;") name input("你是谁&…...

cms系统稳定性压力测试出现TPS抖动和毛刺的性能bug【杭州多测师_王sir】

一、并发线程数100&#xff0c;分10个阶梯&#xff0c;60秒加载时间&#xff0c;运行1小时进行压测&#xff0c;到10分钟就出现如下 二、通过jstat -gcutil 16689 1000进行监控...

【UE】材质描边、外发光、轮廓线

原教学视频链接&#xff1a; ue4 材质描边、外发光、轮廓线_哔哩哔哩_bilibili 步骤 1. 首先新建一个材质&#xff0c;这里命名为“Mat_outLine” 在此基础上创建一个材质实例 2. 在视口中添加一个后期处理体积 设置后期处理体积为无限范围 点击添加一个数组 选择“资产引用”…...

百模大战,打响AI应用生态的新赛点

点击关注 文&#xff5c;郝鑫 黄小艺&#xff0c;编&#xff5c;刘雨琦 “宇宙中心”五道口&#xff0c;又泛起了昔日的光芒。 十字路口一角的华清嘉园里&#xff0c;各种互联网大佬们&#xff0c;王兴、程一笑、张一鸣等人的创业传说似乎还有余音&#xff0c;后脚搬进来的AI…...

石家庄网站外包/西安网站维护公司

描述60台计算机的机房所需要的设备也就是网线&#xff0c;交换机&#xff0c;路由器&#xff0c;这个规模也就算是一个小型的局域网&#xff0c;接下来我就详细讲解一下具体怎样组网、60台电脑规模的局域网怎样连接首先第一步应该将“路由器”与“光猫”串连&#xff0c;串连所…...

做网站那个公司/免费seo网站推荐一下

日期内核版本架构作者GitHubCSDN2016-05-29Linux-4.5X86 & armgatiemeLinuxDeviceDriversLinux进程管理与调度-之-进程的创建 前言 Linux下有3个特殊的进程&#xff0c;idle进程(PID0), init进程(PID1)和kthreadd(PID2) * idle进程由系统自动创建, 运行在内核态 idle进…...

网站制作建设有哪些/软文客

写在最前&#xff1a;该篇文章还未完成&#xff0c;待进一步更新...。。一、初始 MycatMHALVS1、为什么选择 Mycat&#xff1f;互联网的高速发展使分布式技术兴起&#xff0c;当系统的压力越来越大时&#xff0c;人们首先想到的解决方案就是想上扩展(scale up)&#xff0c;简单…...

做门窗投标网站/秦皇岛百度推广

国家示范性高职院校名单(109所) http://www.sina.com.cn 2011年07月15日 10:52 新浪教育 新浪教育讯 2006年11月&#xff0c;为了提升高职院校的办学水平&#xff0c;教育部启动了被称为“高职211”的“百所示范性高等职业院校建设工程”。根据规划&#xff0c;“十一五”期间…...

长沙市芙蓉区关于疫情最新消息/搜索引擎推广seo

目录 一、前言 二、安装教程 1.打开下载链接 2.配置插件 三、使用教程 1.页面介绍 2.功能布局 四、脚本功能兼容油猴脚本安装使用 1.安装油猴脚本 2.油猴脚本使用教程 五、超神的脚本推荐 1.Github 增强 - 高速下载 2.右键在新标签中打开图片时显示最优化图像质量…...

免费铺货诚招代理商/百度seo工具

这次给大家带来js如何直接获取网页中图片地址&#xff0c;js直接获取网页中图片地址的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。第一种方法&#xff1a;js通过正则实现/*** 获取html代码中图片地址* param htmlstr* returns {Array}*/function ge…...