C++primer第五版课后习题答案(带书签)
C++Primer第5版第九章课后练习答案

C++Primer第5版第九章课后练习答案练习9.1(a)list更合适,因为按照字典序插⼊到容器中代表需要在容器中间插⼊元素(b)deque更合适,因为deque⽀持双端插⼊和删除(c)⽆具体的插⼊删除操作,读取整数数量也是未知,可以选择vector练习9.2int main(int argc, char* argv[]){std::list<std::deque<int>> lq;}练习9.3指向同⼀个容器的元素,或者尾后迭代器end不在begin之前练习9.4bool find(vector<int>::const_iterator& begin, vector<int>::const_iterator& end, int i) {while (begin != end) {if (*begin == i)return true;}return false;}练习9.5vector<int>::const_iterator& find(vector<int>::const_iterator& begin, vector<int>::const_iterator& end, int i) {while (begin != end) {if (*begin == i)return begin;}std::cerr << "don't find the num in the arrange";return end;}练习9.6在C++定义的容器类型中,只有vector和queue容器提供迭代器算数运算和除!=和==之外的关系运算练习9.7vector<int>::size_type练习9.8读取list<string>::iterator||list<string>::const_iterator写⼊list<string>::iterator练习9.9cbegin返回的是const迭代器对象,begin不是练习9.10it1:vector<int>::iteratorit2:const vector<int>::iteratorit3:vector<int>::const_iteratorit4:const vector<int>::const_iterator练习9.11vector<int> v1;//空vector<int> v2(v1);//v1的拷贝vector<int> v3{ 0,1,2,3 };//初始化为初始化列表的拷贝vector<int> v4(v3.begin(), v3.end());//初始化为迭代器之间元素的拷贝vector<int> v5(10);//包含10个元素,每⼀个都被值初始化为0vector<int> v6(10, 5);//包含10个元素,每个都初始化为5练习9.12接受⼀个容器创建其拷贝的构造函数:要求具有相同的容器类型,保存的是相同的元素类型接受两个迭代器创建拷贝的构造函数:只要求迭代器范围内的元素类型相同练习9.13int main(int argc, char* argv[]){list<int> li{ 0,1,2,3 };vector<double> vd(li.begin(), li.end());for (auto i : vd)cout << i << "";cout << endl;vector<int> vi{ 0,1,2,3 };vector<double> vd2(vi.begin(), vi.end());for (auto i : vd2)cout << i << "";}练习9.14int main(int argc, char* argv[]){list<const char*> lc;vector<string> vs;vs.assign(lc.begin(), lc.end());}练习9.15template<typename T>bool check(const vector<T>& v1, const vector<T>& v2) {return v1 == v2;}int main(int argc, char* argv[]){vector<string> vs1{ "012" };vector<string> vs2{ "012","123" };cout << (check(vs1, vs2) ? "相等" : "不相等");}练习9.16template<typename T>bool check(const list<T>& v1, const vector<T>& v2) {if (v1.size() == v2.size()) {auto j = v2.begin();for (auto i = v1.begin(); i !=v1.end() ; i++,j++) {if (*i != *j)return false;}return true;}return false;}int main(int argc, char* argv[]){list<string> vs1{ "012" };vector<string> vs2{ "012","123" };cout << (check(vs1, vs2) ? "相等" : "不相等");}练习9.17要求不是⽆序关联容器,c1和c2必须是相同类型的容器,且必须保存相同类型的元素练习9.18int main(int argc, char* argv[]){std::deque<string> ds;string s;while (cin >> s) {ds.emplace_back(s);s.clear();}for (auto it = ds.begin(); it != ds.end(); it++) {cout << *it << endl;}}练习9.19int main(int argc, char* argv[]){list<string> ls;string s;while (cin >> s) {ls.emplace_back(s);s.clear();}for (auto it = ls.begin(); it != ls.end(); it++) {cout << *it << endl;}}练习9.20int main(int argc, char* argv[]){list<int> li;int i;deque<int> di1, di2;while (cin >> i) {li.emplace_back(i);}for (auto it = li.begin(); it != li.end(); it++) {if ((*it) % 2)di1.emplace_back(*it);else di2.emplace_back(*it);}}练习9.21int main(int argc, char* argv[]){vector<string> vst;string word;auto iter = vst.begin();while (cin >> word) {iter = vst.insert(iter, word);}}将iter初始化为vst.begin(),第⼀次调⽤insert会将我们刚刚读⼊的string插⼊到iter所指向的元素之前的位置。
C-primer-plus(第五版)课后编程练习答案

