栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《C++ Primer》第17章 17.2节习题答案

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《C++ Primer》第17章 17.2节习题答案

《C++ Primer》第17章 标准库特殊设施

17.2节 BITSET类型 习题答案

练习17.9:解释下列每个bitset对象所包含的位模式:

(a)bitset<64> bitvec(32);

(b)bitset<32> bv(1010101);

(c)string bstr; cin >> bstr; bitset<8>bv(bstr);

【出题思路】

熟悉bitset的定义。

【解答】

(a)bitvec为32位,第5位为1,剩余位为0。

(b)bv为32位,0、2、4、6这4位为1,剩余位为0。

(c)bv为8位,用bstr来对其进行初始化。若读入的字符串不是单纯的二进制字符串,程序会抛出invalid_argument异常。

练习17.10:使用序列1、2、3、5、8、13、21初始化一个bitset,将这些位置位。对另一个bitset进行默认初始化,并编写一小段程序将其恰当的位置位。

【出题思路】

练习bitset操作。

【解答】

构造一个无符号整数,将1、2、3、5、8、13、21这7位置位,然后用其初始化bitset。对于第二小问,用set成员函数对默认初始化的bitset置位即可。

#include 
#include 

using namespace std;

int main()
{
     unsigned bp = 2 | (11 << 2) | (1 << 5) | (1 << 8)
             | (1 << 13) | (1 << 21);
     bitset<32> bv(bp);

     bitset<32> bv1;
     bv1.set(1);
     bv1.set(2);
     bv1.set(3);
     bv1.set(5);
     bv1.set(8);
     bv1.set(13);
     bv1.set(21);
     cout << bv1 << endl;
     return 0;
}

输出结果:

00000000001000000010000100101110

练习17.11:定义一个数据结构,包含一个整型对象,记录一个包含10个问题的真/假测验的解答。如果测验包含100道题,你需要对数据结构做出什么改变(如果需要的话)?

【出题思路】

本题练习bitset的定义和使用。

【解答】

如果使用整数保存测验解答,那么对于10个问题的测验,只需一个短整型对象即可。如果改为100道题,则需4个32位整数或是2个64位整数。而且修改的并不仅仅是数据结构,所有对整型数进行操作来修改解答和评分的代码都要相应进行修改,工作量很大。

采用bitset则有很明显的优势,当题目数改变时,我们只需改变bitset的规模,而操作bitset来完成改答案、评分的代码则只需进行很小的修改。

最佳的方式是定义一个类模板,它有一个模板参数表示题目数,有一个bitset成员保存解答,然后定义一些成员函数来完成改答案、评分等操作。当题目数发生变化,我们只需实例化一个新版本即可,其他代码均无须改动。

练习17.12:使用前一题中的数据结构,编写一个函数,它接受一个问题编号和一个表示真/假解答的值,函数根据这两个参数更新测验的解答。

【出题思路】

本题练习bitset的定义和使用。

【解答】

此函数直接调用bitset的set操作即可,程序见下题。

练习17.13:编写一个整型对象,包含真/假测验的正确答案。使用它来为前两题中的数据结构生成测验成绩。

【出题思路】

本题练习bitset的定义和使用。

【解答】

使用一个循环,比较两个bitset的相同位的数目,即可得到测验成绩。

#include 
#include 

using namespace std;

template 
class exam {
public:
    exam() : s() { }
    size_t get_size() { return N; }
    void set_solution(size_t n, bool b)
    { s.set(n, b); }
    bitset get_solution() const
    { return s; }
    size_t score(const bitset &a);

private:
    bitset s;
};

template 
size_t exam::score(const bitset &a)
{
    size_t ret = 0;
    for(size_t i = 0; i < N; ++i)
        if(s[i] == a[i])
            ret++;
    return ret;
}

int main()
{
    exam<80> e;
    e.set_solution(0, 1);
    e.set_solution(79, 1);
    cout << e.get_solution() << endl;

    bitset<80> a;
    cout << e.get_size() << "题对了"
         << e.score(a) << "题" << endl;
    return 0;
}

运行结果:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433551.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号