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

合集《C++ Primer第5版》 课后练习答案 - 丸子球球 - 博客园 (cnblogs.com)

练习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 "  std::endl;
    return 0;
}
#include <iostream>

int main()
{
    int val = 10;
    while (val >= 0) 
        std::cout  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  std::endl,++start;    
    return 0;
}

可读性降低了。


练习5.4

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

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


练习5.5

int main()
{
    int grade;
    cin >> grade;
    const vectorstring> 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 vectorstring> 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 = "  endl;
if (!ival)
    cout "ival = 0\n";        // 第二个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

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'\t':
        ++tableCnt;
        break;
    case'\n':
        ++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 &amp;&amp; strCnt > flag) {
                max_str = str;
                flag = strCnt;
            }
            strCnt = 1;
        }
        str_before = str;
    }
    if (flag) {
        cout "不存在重复出现的单词"  endl;
    }
    else {
        cout " "  endl;
        flag = true;
    }
}

练习5.15

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

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

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


练习5.16

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


练习5.17

template <typename T>
bool compare(vectorconst&amp; a, vectorconst&amp; b)
{
    auto size = b.size();
    if (a.size()  b.size()) {
        size = a.size();
    }
    for (decltype(size) i = 0; 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  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&amp;&amp;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  endl;
} 

练习5.24

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

练习5.25

int main()
{
    int num1,num2;
    while (cin >> num1 >> num2) {      
        try
        {
            if (num2 == 0)throw std::runtime_error("除数不能为0");
            cout double>(num1) / num2  endl;
        }
        catch (std::runtime_error err)
        {
            cout  err.what();
            cout "\n是否需要重新输入? Enter y or n:"  endl;
            char c;
            cin >> c;
            if (!cin || c == 'n')
                break;
        }  
    } 
}

posted @ 2020-10-24 15:55  丸子球球  阅读(362)  评论(0编辑  收藏  举报