C++ primer plus课后练习题

CCC数字钥匙Release 3实战:如何用BLE/UWB实现无钥匙进入(附避坑指南) 本文深入解析CCC数字钥匙Release 3标准下BLE/UWB无钥匙进入系统的开发实践,涵盖硬件选型、安全测距协议、时序同步等关键环节,并提供实战调试技巧与安全攻防案例。特别针对BLE芯片配置、UWB模块选型等常见陷阱给出解决方案,帮助开发者高效实现厘米级精度的数字钥匙系统。 阅读详情

第十五章:友元、异常和其他

        一、复习题

        1. a. 友元声明应为: friend class clasp

            b. 应该在cuff类前声明muff类

            c. 应该在muff类前声明cuff类。其次,需要muff的前向声明。

        2. 不可以。为使类A拥有一个本身为类B的成员函数的友元,B的声明必须位于 A 的声明之前。一个前向声明是不够的,因为这种声明可以告诉A:B是一个类;但它不能指出类成员的名称。同样,如果B拥有一个本身是A 的成员函数的友元,则A 的这个声明必须位于B的声明之前。这两个要求是互斥的。

        3. 嵌套类被定义为私有成员,意味着在ribs类外无法创建嵌套类的对象。仅能通过ribs类的构造函数创建该嵌套类的一个对象。

        4. return会依次回调先前调用该函数的函数,但throw会跳转到相应的含有try块的调用函数中进行处理。

        5. catch块的顺序应该与继承层次相反,即基类在下,派生类在上。

        6. 第一个实例中,可以调用superb中的say方法以及superb派生类magnificent中的say方法。在第二个实例中,仅能调用superb中的say方法。

        7. static_cast运算符能在类层次中进行向上或向下的转换,但dynamic_cast运算符仅能进行向上的转换。static_cast还允许枚举类型和整型之间以及数值类型之间的转换。

        二、编程练习

        1. 

#ifndef C_PRIMER_CHAPTER15_TV_H
#define C_PRIMER_CHAPTER15_TV_H

class Remote;

class Tv
{
private:
    int state;
    int volume;
    int maxChannel;
    int channel;
    int input;
public:
    friend class Remote;
    enum {Off,On};
    enum {MinVal,MaxVal = 20};
    enum {TV,DVD};

    Tv(int s = Off, int mc = 125):state(s),volume(5),
    maxChannel(mc),channel(2),input(TV){}
    void onOff() {state = state == Off ? On : Off;}
    bool isOn() {return state;}
    bool volUp();
    bool volDown();
    void chanUp();
    void chanDown();
    void set_input() {input = input == TV ? DVD : TV;}
    void settings() const;
    void swicthRemote(Remote& r);
};

class Remote
{
private:
    int mode;
    int r_state;
public:
    friend class Tv;
    enum {Normal,Interactive};
    Remote(int m = Tv::TV,int s = Normal) : mode(m),r_state(s){}
    void onOff(Tv& t) {t.onOff();}
    void volUp(Tv& t) {t.volUp();}
    void volDown(Tv& t) {t.volDown();}
    void chanUp(Tv& t) {t.chanUp();}
    void chanDown(Tv& t) {t.chanDown();}
    void set_chan(Tv& t,int c){t.channel = c;}
    void set_input(Tv& t) {t.set_input();}
    void settings() const;
};

#endif //C_PRIMER_CHAPTER15_TV_H
#include "Tv.h"
#include <iostream>

bool Tv::volUp()
{
    if(volume < MaxVal)
    {
        volume++;
        return true;
    }
    return false;
}

bool Tv::volDown()
{
    if(volume <= MinVal)
        return false;
    volume--;
    return true;
}

void Tv::chanUp()
{
    if(channel == maxChannel)
        channel = 0;
    else
        channel++;
}

void Tv::chanDown()
{
    if(channel == 0)
        channel = maxChannel;
    else
        channel--;
}

void Tv::settings() const
{
    using std::cout,std::endl;
    if(state == On)
    {
        cout << "Tv is On." << endl;
        cout << "Volume: " << volume << endl;
        cout << "Channel: " << channel << endl;
        cout << "Input: " << (input ? "DVD" : "Tv") << endl;
    }
    else
    {
        cout << "Tv is Off." << endl;
    }
}