第一章概览编程练习1.您刚刚被MacroMuscle有限公司(Software for Hard Bodies)聘用。
该公司要进入欧洲市场,需要一个将英寸转换为厘米(1英寸= cm)的程序。
他们希望建立的该程序可提示用户输入英寸值。
您的工作是定义程序目标并设计该程序(编程过程的第1步和第2步)。
1.将英寸值转化为厘米值2.显示“输入英寸值”->得到该值->转换为厘米值->存储->告知用户已结束.第二章 C语言概述编程练习1.编写一个程序,调用printf()函数在一行上输出您的名和姓,再调用一次printf()函数在两个单独的行上输出您的名和姓,然后调用一对printf()函数在一行上输出您的名和姓。
输出应如下所示(当然里面要换成您的姓名):Anton BrucknerAntonBrucknerAnton Bruckner第一个输出语句'第二个输出语句仍然是第二个输出语句第三个和第四个输出语句#include<>int main(void){、printf("He Jin\n");printf("He\n");printf("Jin\n");printf("He Jin\n");return(0);},2.编写一个程序输出您的姓名及地址。
#include<>int main(void){printf("Name:He Jin\n");…printf("Address:CAUC\n");return(0);}3.编写一个程序,把您的年龄转换成天数并显示二者的值。
不用考虑平年( fractional year)和闰年(leapyear)的问题。
#include<>(int main(void){int age=22;printf("Age:%d\n",age);printf("Day:%d\n",age*356);return(0);}%4.编写一个能够产生下面输出的程序:For he's a jolly good fellow!For he's a jolly good fellow!For he's a jolly good fellow!Which nobody can deny!程序中除了main()函数之外,要使用两个用户定义的函数:一个用于把上面的夸奖消息输出一次:另一个用于把最后一行输出一次。
C-primer-plus(第五版)课后编程练习答案(完整)精编版

7.编写一个程序,程序中要调用名为 one_three()的函数。该函数要在一行中显示单词"one", 再调用 two()函数, 然后再在另一行中显示单词"three"。 函数 two()应该能在一行中显示单词"two"。 main() 函数应该在调用 one_three()函数之前显示短语"starting now:",函数调用之后要显示"done!"o 这样, 最后的输出结果应如下所示: starting now one two three done !
第4章 编程练习
字符串和格式化输入/输出
1.编写一个程序,要求输入名字和姓氏,然后以“名字,姓氏”的格式打印。
#include<stdio.h> int main(void) { char surname[20],firstname[20]; printf("Please input your firstname and surname:"); scanf("%s",firstname); scanf("%s",surname); printf("You are %s,%s.\n",firstname,surname); return(0); }
3.编写一个程序,把您的年龄转换成天数并显示二者的值。不用考虑平年 ( fractional year) 和闰年(leapyear)的问题。
#include<stdio.h> int main(void) { int age=22; printf("Age:%d\n",age); printf("Day:%d\n",age*356); return(0); }
C++primer第五版第二章习题答案

