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,让它们互为友元; b.在 Remote类中添加一个状态变量成员,该成员描述遥控器是处于常规模式还是互动模式: c,在 Remote 中添加一个显示模式的方法 d.在T类中添加一个对 Remote 中新成员进行切换的方法…...

【精品】商品规格 数据库表 设计
特点 同一类商品的规格项分组一样同一类商品的规格项一样不同商品的规格值是不同的 规格参数规格组规格项:规格值本博客对应的SQL文件下载地址: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创建,windows会默认结尾带 /r 会导致生成的镜像文件无法启动,且报错十分诡异。 镜像启动查看日志可以通过 docker logs [容器ID] 来查看 由于是启动jar包,docker logs 显示的报错是:…...
使用libcurl请求https的get/post
最近有个需求,需要用c请求下我自己的服务器,周末看了一下怎么发起http请求。 官方文档见: https://curl.se/libcurl/c/example.html 官网的demo是基于c的,我用的时候报错了。下面是我写的get/post的方法,同步执行。 n…...
AUTOSAR规范与ECU软件开发(实践篇)7.3 MCAL模块配置方法及常用接口函数介绍之GPT的配置
目录 1、前言 2 、Gpt模块 (1) Gpt General配置 (2) GptChannelConfigSet配置 (3) GptClockReferencePonit配置...

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

buuctf web 前5题
目录 一、[极客大挑战 2019]EasySQL 总结: 二、[极客大挑战 2019]Havefun 总结: 三、[HCTF 2018]WarmUp 总论: 四、[ACTF2020 新生赛]Include 总结: 五、[ACTF2020 新生赛]Exec 总结: 一、[极客大挑战 2019]…...
stable diffusion实践操作-提示词-人物服饰
系列文章目录 stable diffusion实践操作-提示词 文章目录 系列文章目录前言一、提示词汇总1.1 人物服饰11.2 人物服饰2 前言 本文主要收纳总结了提示词-人物服饰。 一、提示词汇总 1.1 人物服饰1 耳饰帽子内裤内衣上身饰品手部[月牙耳环][头顶光环][丁字裤][胸罩][披风][太…...
Tomcat加载静态资源--防止SpringMVC拦截
最简洁方式:使用API 在配置文件下写配置类SpringMvcSupport,并且让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
一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标哈里斯鹰优化算法MOHHO 多目标哈里斯鹰优化算法(Multi-Objective Harris Hawks Optimizer&#…...
[运维|中间件] 东方通TongWeb忘记密码后修改密码
参考文献 Tongweb忘记密码处理办法 修改密码 以下步骤将thanos用户密码修改为 thanos123.com 编辑twusers.properties文件 vim /path/to/TongWeb7.0/conf/security/twusers.properties将thanos的内容修改为默认的密码信息: thanos3d6391e41e9c4319$3$6774c6fc9…...

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

保留网络[02/3]:大型语言模型转换器的继任者”
一、说明 在这项工作中,我们提出保留网络(RETNET)作为基础架构大型语言模型的结构,同时实现训练并行, 推理成本低,性能好。我们从理论上推导出这种联系 复发与关注之间。然后我们提出保留机制 序列建模&…...
微信小程序-生成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:代理模式-动态代理
上一篇:设计模式8:代理模式-静态代理 目录 如何理解“动态”这两个字?动态代理简单的代码实例一个InvocationHandler代理多个接口有动态代理,为什么还要用Cglib代理? 如何理解“动态”这两个字? “动态”…...
tcp字节传输(java)-自定义包头和数据识别
1、背景 tcp传输的时候会自动拆包,因此服务端接收的数据段可能跟客户端发送过来的数据段长度不一致,比如客户端一次发送10000个字节。但是服务端接收了两次才接收完整(例如第一次接收6000字节,第二次接收4000字节)。但…...

pyspark 系统找不到指定的路径; \Java\jdk1.8.0_172\bin\java
使用用具PyCharm 2023.2.1 1:pyspark 系统找不到指定的路径, Java not found and JAVA_HOME environment variable is not set. Install Java and set JAVA_HOME to point to the Java installation directory. 解决方法:配置正确环境变量…...

UE4 Physics Constraint Actor 实现钟摆效果
放入场景,然后将一个球体放入场景 选择小球 将小球改为Movable 选择模拟物理,并将小球移除平衡点 就实现了...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...