《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;
) cout<<"A++"<<endl;
<=score&&score<=) cout<<"A"<<endl;
<=score&&score<=) cout<<"B"<<endl;
<=score&&score<=) cout<<"C"<<endl;
<=score&&score<=) cout<<"D"<<endl;
else cout<<"D"<<endl;
;
}
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)
{
;
; 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()
{
;
string str;
while(cin>>str)
ans+=solve(str);
cout<<ans<<endl;
;
}
关于switch语句,如果在case后面(如果该case不是最后一个case的话)定义新的变量,要求该变量不能被初始化否则会编译错误,允许赋值。
5.10
using namespace std;
int solve(const string &str)
{
;
; 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()
{
;
string str;
while(cin>>str)
ans+=solve(str);
cout<<ans<<endl;
;
}
5.11
using namespace std;
int solve(const string &str)
{
;
; 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()
{
;
string str;
while(cin>>str)
ans+=solve(str);
cout<<ans<<endl;
;
}
5.12
int solve(const string &str)
{
;
; i<str.size(); ++i)
{
]=='f')
{
if(str[i]=='f'||str[i]=='l'||str[i]=='i')
ans++;
}
}
return ans;
}
int main()
{
;
string str;
while(cin>>str)
ans+=solve(str);
cout<<ans<<endl;
;
}
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;
,maxi=;
while(cin>>word)
{
)
ans=;
else
{
if(word==last)
ans++;
else
ans=;
}
last=word;
if(maxi<ans)
{
maxi=ans;
best=last;
}
}
) cout<<"任何单词都没有连续出现过!"<<endl;
else cout<<best<< " 连续出了 "<<maxi<< "次"<<endl;
;
}
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)
{
; i<a.size(); ++i)
if(a[i]!=b[i])
return false;
return true;
}
int main()
{
vector<,,,},vecb {,,,,,,};
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;
;
}
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);
;
}
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;
;
}
5.21
int main()
{
string last,word;
bool out=false;
while(cin>>word)
{
]))
{
out=true;
break;
}
last=word;
}
if(out) cout<<last<<endl;
else cout<<"没有任何单词是连续重复出现的!"<<endl;
;
}
5.22
goto同switch类似,不能跳过一个有初始化的变量。可以向后跳。
)
{
int sz=get_size();
)
break;
}
5.23
int main()
{
int a,b;
while(cin>>a>>b)
cout<<a/b<<endl;
;
}
5.24
注意runtime_error该异常定义在stdexcept头文件里。
没有设定catch语句的时候,程序会转到名为terminate的标准库函数。
#include<iostream>
#include<stdexcept>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
) throw runtime_error("b is zero!");
cout<<a/b<<endl;
}
;
}
控制台输出:
terminate 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
{
) throw runtime_error("b is zero!");
cout<<a/b<<endl;
}
catch (runtime_error err)
{
cout<<err.what()<<endl;
cout<<"是否继续? Y/N"<<endl;
];
cin>>s;
]=='N') break;
}
}
try和catch必须同时出现,不能只有try没有catch。try和catch有各自的作用域,内部变量无法相互访问。当try中抛出异常将寻找catch中匹配的异常声明,如果找不到交给terminate,否则执行相应catch下的语句。
如果程序如下
int main()
{
int a,b;
while(cin>>a>>b)
{
try
{
) throw runtime_error("b is zero!");
cout<<a/b<<endl;
}
catch (range_error err)
{
cout<<err.what()<<endl;
cout<<"是否继续? Y/N"<<endl;
];
cin>>s;
]=='N') break;
}
}
;
}
输入1 0 将转到terminate。因为找不到匹配的catch。
而如下程序:
int main()
{
int a,b;
while(cin>>a>>b)
{
try
{
) throw runtime_error("b is zero!");
cout<<a/b<<endl;
}
catch (exception err)
{
cout<<err.what()<<endl;
cout<<"是否继续? Y/N"<<endl;
];
cin>>s;
]=='N') break;
}
}
;
}
输入输出如下:
std::exception 是否继续? Y/N
它能够匹配到抛出的异常但是不提供额外的信息。
《C++primer》v5 第5章 语句 读书笔记 习题答案的更多相关文章
- 《C++primer》v5 第1章 开始 读书笔记 习题答案
从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和c ...
- 《C++primer》v5 第6章 函数 读书笔记 习题答案
6.1 实参是在函数调用处填写的参数.形参是在函数体使用的参数. 实参是形参的初始值. 具体参见:http://blog.163.com/zhengguo_li/blog/static/7030148 ...
- 《C++primer》v5 第4章 表达式 读书笔记 习题答案
4.1 105 4.2 *vec.begin()=*(vec.begin())//先调用点运算符,再解引用 *vec.begin()+1=(*vec.begin())+1//先解引用,再加一 4.3略 ...
- 《C++primer》v5 第7章 类 读书笔记 习题答案
7.1.7.2.7.3 #include<iostream> #include<cstdio> #include<vector> #include<strin ...
- 《C++primer》v5 第8章 IO库 读书笔记 习题答案
8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear( ...
- 《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案
本章问题 1.char *p="hello world";与char p[]="hello world"的问题. 简单说前者是一个指向字符串常量的指针,后者是一 ...
- 《C++primer》v5 第2章 变量和基本类型 读书笔记 习题答案
2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节 ...
- C++primer(第五版)读书笔记&习题解答---CHAPTER 3
C++标准库类型包括:string,vector和迭代器,其中string是可变长的字符序列,vector存放的是某种给定类型对象的可变长序列,迭代器是string和vector的配套类型,常被用于访 ...
- C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 3
Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...
随机推荐
- [分享] 封装工具ES4配置文件解释
[分享] 封装工具ES4配置文件解释 LiQiang 发表于 2015-2-3 14:41:21 https://www.itsk.com/thread-346132-1-4.html [分享] 封装 ...
- 使用JavaMail实现发送邮件功能
package com.dunn.model; import java.util.Properties; import javax.mail.Address; import javax.mail.Me ...
- 【转】ArcGIS地图缓存制作简介
[PDF]ArcGIS 地图缓存制作简介 - Esri中国 ArcGIS地图缓存制作简介 制作好的电子地图只有发布为服务后才能为更多的用户所查看与使用.ArcGIS Server 为共享 GIS 资源 ...
- SPSS数据分析—对数线性模型
我们之前讲Logistic回归模型的时候说过,分类数据在使用卡方检验的时候,当分类过多或者每个类别的水平数过多时,单元格会划分的非常细,有可能会导致大量单元格频数很小甚至为0,并且卡方检验虽然可以分析 ...
- 搭建IONIC开发环境
1.准备工作 下载 Node.js(下载包),WebStorm(IDE,编写代码,浏览器调试),JDK(webstorm 运行环境),Android SDK (Android编译) 2.配 ...
- navicat快捷键
ctrl+R.N 运行窗口sql ctrl+shift+r 运行选择sql ctr+q 打开窗口 ctrl+/ |ctrl+shift+/ 注释 | 解除 ctrl+L 删除一行的内容 ctr ...
- Python函数参数学习笔记
1.Python中函数参数类型可分为五种: f(x):x为位置参数: f(x,n=2):n为默认参数,调用时可以省略参数n,如f(5); f(*args):*args表示把args这个list或tup ...
- PDF 补丁丁 0.5.0.2657 发布
新版本修正了导出图片时由于路径存在空白导致出错.在 Windows 10 和高分辨率显示屏上显示字体模糊.控件尺寸错位等各种问题. 默认显示工具栏.
- Java 入门(一) - 环境变量
Win 7 X64环境 计算机(右键)-> 属性 -> 高级系统设置 -> 环境变量1.新建系统变量 : JAVA_HOME C:\Program Files (x86)\Java\ ...
- sql 多行转换为一行
select 字段1, [val]=( select 字段2 +',' from 表名 as b where b.字段1 = a.字段1 for xml path('')) from 表名 as a ...