zoukankan      html  css  js  c++  java
  • 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;
            }  
        } 
    }
  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/GodZhuan/p/13843961.html
Copyright © 2011-2022 走看看