C++primer第五版第⼆章习题答案2.1 类型int ,long,long long ,short 的区别是什么?最⼩尺⼨⽐如,int最⼩尺⼨为16位,long 32位。
8位⼀字节。
⽆符号类型和符号类型区别?当然是能不能表⽰负值了。
Float和double区别有效数字6和10.2.2 都⽤double,double和float计算代价基本相同,不⽤⽩不⽤!其实不太懂按揭贷款可能有的⽤int吧2.3 和2.42^32 = 4 294 967 296-32=4294967264!!2.5(a)⼀个是有前缀L,‘a’找能容纳其数值的尺⼨最⼩者;L‘a’最少是wchar_t另⼀个区别是字符和字符串字⾯值的区别(b)尺⼨问题以及\后加⼋进制数和16进制数的表⽰⽅法(c)尺⼨问题(d)科学计数表⽰浮点型字⾯值2.6int i=9; 这个9就是我们平时说的9;int i=09; 这个本⾝就有错,0开头的是8进制的,只有0到7这些数字,不可能出现9,举例:int i=013; 换算成⼗进制就是1*8+3=11;另外,i=0x9,这个也是9,不过是⼗六进制的,有0到9加a到f这些数字字母,举例:int i=0x1a; 换算成⼗进制就是1*16+10=26; in ti=07 ok2.7(a).图⽚没看见光标,\012是换⾏(b)(c)(d)略2.82.9(a)报错意外的类型int(b)⾮法转换未执⾏因为存在丢失信息的危险。
但在vs2010中编译通过结果为i=3 (c)wage未声明的标识符(d)合法i=32.10#includestd::string globle_str;//定义于函数体外初始化为0;int globle_int;//定义于函数体外初始化为0;int main(){int local_int;//显⽰是随机值,未被初始化,若访问将引发错误;std::string local_str;//显⽰是随机值,未被初始化,若访问将引发错误;}2.11(a)定义(b)声明并定义(c)声明2.12(a)(c)(d)⾮法2.13422.14100,452.15(a)合法结果丢失精度(b)引⽤类型的初始值必须是⼀个对象(c)此处引⽤类型的初始值必须是⼀个int对象(d)引⽤必须初始化2.16(a)r2和d都是3.14159(b)r1=0 r2=0.00000(c)r2=0.0000 i=0(d)r1=0 d=0.00002.1710,10关键概念之指针引⽤符号的多重含义Int &r2=*p;的意义?可见r2是p地址中内容的引⽤!!2.18分别改变指针的值以及指针所指对象的值2.19⼀指针本⾝是对象,允许对指针赋值拷贝。
《C++Primer》第五版习题答案--第一章【学习笔记】

《C++Primer》第五版习题答案--第⼀章【学习笔记】C++Primer第五版习题解答---第⼀章ps:答案是个⼈在学习过程中书写,可能存在错漏之处,仅作参考。
作者:cosefyDate: 2022/1/7第⼀章:开始练习1.3#include<iostream>int main() {std::cout << "hello, world" << std::endl;return 0;}练习1.4:#include<iostream>int main(){int v1 = 0, v2 = 0;std::cout << "please input two numbers: " << std::endl;std::cin >> v1 >> v2;std::cout << "The product of " << v1 << " and " << v2 << " is: " << v1 * v2 << std::endl;return 0;}练习1.5:#include<iostream>int main(){int v1 = 0, v2 = 0;std::cout << "please input two numbers: " << std::endl;std::cin >> v1 >> v2;std::cout << "The product of ";std::cout << v1;std::cout << " and ";std::cout << v2;std::cout << " is: ";std::cout << v1 * v2;std::cout << std::endl;return 0;}练习1.6:结果如下图所⽰,存在报错,显然格式不合法。
C++Primer第5版第十五章课后练习答案

C++Primer第5版第⼗五章课后练习答案练习15.1成员函数应在其声明之前动态绑定。
基类中的虚成员希望其派⽣类定义其⾃⼰的版本。
特别是基类通常应定义虚析构函数,即使它不起作⽤。
练习15.2派⽣类能访问基类的共有成员⽽不能访问私有成员,但派⽣类能访问基类的protected访问运算符描述的成员,⽽禁⽌其它⽤户访问练习15.3#include <string>#include <iostream>#ifndef _QUOTE_H_#define _QUOTE_H_class Quote{public:Quote()=default;Quote(const std::string& book, double sales_price) :bookNo(book), price(sales_price) {}std::string isbn() const { return bookNo; }virtual double net_price(std::size_t n)const { return n * price; }virtual ~Quote() = default;private:std::string bookNo;protected:double price = 0.0;};double print_total(std::ostream& os, const Quote& item, size_t n){double ret = _price(n);os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << std::endl;return ret;}#endif// !_QUOTE_H_练习15.4class Base { ... };(a) class Derived : public Derived { ... }; // 错误,类重复定义,不能⾃⼰继承⾃⼰(b) class Derived : private Base { ... }; // 正确(c) class Derived : public Base; // 错误,类的声明包含类名但不包含类派⽣列表练习15.5class Bulk_quote:public Quote{public:Bulk_quote() = default;Bulk_quote(const std::string&, double, std::size_t,double);double net_price(std::size_t)const override;protected:std::size_t min_qty = 0;double discount = 0.0;};Bulk_quote::Bulk_quote(const std::string& book, double p, std::size_t qty,double disc) :Quote(book, p), min_qty(qty), discount(disc) {}inline double Bulk_quote::net_price(std::size_t cnt) const{if (cnt >= min_qty)return cnt * (1 - discount) * price;elsereturn cnt * price;}练习15.6int main(int argc, char* argv[]){Bulk_quote bq;Quote q(bq);print_total(cout, q, 1);print_total(cout, bq, 1);return0;}练习15.7class Limit_quote : public Bulk_quote{public:Limit_quote() = default;Limit_quote(const std::string&, double, std::size_t, std::size_t, double);double net_price(std::size_t)const override;private:std::size_t max_qty = 0;};Limit_quote::Limit_quote(const std::string& book, double p, std::size_t min, std::size_t max,double disc) :Bulk_quote(book, p,min,disc), max_qty(max){}inline double Limit_quote::net_price(std::size_t cnt) const{if(cnt>=max_qty)return max_qty * (1 - discount) * price+(cnt- max_qty)*price;else if (cnt >= min_qty)return cnt * (1 - discount) * price;elsereturn cnt * price;}练习15.8静态类型:在编译时总是已知的,它是变量声明时的类型或表达式⽣成的类型动态类型:变量或表达式表⽰的内存中的对象的类型。
C++Primer第5版第十一章课后练习答案