void Tv::swicthRemote(Remote& r)
{
    if(state == On)
    {
        r.r_state = r.r_state == Remote::Normal ? Remote::Interactive : Remote::Normal;
    }
    else
    {
        std::cout << "Tv is Off." << std::endl;
    }
}

void Remote::settings() const
{
    using std::cout,std::endl;
    cout << "Mode: " << (mode ? "DVD" : "TV") << endl;
    cout << "State: " << (r_state ? "Interactive" : "Normal") << endl;
}
#include "tv.h"

int main() {
    Tv t;
    t.settings();

    Remote r;
    r.settings();

    r.onOff(t);
    t.settings();

    r.volDown(t);
    t.settings();

    t.swicthRemote(r);
    r.settings();

    return 0;
}

        2. 

#include <iostream>
#include <stdexcept>
#include <cmath>

class bad_hmean : public std::logic_error
{
public:
    bad_hmean(const std::string& what_arg = "Invalid for hmean") : std::logic_error(what_arg){}
};

class bad_gmean : public std::logic_error
{
public:
    bad_gmean(const std::string& what_arg = "Invalid for gmean") : std::logic_error(what_arg){}
};

double hmean(double , double );
double gmean(double , double );

int main()
{
    double x,y;
    std::cout << "Enter two numbers: ";
    while(std::cin >> x >> y) {
        try
        {
            std::cout << hmean(x,y) << '\n';
            std::cout << gmean(x,y) << '\n';
            std::cout << "Enter two numbers: ";
        }
        catch (std::exception& e)
        {
            std::cout << e.what();
            std::cout << "\nEnter two numbers: ";
        }
    }

    return 0;
}

double hmean(double x, double y)
{
    if(x == -y)
        throw bad_hmean();
    return 2.0 * x * y / (x + y);
}

double gmean(double x, double y)
{
    if(x < 0 || y < 0)
        throw bad_gmean();
    return sqrt(x * y);
}

        3. 

#include <iostream>
#include <stdexcept>
#include <cmath>

class bad : public std::logic_error
{
private:
    double m_x;
    double m_y;
public:
    bad(double x, double y, const std::string& what_arg = "Invalid arguments\n") : m_x(x),m_y(y),std::logic_error(what_arg){}
    void reports()
    {
        if(m_x == -m_y)
            std::cout << "Error in hmean with x = " << m_x << " and y = " << m_y << std::endl;
        else
            std::cout << "Error in gmean with x = " << m_x << " and y = " << m_y << std::endl;
    }
};

double hmean(double , double );
double gmean(double , double );

int main()
{
    double x,y;
    std::cout << "Enter two numbers: ";
    while(std::cin >> x >> y) {
        try
        {
            std::cout << hmean(x,y) << '\n';
            std::cout << gmean(x,y) << '\n';
            std::cout << "Enter two numbers: ";
        }
        catch (bad& e)
        {
            std::cout << e.what();
            e.reports();
            break;
        }
    }

    return 0;
}

double hmean(double x, double y)
{
    if(x == -y)
        throw bad(x,y);
    return 2.0 * x * y / (x + y);
}

double gmean(double x, double y)
{
    if(x < 0 || y < 0)
        throw bad(x,y);
    return sqrt(x * y);
}

        4. 

#ifndef C_PRIMER_CHAPTER15_SALES_H
#define C_PRIMER_CHAPTER15_SALES_H

#include <stdexcept>
#include <string>

class Sales
{
public:
    enum {MONTHS = 12};
    class bad_index : public std::logic_error
    {
    private:
        int bi;
    public:
        explicit bad_index(int ix, const std::string& s = "Index error in Sales object\n")
        : std::logic_error(s),bi(ix){}
        int bi_val() {return bi;}
        virtual ~bad_index() throw(){}
    };
    explicit Sales(int yy = 0);
    Sales(int yy, const double* gr, int n);
    virtual ~Sales(){}
    int Year() const {return year;}
    virtual double operator[](int i) const;
    virtual double & operator[](int i);
private:
    int year;
    double gross[MONTHS];
};

