• C++ Primer第5版 第五章课后练习答案


    练习5.1

    空语句只包含有一个单独的分号,如果在程序的某个地方,语法上需要一条语句但逻辑上不需要,应使用空语句。

    练习5.2

    指用花括号括起来的语句和声明的序列。如果在程序的某个地方,语法上需要一条语句但逻辑上需要多条,则用块。

    练习5.3

    #include <iostream>
    
    int main()
    {
        int sum = 0, val = 50;
        while (val <= 100) 
            sum += val, ++val;
        
        std::cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;
        return 0;
    }
    #include <iostream>
    
    int main()
    {
        int val = 10;
        while (val >= 0) 
            std::cout << val << std::endl, --val;
        return 0;
    }
    #include <iostream>
    
    int main()
    {
        std::cout << "Please enter the two integers" << std::endl;
        int start, end;
        //我这里没有对传入格式进行判断,如果大家有需要可以添加这个功能
        std::cin >> start >> end;
        if (start > end) {
            std::swap(start, end);
        }
        while (start <= end) 
            std::cout << start << std::endl,++start;    
        return 0;
    }

    可读性降低了。

    练习5.4

    (a)while语句不断循环,直到迭代器指向尾后迭代器。

    (b)find()函数返回值赋给变量status,若所赋值为真则不断循环,因此退出循环后的status必为假。

    练习5.5

    int main()
    {
        int grade;
        cin >> grade;
        const vector<string> scores = { "F","D","C","B","A","A++" };
        string lettergrade;
        if (grade < 60)
            lettergrade = scores[0];
        else
            lettergrade = scores[(grade - 50) / 10];
        cout << lettergrade;
    }

    练习5.6

    int main()
    {
        int grade;
        cin >> grade;
        const vector<string> scores = { "F","D","C","B","A","A++" };
        string lettergrade = grade < 60 ? scores[0] : scores[(grade - 50) / 10];
        cout << lettergrade;
    }

    练习5.7

    (a)

    int ival1, ival2;
    if (ival1 != ival2)
        ival1 = ival2;//少了分号
    else ival1 = ival2 = 0;

    (b)

    if (ival1 < minval)
        minval=ival1;
        occurs = 1;//因为没有花括号将两句组成复合语句因此occurs必然在条件语句结束后执行

    (c)

    if (int ival = get_value())
        cout << "ival = " << ival << endl;
    if (!ival)
        cout << "ival = 0
    ";        
    // 第二个if中的ival未定义,ival的作用域仅限于第一个if循环中

    (d)

    if (ival = 0)
        ival = get_value();            
    // if中的判断应写为 if (0 == ival),因为ival会将所赋的值当作判断条件,此时if语句必然失败

    练习5.8

    “悬垂else”:我们怎么知道某个给定的else是和哪个if匹配呢?C++规定else与离它最近的尚未匹配的if匹配

    练习5.9

    char ch;
    unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
    while (cin >> ch) {
        if(ch=='a')
            ++aCnt;
        else if(ch=='e')
            ++eCnt;
        else if (ch=='i')
            ++iCnt;
        else if (ch=='o')
            ++oCnt;
        else if (ch=='u')
            ++uCnt;       
    }

    练习5.10

    unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
    while (cin >> ch) {
        switch (ch)
        {
        case'a':case'A':
            ++aCnt;
            break;
        case'e':case'E':
            ++eCnt;
            break;
        case'i':case'I':
            ++iCnt;
            break;
        case'o':case'O':
            ++oCnt;
            break;
        case'u':case'U':
            ++uCnt;
            break;
        default:
            break;
        }
    }

    练习5.11

    char ch;
    unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, spaceCnt = 0, tableCnt = 0, rowCnt = 0;
    while (cin >> ch) {
        switch (ch)
        {
        case'a':case'A':
            ++aCnt;
            break;
        case'e':case'E':
            ++eCnt;
            break;
        case'i':case'I':
            ++iCnt;
            break;
        case'o':case'O':
            ++oCnt;
            break;
        case'u':case'U':
            ++uCnt;
            break;
        case' ':
            ++spaceCnt;
            break;
        case'	':
            ++tableCnt;
            break;
        case'
    ':
            ++rowCnt;
            break;
        default:
            break;
        }
    }

    练习5.12

    char ch,ch_before=' ';
    unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, ffCnt = 0, flCnt = 0, fiCnt = 0;
    while (cin >> ch) {
        switch (ch)
        {
        case'a':case'A':
            ++aCnt;
            break;
        case'e':case'E':
            ++eCnt;
            break;
        case'i':
            if (ch_before == 'f')
                ++fiCnt;
        case'I':
            ++iCnt;
            break;
        case'o':case'O':
            ++oCnt;
            break;
        case'u':case'U':
            ++uCnt;
            break;
        case'f':
            if(ch_before=='f')
            ++ffCnt;
            break;
        case'l':
            if (ch_before == 'f')
                ++flCnt;
            break;
        default:
            break;
        }
        ch_before = ch;
    }

    练习5.13

    (a)少加break,导致程序执行匹配成功的标签代码后跨越case边界执行其他代码

    (b)控制流可能绕过一个在作用域内初始化的变量

    (c)case标签必须是整型常量表达式,不能用,代替case 1:case 2:

    (d)case标签必须是整型常量表达式

    练习5.14

    int main()
    {
        string str,str_before,max_str;
        unsigned strCnt = 0, flag = 0;
        while (cin >> str) {
            if (str == str_before)
                ++strCnt;
            else {
                if (strCnt > 1 && strCnt > flag) {
                    max_str = str;
                    flag = strCnt;
                }
                strCnt = 1;
            }
            str_before = str;
        }
        if (flag) {
            cout << "不存在重复出现的单词" << endl;
        }
        else {
            cout << str << " " << strCnt << endl;
            flag = true;
        }
    }

    练习5.15

    (a):ix应该在循环外定义

    (b):缺少一个;号,没有初始化ix

    (c):++sz,永远也结束不了

    练习5.16

    我更倾向于使用for循环,因为for循环比较简洁

    练习5.17

    template <typename T>
    bool compare(vector<T> const& a, vector<T> const& b)
    {
        auto size = b.size();
        if (a.size() < b.size()) {
            size = a.size();
        }
        for (decltype(size) i = 0; i < size; i++) {
            if (a[i] != b[i])return false;
        }
        return true;
    }

    练习5.18

    (a):打印语句,然后传入两个值并输出两个值的和。do后面那么多条语句,需要使用花括号

    (b):因为do循环体中肯定还需要使用到ival这个变量,所以应该将其定义在循环体外部

    (c):同上

    练习5.19

    do {
        string v1, v2;
        cout << "Please input two string" << endl;
        if (cin >> v1 >> v2)
            cout << (v1.size() > v2.size() ? v2 : v1) << endl;
    } while (cin);

    练习5.20

    int main()
    {
        string  str, str_pre;
        bool flag = false;
        do{    
            cin >> str;
            if (str==str_pre) {
                cout << str;
                break;
            }
            str_pre = str;
        } while (cin);
        if (flag)cout << "没有任何单词是连续重复出现的" << endl;
    }

    练习5.21

    int main()
    {
        string  str, str_pre;
        bool flag = false;
        do{    
            cin >> str;
            if (str==str_pre&&isupper(str_pre.at(0))) {
                cout << str;
                break;
            }
            str_pre = str;
        } while (cin);
        if (flag)cout << "没有任何单词是连续重复出现的" << endl;
    }

    练习5.22

    int sz;
    do {
        sz = get_size();
    
    } while (sz <= 0);

    练习5.23

    int num1,num2;
    while (cin >> num1 >> num2) {
        cout << num1 / num2 << endl;
    } 

    练习5.24

    int main()
    {
        int num1,num2;
        while (cin >> num1 >> num2) {
            if (num2 == 0)throw std::runtime_error("被除数不能为0");
            cout << num1 / num2 << endl;
        } 
    }

    练习5.25

    int main()
    {
        int num1,num2;
        while (cin >> num1 >> num2) {      
            try
            {
                if (num2 == 0)throw std::runtime_error("除数不能为0");
                cout << static_cast<double>(num1) / num2 << endl;
            }
            catch (std::runtime_error err)
            {
                cout << err.what();
                cout << "
    是否需要重新输入? Enter y or n:" << endl;
                char c;
                cin >> c;
                if (!cin || c == 'n')
                    break;
            }  
        } 
    }
  • 相关阅读:
    CRM 2013 相关下载 / 2013-10-11
    四十,Importer extension 主要(/imports)
    三十九,GeoWebCache 播种和截断(/seed)
    三十八,GeoWebCache 重新加载(/reload)
    三十七,GeoWebCache 质量截断(/statistics)
    三十六,GeoWebCache 质量截断(/masstruncate)
    三十五,GeoWebCache 图层(/layers)
    三十四,GeoWebCache 主页(/index)
    三十三,GeoWebCache 网格集(/gridsets)
    三十二,GeoWebCache 全局配置(/global)
  • 原文地址:https://www.cnblogs.com/GodZhuan/p/13843961.html
Copyright © 2020-2023  润新知