首页 > 代码库 > 《C++primer》v5 第5章 语句 读书笔记 习题答案
《C++primer》v5 第5章 语句 读书笔记 习题答案
5.1
空语句只有一个";"。如果什么也不想做可以使用空语句。
5.2
用花括号{}括起来的叫块,也叫复合语句。有多条语句作用在同一个作用域时,需要用花括号括起来。
5.3
降低了。
5.4
(a)每次迭代时候会初始化iter,但是iter缺少初值,所以这段代码根本不会通过编译。另外这里的括号需要一个bool类型的,而定义迭代器根本不会返回一个bool类型。假如上面那些问题都可以通过,每次迭代都会初始化这个iter,会导致死循环。
(b)我试了一下编译未通过是因为没找到适合的find函数。即使通过了仍然存在上个题里的问题。
5.5
int main(){ int score; cin>>score; if(score==100) cout<<"A++"<<endl; else if(90<=score&&score<=99) cout<<"A"<<endl; else if(80<=score&&score<=89) cout<<"B"<<endl; else if(70<=score&&score<=79) cout<<"C"<<endl; else if(60<=score&&score<=69) cout<<"D"<<endl; else cout<<"D"<<endl; return 0;}
5.6
略
5.7
(a)第二行语句缺少分号
(b)第二三行应该用{}括起来
(c)对于一个if如果get_value()返回一个0,if下的语句将无法执行
对于第二个if,ival不属于它的作用域内
(d)if内的条件永远都不会为真
5.8
当if语句多余else语句的时候,我们将不知把else语句分配给哪个if语句。这样的else语句称为悬垂else。
在C++语言中,else与离它最近的尚未匹配的if匹配。
5.9
写错了。。我用的是switch。。if也是同样。。懒得改了。。
#include<iostream>#include<algorithm>#include<cstring>using namespace std;int solve(const string &str){ int ans=0; for(int i=0; i<str.size(); ++i) { switch(str[i]) { case ‘a‘: ans++; break; case ‘e‘: ans++; break; case ‘i‘: ans++; break; case ‘o‘: ans++; break; case ‘u‘: ans++; break; } } return ans;}int main(){ int ans=0; string str; while(cin>>str) ans+=solve(str); cout<<ans<<endl; return 0;}
关于switch语句,如果在case后面(如果该case不是最后一个case的话)定义新的变量,要求该变量不能被初始化否则会编译错误,允许赋值。
5.10
using namespace std;int solve(const string &str){ int ans=0; for(int i=0; i<str.size(); ++i) { if(str[i]==‘a‘||str[i]==‘A‘) ans++; else if(str[i]==‘e‘||str[i]==‘E‘) ans++; else if(str[i]==‘i‘||str[i]==‘I‘) ans++; else if(str[i]==‘o‘||str[i]==‘O‘) ans++; else if(str[i]==‘u‘||str[i]==‘U‘) ans++; } return ans;}int main(){ int ans=0; string str; while(cin>>str) ans+=solve(str); cout<<ans<<endl; return 0;}
5.11
using namespace std;int solve(const string &str){ int ans=0; for(int i=0; i<str.size(); ++i) { if(isspace(str[i])) ans++; else if(str[i]==‘a‘||str[i]==‘A‘) ans++; else if(str[i]==‘e‘||str[i]==‘E‘) ans++; else if(str[i]==‘i‘||str[i]==‘I‘) ans++; else if(str[i]==‘o‘||str[i]==‘O‘) ans++; else if(str[i]==‘u‘||str[i]==‘U‘) ans++; } return ans;}int main(){ int ans=0; string str; while(cin>>str) ans+=solve(str); cout<<ans<<endl; return 0;}
5.12
int solve(const string &str){ int ans=0; for(int i=1; i<str.size(); ++i) { if(str[i-1]==‘f‘) { if(str[i]==‘f‘||str[i]==‘l‘||str[i]==‘i‘) ans++; } } return ans;}int main(){ int ans=0; string str; while(cin>>str) ans+=solve(str); cout<<ans<<endl; return 0;}
5.13
(a)每个case后面都缺少一个break
(b)第四行会编译错误。case 1不是最后一个case,所以它定义的int ix不能被初始化。
(c)case 后面只能由一个常量,不能多个
(d)case后面只能跟常量,不能跟变量。在这几个变量的定义前加const即可。
5.14
using namespace std;int main(){ string word,last,best; int ans=0,maxi=0; while(cin>>word) { if(ans==0) ans=1; else { if(word==last) ans++; else ans=1; } last=word; if(maxi<ans) { maxi=ans; best=last; } } if(maxi==1) cout<<"任何单词都没有连续出现过!"<<endl; else cout<<best<< " 连续出了 "<<maxi<< "次"<<endl; return 0;}
5.15
(a)ix的作用域仅在for循环的括号和后面的花括号里面,下面的if语句中ix已没有定义
(b)for循环写错了,少了一部分。应该这么写:for(;ix!=sz;++ix){}
(c)这里由于ix和sz同步同速增长,所以只要ix!=sz曾经为真,那么它将永远不会为假
5.16
视情况而定。略。
5.17
using namespace std;bool judge(const vector<int>& a,const vector<int>& b){ for(int i=0; i<a.size(); ++i) if(a[i]!=b[i]) return false; return true;}int main(){ vector<int> veca {0,1,1,2},vecb {0,1,1,2,3,5,8}; if(veca.size()<vecb.size()&&judge(veca,vecb)) cout<<"a是b的前缀!"<<endl; else if(veca.size()>=vecb.size()&&judge(vecb,veca)) cout<<"b是a的前缀!"<<endl; else cout<<"不满足前缀关系!"<<endl; return 0;}
5.18
(a)首先do与while之间应该用{}括起来,其次这是个死循环
(b)在while内定义的ival,在{}内无法使用,因为不在其作用域内
(c)在{}定义的变量ival,在while()无法使用。
5.19
int main(){ string a,b; cin>>a>>b; do { if(a.size()<b.size()) cout<<a<<endl; else cout<<b<<endl; } while(cin>>a>>b); return 0;}
5.20
int main(){ string last,word; bool out=false; while(cin>>word) { if(word==last) { out=true; break; } last=word; } if(out) cout<<last<<endl; else cout<<"没有任何单词是连续重复出现的!"<<endl; return 0;}
5.21
int main(){ string last,word; bool out=false; while(cin>>word) { if(word==last&&isupper(last[0])) { out=true; break; } last=word; } if(out) cout<<last<<endl; else cout<<"没有任何单词是连续重复出现的!"<<endl; return 0;}
5.22
goto同switch类似,不能跳过一个有初始化的变量。可以向后跳。
while(1) { int sz=get_size(); if(sz>0) break; }
5.23
int main(){ int a,b; while(cin>>a>>b) cout<<a/b<<endl; return 0;}
5.24
注意runtime_error该异常定义在stdexcept头文件里。
没有设定catch语句的时候,程序会转到名为terminate的标准库函数。
#include<iostream>#include<stdexcept>using namespace std;int main(){ int a,b; while(cin>>a>>b) { if(b==0) throw runtime_error("b is zero!"); cout<<a/b<<endl; } return 0;}
控制台输出:
1 0terminate called after throwing an instance of ‘std::runtime_error‘ what(): b is zero!This application has requested the Runtime to terminate it in an unusual way.Please contact the application‘s support team for more information.
5.25
int a,b; while(cin>>a>>b) { try { if(b==0) throw runtime_error("b is zero!"); cout<<a/b<<endl; } catch (runtime_error err) { cout<<err.what()<<endl; cout<<"是否继续? Y/N"<<endl; char s[5]; cin>>s; if(s[0]==‘N‘) break; } }
try和catch必须同时出现,不能只有try没有catch。try和catch有各自的作用域,内部变量无法相互访问。当try中抛出异常将寻找catch中匹配的异常声明,如果找不到交给terminate,否则执行相应catch下的语句。
如果程序如下
int main(){ int a,b; while(cin>>a>>b) { try { if(b==0) throw runtime_error("b is zero!"); cout<<a/b<<endl; } catch (range_error err) { cout<<err.what()<<endl; cout<<"是否继续? Y/N"<<endl; char s[5]; cin>>s; if(s[0]==‘N‘) break; } } return 0;}
输入1 0 将转到terminate。因为找不到匹配的catch。
而如下程序:
int main(){ int a,b; while(cin>>a>>b) { try { if(b==0) throw runtime_error("b is zero!"); cout<<a/b<<endl; } catch (exception err) { cout<<err.what()<<endl; cout<<"是否继续? Y/N"<<endl; char s[5]; cin>>s; if(s[0]==‘N‘) break; } } return 0;}
输入输出如下:
1 0std::exception是否继续? Y/N
它能够匹配到抛出的异常但是不提供额外的信息。