class LabeledSales : public Sales
{
private:
    std::string label;
public:
    class nbad_index : public bad_index
    {
    private:
        std::string lbl;
    public:
        nbad_index(const std::string & lb, int ix, const std::string & s = "Index error in LabeledSales object\n")
        : bad_index(ix,s),lbl(lb){}
        const std::string & label_val() {return lbl;}
        virtual ~nbad_index(){}
    };
    explicit LabeledSales(const std::string & lb = "none", int yy = 0)
    : Sales(yy),label(lb){}
    LabeledSales(const std::string & lb, int yy, const double* gr, int n)
    : Sales(yy,gr,n),label(lb){}
    virtual ~LabeledSales(){}
    const std::string & Label() const {return label;}
    virtual double operator[](int i) const;
    virtual double & operator[](int i);
};

#endif //C_PRIMER_CHAPTER15_SALES_H
#include "Sales.h"

Sales::Sales(int yy)
{
    year = yy;
    for(int i = 0; i < MONTHS; ++i)
        gross[i] = 0;
}

Sales::Sales(int yy, const double* gr, int n)
{
    year = yy;
    int lim = n < MONTHS ? n : MONTHS;
    int i;
    for(i = 0; i < lim; ++i)
        gross[i] = gr[i];
    for(; i < MONTHS; ++i)
        gross[i] = 0;
}

double Sales::operator[](int i) const
{
    if(i < 0 || i >= MONTHS)
        throw bad_index(i);
    return gross[i];
}

double & Sales::operator[](int i)
{
    if(i < 0 || i >= MONTHS)
        throw bad_index(i);
    return gross[i];
}

double LabeledSales::operator[](int i) const
{
    if(i < 0 || i >= MONTHS)
        throw nbad_index(label,i);
    return Sales::operator[](i);
}
double & LabeledSales::operator[](int i)
{
    if(i < 0 || i >= MONTHS)
        throw nbad_index(label,i);
    return Sales::operator[](i);
}
#include <iostream>
#include "Sales.h"

int main()
{
    using std::cout,std::endl,std::cin;

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

    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();
        cout << "Index: " << bad.bi_val() << endl;
        Sales::bad_index* pbad = &bad;
        LabeledSales::nbad_index* pb;
        if((pb = dynamic_cast<LabeledSales::nbad_index*>(pbad)))
        {
            cout << "Company: " << pb->label_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();
        cout << "Index: " << bad.bi_val() << endl;
        if (typeid(bad) == typeid(LabeledSales::nbad_index))
            cout << "Company: " << ((LabeledSales::nbad_index &)bad).label_val() << endl;
    }
    cout << "done\n";

    return 0;
}

高光谱图像处理和分析软件(包含雷尼绍Renishaw wdf 文件导入解析功能) 是一款基于微软windows操作系统的多传感器成像工具,用于处理和分析高光谱图像。它是一个模块化的系统,由一个基本的引擎,一个图形用户界面,一个化学计量工具箱和可选的用户提供的模块组成。它支持最重要的光谱成像技术,如UV/Vis、红外、拉曼、太赫兹、光发射/吸收和质谱。除此之外,还允许用户将高光谱图像与物理属性图和传统高分辨率彩色照片合并在一起 链接:https://pan.baidu.com/s/1ruQ5YSh5_ZS9wx_V3Q5Oow 提取码:qdx0 ... 阅读详情

相关推荐

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1490

C++ Primer Plus(第6版)课后编程习题答案(自敲)——第六章

C++ Primer Plus(第6版)课后编程习题答案(自敲)——第六章

weixin_56493138的博客 1977

基于Simulink与MATLAB的七轴OpenArm机械臂逆运动学仿真与轨迹规划完整指南

本文详细介绍了七自由度OpenArm机械臂在MATLAB/Simulink环境下的运动学仿真与轨迹规划实现方法。首先建立了机械臂的DH参数模型,验证了正运动学计算;随后提出了两种逆运动学求解算法(数值迭代法和臂型角参数化解析法)的MATLAB实现方案;最后在Simulink中搭建了完整的轨迹规划与控制系统。研究解决了七自由度冗余机械臂特有的多解性、奇异性和关节限位约束等核心问题,为OpenArm机械臂的运动控制提供了完整的技术方案和可运行代码实现。

