C++ Primer第五版_第五章习题答案(11~20)
迪丽瓦拉
2025-06-01 21:43:20
0

文章目录

      • 练习5.11
      • 练习5.12
      • 练习5.13
      • 练习5.14
      • 练习5.15
      • 练习5.16
      • 练习5.17
      • 练习5.18
      • 练习5.19
      • 练习5.20

练习5.11

修改统计元音字母的程序,使其也能统计空格、制表符、和换行符的数量。

#include using std::cin; using std::cout; using std::endl;int main()
{unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, spaceCnt = 0, tabCnt = 0, newLineCnt = 0;char ch;while (cin >> std::noskipws >> 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':++tabCnt;break;case '\n':++newLineCnt;break;}cout << "Number of vowel a(A): \t" << aCnt << '\n'<< "Number of vowel e(E): \t" << eCnt << '\n'<< "Number of vowel i(I): \t" << iCnt << '\n'<< "Number of vowel o(O): \t" << oCnt << '\n'<< "Number of vowel u(U): \t" << uCnt << '\n'<< "Number of space: \t" << spaceCnt << '\n'<< "Number of tab char: \t" << tabCnt << '\n'<< "Number of new line: \t" << newLineCnt << endl;return 0;
}

练习5.12

修改统计元音字母的程序,使其能统计含以下两个字符的字符序列的数量: ff、fl和fi。

#include using std::cin; using std::cout; using std::endl;int main()
{unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, spaceCnt = 0, tabCnt = 0, newLineCnt = 0, ffCnt = 0, flCnt = 0, fiCnt = 0;char ch, prech = '\0';while (cin >> std::noskipws >> ch){switch (ch){case 'a':case 'A':++aCnt;break;case 'e':case 'E':++eCnt;break;case 'i':if (prech == 'f') ++fiCnt;case 'I':++iCnt;break;case 'o':case 'O':++oCnt;break;case 'u':case 'U':++uCnt;break;case ' ':++spaceCnt;break;case '\t':++tabCnt;break;case '\n':++newLineCnt;break;case 'f':if (prech == 'f') ++ffCnt;break;case 'l':if (prech == 'f') ++flCnt;break;}prech = ch;}cout << "Number of vowel a(A): \t" << aCnt << '\n'<< "Number of vowel e(E): \t" << eCnt << '\n'<< "Number of vowel i(I): \t" << iCnt << '\n'<< "Number of vowel o(O): \t" << oCnt << '\n'<< "Number of vowel u(U): \t" << uCnt << '\n'<< "Number of space: \t" << spaceCnt << '\n'<< "Number of tab char: \t" << tabCnt << '\n'<< "Number of new line: \t" << newLineCnt << '\n'<< "Number of ff: \t" << ffCnt << '\n'<< "Number of fl: \t" << flCnt << '\n'<< "Number of fi: \t" << fiCnt << endl;return 0;
}

练习5.13

下面显示的每个程序都含有一个常见的编码错误,指出错误在哪里,然后修改它们。

(a) unsigned aCnt = 0, eCnt = 0, iouCnt = 0;char ch = next_text();switch (ch) {case 'a': aCnt++;case 'e': eCnt++;default: iouCnt++;}
(b) unsigned index = some_value();switch (index) {case 1:int ix = get_value();ivec[ ix ] = index;break;default:ix = ivec.size()-1;ivec[ ix ] = index;}
(c) unsigned evenCnt = 0, oddCnt = 0;int digit = get_num() % 10;switch (digit) {case 1, 3, 5, 7, 9:oddcnt++;break;case 2, 4, 6, 8, 10:evencnt++;break;}
(d) unsigned ival=512, jval=1024, kval=4096;unsigned bufsize;unsigned swt = get_bufCnt();switch(swt) {case ival:bufsize = ival * sizeof(int);break;case jval:bufsize = jval * sizeof(int);break;case kval:bufsize = kval * sizeof(int);break;}
  • (a) 少了 break语句。应该为:
	unsigned aCnt = 0, eCnt = 0, iouCnt = 0;char ch = next_text();switch (ch) {case 'a': aCnt++; break;case 'e': eCnt++; break;default: iouCnt++; break;}
  • (b) 在 default 分支当中,ix 未定义。应该在外部定义ix。
    unsigned index = some_value();int ix;switch (index) {case 1:ix = get_value();ivec[ ix ] = index;break;default:ix = static_cast(ivec.size())-1;ivec[ ix ] = index;}
  • © case 后面应该用冒号而不是逗号。
    unsigned evenCnt = 0, oddCnt = 0;int digit = get_num() % 10;switch (digit) {case 1: case 3: case 5: case 7: case 9:oddcnt++;break;case 2: case 4: case 6: case 8: case 0:evencnt++;break;}
  • (d) case 标签必须是整型常量表达式。
    const unsigned ival=512, jval=1024, kval=4096;unsigned bufsize;unsigned swt = get_bufCnt();switch(swt) {case ival:bufsize = ival * sizeof(int);break;case jval:bufsize = jval * sizeof(int);break;case kval:bufsize = kval * sizeof(int);break;}

练习5.14

编写一段程序,从标准输入中读取若干string对象并查找连续重复出现的单词,所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词。如果这样的单词存在,输出重复出现的最大次数;如果不存在,输出一条信息说明任何单词都没有连续出现过。例如:如果输入是:

how now now now brown cow cow

那么输出应该表明单词now连续出现了3次。

#include 
#include using std::cout; using std::cin; using std::endl; using std::string; using std::pair;int main()
{pair max_duplicated;int count = 0;for (string str, prestr; cin >> str; prestr = str){if (str == prestr) ++count;else count = 0;if (count > max_duplicated.second) max_duplicated = { prestr, count };}if (max_duplicated.first.empty()) cout << "There's no duplicated string." << endl;else cout << "the word " << max_duplicated.first << " occurred " << max_duplicated.second + 1 << " times. " << endl;return 0;
}

练习5.15

说明下列循环的含义并改正其中的错误。

(a) for (int ix = 0; ix != sz; ++ix) { /* ... */ }if (ix != sz)// . . .
(b) int ix;for (ix != sz; ++ix) { /* ... */ }
(c) for (int ix = 0; ix != sz; ++ix, ++sz) { /*...*/ }

应该改为下面这样:

(a) int ix;for (ix = 0; ix != sz; ++ix)  { /* ... */ }if (ix != sz)// . . .
(b) int ix;for (; ix != sz; ++ix) { /* ... */ }
(c) for (int ix = 0; ix != sz; ++ix) { /*...*/ }

练习5.16

while 循环特别适用于那种条件不变、反复执行操作的情况,例如,当未达到文件末尾时不断读取下一个值。for 循环更像是在按步骤迭代,它的索引值在某个范围内一次变化。根据每种循环的习惯各自编写一段程序,然后分别用另一种循环改写。如果只能使用一种循环,你倾向于哪种?为什么?

int i;
while ( cin >> i )// ...for (int i = 0; cin >> i;)// ...for (int i = 0; i != size; ++i)// ...int i = 0;
while (i != size)
{// ...++i;
}

如果只能用一种循环,我会更倾向使用 while,因为while 显得简洁,代码可读性强。

练习5.17

假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。为了实现这一目标,对于两个不等长的vector对象,只需挑出长度较短的那个,把它的所有元素和另一个vector对象比较即可。例如,如果两个vector对象的元素分别是0、1、1、2 和 0、1、1、2、3、5、8,则程序的返回结果为真。

#include 
#include using std::cout; using std::vector;bool is_prefix(const vector& lhs, const vector& rhs)
{if (lhs.size() > rhs.size())return is_prefix(rhs, lhs);for (unsigned i = 0; i != lhs.size(); ++i)if (lhs[i] != rhs[i]) return false;return true;
}int main()
{vector l{ 0, 1, 1, 2 };vector r{ 0, 1, 1, 2, 3, 5, 8 };cout << (is_prefix(r, l) ? "yes\n" : "no\n");return 0;
}

练习5.18

说明下列循环的含义并改正其中的错误。

(a) do { // 应该添加花括号int v1, v2;cout << "Please enter two numbers to sum:" ;if (cin >> v1 >> v2)cout << "Sum is: " << v1 + v2 << endl;}while (cin);
(b) int ival;do {// . . .} while (ival = get_response()); // 应该将ival 定义在循环外
(c) int ival = get_response();do {ival = get_response();} while (ival); // 应该将ival 定义在循环外

练习5.19

编写一段程序,使用do while 循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。

#include 
#include using std::cout; using std::cin; using std::endl; using std::string;int main()
{string rsp;do{cout << "Input two strings: ";string str1, str2;cin >> str1 >> str2;cout << (str1 <= str2 ? str1 : str2)<< " is less than the other. " << "\n\n"<< "More? Enter yes or no: ";cin >> rsp;} while (tolower(rsp[0]) == 'y');return 0;
}

练习5.20

编写一段程序,从标准输入中读取string对象的序列直到连续出现两个相同的单词或者所有的单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次时使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有任何单词是连续重复出现的。

#include 
#include 
using std::cout; using std::cin; using std::endl; using std::string;int main()
{string read, tmp;while (cin >> read)if (read == tmp) break; else tmp = read;if (cin.eof())  cout << "no word was repeated." << endl;else            cout << read << " occurs twice in succession." << endl;return 0;
}

相关内容