C++Primer第5版第⼗⼀章课后练习答案练习11.1map和vector相⽐是通过关键字⽽不是位置来查找值。
练习11.2list:需要在中间进⾏操作的情况。
vector:若没有必要使⽤其他容器则优先使⽤deque:只需要在头尾进⾏操作的情况map:字典set:key-value相同的集合练习11.3int main(int argc, char* argv[]){map<string, size_t> word_count;string word;while (cin >> word) {++word_count[word];}for (const auto& w : word_count) {cout << w.first << "" << w.second << endl;}}练习11.4int main(int argc, char* argv[]){map<string, size_t> word_count;string word;while (cin >> word) {word.erase(remove_if(word.begin(), word.end(), [](char& c) {if (isupper(c)) { tolower(c); } return ispunct(c); }));++word_count[word];}for (const auto& w : word_count) {cout << w.first << "" << w.second << endl;}}练习11.5map是关键字-值对的集合,set是关键字的集合,看使⽤场景需要key-value还是key集合练习11.6set是关联容器,进⾏查找、修改操作效率⾼list是顺序容器,插⼊删除操作效率低,随机访问速度慢练习11.7int main(int argc, char* argv[]){map<string, vector<string>> familys;string surname, name;while (cin >> surname>> name) {familys[surname].emplace_back(name);}for (const auto& f : familys) {cout << f.first << ":";for (const auto& n : f.second) {cout << n << "";}cout << endl;}}练习11.8int main(int argc, char* argv[]){vector<string> words;string word;while (cin >> word) {words.emplace_back(word);}auto it = unique(words.begin(), words.end());words.erase(it, words.end());}set查找速度快练习11.9map<string, list<size_t>> m;练习11.10不能,因为map所提供的操作必须在关键字类型上定义⼀个严格弱序,⽽迭代器之间是⽆法⽐较的练习11.11int main(int argc, char* argv[]){typedef bool (*Comp)(const Sales_data&, const Sales_data&);//和decltype(compareIsbn)*等价multiset<Sales_data, Comp>bookStore(Comp);}练习11.12int main(int argc, char* argv[]){vector<string>str_vec(10);vector<int> i_vec(10);vector<pair<string, int>> psi1;vector<pair<string, int>> psi2;vector<pair<string, int>> psi3;string str, int num;for (auto i = 0; i < 10; ++i) {cin >> str >> num;str_vec.emplace_back(str);i_vec.emplace_back(num);}for (auto i = 0; i < 10; ++i) {psi1.push_back({ str_vec[i],i_vec[i] });psi1.emplace_back(pair<string, int>(str_vec[i], i_vec[i]));psi1.emplace_back(make_pair(str_vec[i], i_vec[i]));}}练习11.13int main(int argc, char* argv[]){vector<string>str_vec(10);vector<int> i_vec(10);vector<pair<string, int>> psi1;vector<pair<string, int>> psi2;vector<pair<string, int>> psi3;string str, int num;for (auto i = 0; i < 10; ++i) {cin >> str >> num;str_vec.emplace_back(str);i_vec.emplace_back(num);}for (auto i = 0; i < 10; ++i) {psi1.push_back({ str_vec[i],i_vec[i] });//不能⽤emplace_back来进⾏pair的列表初始化psi1.emplace_back(pair<string, int>(str_vec[i], i_vec[i]));psi1.emplace_back(make_pair(str_vec[i], i_vec[i]));}}练习11.14int main(int argc, char* argv[]){map<string, vector<pair<string, string>>> familys;string surname, name, birthday;while (cin >> surname >> name>>birthday) {familys[surname].emplace_back(make_pair(name, birthday));}for (const auto& f : familys) {cout << f.first << ":";for (const auto& n : f.second) {cout << n.first << "'s birthday is "<<n.second<<"";}cout << endl;}}练习11.15mapped_type:vector<int>key_type:intvalue_type:pair<const int,vector<int>>练习11.16int main(int argc, char* argv[]){map<int, int>i_i_map;auto it = i_i_map.begin();(*it).second = 5;}练习11.17copy(v.begin(), v.end(), inserter(c, c.end()));//调⽤insert成员函数插⼊到multiset尾后迭代器之前copy(v.begin(), v.end(), back_inserter(c));//multiset没有push_back成员函数,因此⽆法使⽤copy(c.begin(), c.end(), inserter(v,v.end()));//调⽤insert成员函数插⼊到vector尾后迭代器之前copy(c.begin(), c.end(), back_inserter(v));//调⽤push_back成员函数插⼊到vector尾后迭代器之前练习11.18map<string,size_t>::iterator练习11.19int main(int argc, char* argv[]){typedef bool (*Comp)(const Sales_data&, const Sales_data&);//和decltype(compareIsbn)*等价multiset<Sales_data, Comp>bookStore(compareIsbn);multiset<Sales_data, Comp>::iterator it = bookStore.begin();}练习11.20int main(int argc, char* argv[]){map<string, size_t> word_count;string word;while (cin >> word) {auto ret = word_count.insert({ word,1 });if (!ret.second)++ret.first->second;}for (const auto& w : word_count) {cout << w.first << "" << w.second << endl;}}//下标操作更容易编写和阅读练习11.21输⼊word,并将其设置为关键字插⼊到容器中,对应的值为0,然后对值进⾏递增,若此时容器中已有重复关键字则直接对该关键字对应的值进⾏递增。
C primer plus(第五版)课后编程练习答案解析

第一章概览编程练习1.您刚刚被MacroMuscle有限公司(Software for Hard Bodies)聘用。
该公司要进入欧洲市场,需要一个将英寸转换为厘米(1英寸=2.54 cm)的程序。
他们希望建立的该程序可提示用户输入英寸值。
您的工作是定义程序目标并设计该程序(编程过程的第1步和第2步)。
1.将英寸值转化为厘米值2.显示“输入英寸值”->得到该值->转换为厘米值->存储->告知用户已结束第二章C语言概述编程练习1.编写一个程序,调用printf()函数在一行上输出您的名和姓,再调用一次printf()函数在两个单独的行上输出您的名和姓,然后调用一对printf()函数在一行上输出您的名和姓。
输出应如下所示(当然里面要换成您的姓名):Anton BrucknerAntonBrucknerAnton Bruckner第一个输出语句第二个输出语句仍然是第二个输出语句第三个和第四个输出语句#include<stdio.h>int main(void){printf("He Jin\n");printf("He\n");printf("Jin\n");printf("He Jin\n");return(0);}2.编写一个程序输出您的姓名及地址。
#include<stdio.h>int main(void){printf("Name:He Jin\n");printf("Address:CAUC\n");return(0);}3.编写一个程序,把您的年龄转换成天数并显示二者的值。
不用考虑平年( fractional year)和闰年(leapyear)的问题。
#include<stdio.h>int main(void){int age=22;printf("Age:%d\n",age);printf("Day:%d\n",age*356);return(0);}4.编写一个能够产生下面输出的程序:For he's a jolly good fellow!For he's a jolly good fellow!For he's a jolly good fellow!Which nobody can deny!程序中除了main()函数之外,要使用两个用户定义的函数:一个用于把上面的夸奖消息输出一次:另一个用于把最后一行输出一次。