《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 0
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
        {
            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 0
std::exception
是否继续?    Y/N

它能够匹配到抛出的异常但是不提供额外的信息。

《C++primer》v5 第5章 语句 读书笔记 习题答案,布布扣,bubuko.com

时间: 2024-11-08 17:30:49

《C++primer》v5 第5章 语句 读书笔记 习题答案的相关文章

《C++primer》v5 第1章 开始 读书笔记 习题答案

从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和cout分别是istream和ostream的对象. #include<iostream> using namespace std; int main() { cout<<"Hello,world"<<endl; return 0; } 1.4 #incl

《C++primer》v5 第4章 表达式 读书笔记 习题答案

4.1 105 4.2 *vec.begin()=*(vec.begin())//先调用点运算符,再解引用 *vec.begin()+1=(*vec.begin())+1//先解引用,再加一 4.3略? 4.4 (12/3*4)+(5*15)+(24%4/2)=91 4.5 (a)-86(b)-16 (c)0 (d)0 4.6 n%2 4.7 溢出:计算结果超出该数据类型所能表示的范围 2147483647+1 1U-2 ... 4.8 比较低.. 4.9 首先判断cp是否为空指针,若非空指针则

《C++primer》v5 第6章 函数 读书笔记 习题答案

6.1 实参是在函数调用处填写的参数.形参是在函数体使用的参数. 实参是形参的初始值. 具体参见:http://blog.163.com/zhengguo_li/blog/static/703014802013423501214/ 6.2 (a)该函数试图返回一个局部变量.当函数调用结束后,s所占内存将会被释放,所以返回s是无效的 (b)该函数缺少返回值 (c)定义了两个同名的形参 (d)后面的语句应该写在{}里 6.3.6.4 using namespace std; int fact(int

《C++primer》v5 第7章 类 读书笔记 习题答案

7.1.7.2.7.3 #include<iostream> #include<cstdio> #include<vector> #include<string> using namespace std; struct Sales_data { string bookNo;//isbn编号 unsigned units_sold=0;//该书的销量 double revenue=0.0;//该书的总销售收入 string isbn()const {retur

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

《C++primer》v5 第2章 C++基础 读书笔记 习题答案

2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节,double是双精度,一般占用8个字节,它们可表示的数据范围也不相同. 2.2 利率用double,本金和付款用int 2.3 unsigned u=10,u2=42; cout<<u2-u<<endl; cout<<u-u2<<endl; int i=10,

《C++primer》v5 第12章 动态内存 读书笔记 习题答案

这一章暂时没写完,先留着以后再写. 在C++程序中,程序员可以给手动开辟内存,但是这块内存需要手动释放,不便管理,因此新标准提供智能指针类型来管理动态对象.它负责自动释放所指向的对象. shared_prt允许多个指针指向同一个对象 unique_ptr独占所指向的对象 weak_ptr是一个弱引用,指向shared_ptr所管理的对象 一些操作: p=q;//递减p的引用计数,递增q的引用计数 shared_ptr<T> p(q);//p是q的拷贝,递增q的引用计数 通过make_share

《C++primer》v5 第8章 IO库 读书笔记 习题答案

8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear(); is>>a; is.setstate(old_state); return is; } int main() { read(cin); return 0; } 8.3 读到eof或错误类型的时候 8.4 #include<fstream> using namespace std;

《C++primer》v5 第11章 关联容器 读书笔记 习题答案

11.1 map是关联容器,vector是顺序容器 11.2 略 11.3 int main() { map<string,int> word; string s; while(cin>>s) word[s]++; for(auto i:word) cout<<i.first<<" "<<i.second<<endl; return 0; } 11.4 void convers(string &s) { s