AI的内部世界的博客 622

C++ Primer Plus(第6版)课后编程习题答案(自敲)——合集(持续更新)

C++ Primer Plus课后编程习题答案(自敲)合集

weixin_56493138的博客 6831

C++ Primer Plus 第六版课后习题答案(第七章第九题)

为了不破坏原题结构,第九题单独列出来: #include <iostream> using namespace std; const int SLEN = 30; struct student{ char fullname[SLEN]; char hobby[SLEN]; int ooplevel; }; int getinfo(student pa[], ...

flannery023的博客 377

C++primer plus编程练习参考答案

第2章 开始学习C++ -1编写一个C++程序,:它显示您的姓名和地址。 2.编写学个C+程序,它要求用广输入一个以long-为单位的距离,然后将它转换为码(一-long 等手:220码)。3.编写一个C行程序,它使用3个用户定义的函数~(包括maini()>,并生成下面的输出” Three-biind ,micer rhree blind:miceseerhow they . run ..seehow. they run 其p:个函数要调用两次,.该函数生成前两行,另=个函数也被调用两次,并生成其

margaret522的博客 2万+

C++ Primer Plus 第六版 所有章节课后编程练习答案

C++ Primer Plus 第六版 所有章节课后编程练习答案

xiaojimmychen的专栏 9万+

C++ primer plus课后编程练习题答案

C++ primer plus课后编程练习题答案 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了《C++ primer plus》一书的课后编程练习题答案。这些答案均经过亲自运行验证,确保正确无误。资源中包含了课后练习题和编程练习题,可以帮助您更好地理解和掌握C++编程知识。 去发现同类优质开源项目:https://gitcode.com/ ...

gitblog_06738的博客 428

C++ primer plus 课后练习题

x)并将其结果转化为布尔值,若x原先不为0,那么(!x)的结果为false(0),再取反后为true(1),一般情况下与原先的x不相等。1. 减少代码的运行次数,提升其效率的同时,增强了代码的可读性。2. 将把字符的ascii码加一后以数字的形式输出。8. 不会产生cin的读取错误,能使程序更稳定。第六章:分支语句和逻辑运算符。

Anesthi的博客 230

【亲测免费】 C++ Primer Plus 第六版 课后练习题资源

C++ Primer Plus 第六版 课后练习题资源 【下载地址】CPrimerPlus第六版课后练习题资源 C++ Primer Plus 第六版 课后练习题资源欢迎使用C++ Primer Plus第六版的配套学习资源!本存储库专门提供了此经典编程书籍中提及的所有附录源码及其他相关文件,旨在帮助读者通过实践深...

gitblog_09760的博客 618

BUPTtakeCourse:北京邮电大学bupt抢课脚本,根据课程名自动选课,适用于本科

BUPTtakeCourse适用于本科,在教务系统登录后即可抢课,无需进入选课界面,必修选修公选通用修改js文件中的courses,添加想选的课名修改js文件中的interval,即抢课时间间隔。推荐间隔:抢课模式: 50ms, 捡漏模式(不是第一时间进入抢课):300ms(够用)F12打开Console控制台,粘贴代码回车以防万一(教务系统更新),建议抢课方式:开始选课前提前10秒,在登陆后的教务系统界面开启脚本抢课,开始选课后同时手动抢课,进入选课界面扫一眼是否自动抢课成功;若失败则在Console输入stop()停止脚本运行,手动抢课。抢到课后请立即停止脚本或刷新。请不要设置过低的抢课间隔,以免给脆弱的教务系统带来不必要的压力。请勿抢所有课!上次测试时间:2021-03-04

HDS VSPGX00 更换硬盘

HDS VSPGX00 更换硬盘

上一篇: C++ primer plus 课后练习题
下一篇: C++ primer plus课后练习题
Anesthi
博客等级 码龄6年 406粉丝 · 22原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值