C++ Primer(第五版)课后习题记录 —— 第五章
2018-04-05 17:33
471 查看
第五章 语句
练习 5.1
空语句是只含一个单独的分号的语句。 当在程序的某处,语法上需要一条语句但逻辑上并不需要时,会用到空语句。练习5.2
块是指用花括号括起来的语句和声明的序列。当在程序的某处,语法上需要一条语句但逻辑上需要多条语句时,会用到块。练习5.3
while (val <= 10) sum += val,++val;
降低了可读性,不影响结果,但这样的改变没什么意义。
练习5.4
(a) iter 一开始就没有被定义过。string::iterator iter = s.begin(); while (iter != s.end()) { /* ...*/ }
(b) if 语句中的 status 是未定义的。
bool status; while (status = find(word)) { /* ...*/ } if (!status) { /* ...*/ }
练习 5.5
#include <iostream> #include<string> #include<vector> using namespace std; int main(){ const vector<string> rate = {"F", "D", "C", "B", "A", "S"}; int grades; string lettergrade; while (cin >> grades){ if (grades < 60) lettergrade = rate[0]; else{ lettergrade = rate[(grades - 50)/10]; if (grades % 10 > 6 && grades != 100) lettergrade += '+'; else if (grades % 10 < 3 && grades != 100) lettergrade += '-'; } cout << lettergrade << endl; } return 0; }
练习5.6
#include <iostream> #include<string> #include<vector> using namespace std; int main(){ const vector<string> rate = {"F", "D", "C", "B", "A", "S"}; int grades; string lettergrade; while (cin >> grades){ lettergrade = (grades < 60) ? rate[0] : rate[(grades - 50)/10]; lettergrade += (grades < 60 || grades == 100) ? "" : (grades % 10 < 3) ? "-" : (grades % 10 > 6) ? "+" : ""; cout << lettergrade << endl; } return 0; }
练习5.7
//(a) 少个分号啊 if (ival1 != ival2) ival1 = ival2; else ival1 = ival2 = 0; //(b) 需要用块实现 if (ival < minval){ minval = ival; occurs = 1; } //(c) 需要用 else 实现 if (int ival = get_value()) cout << "ival = " << ival << endl; else if (!ival) cout << "ival = 0\n"; //(d) condition 部分恒为真 if (ival == 0) ival = get_value();
练习5.8
悬垂else 问题是指在复杂的条件语句中如何判断 else 与 if 之间的匹配关系的问题。在c++中,规定了 else 与离它最近的尚未匹配的 if 匹配。
练习5.9
#include <iostream> using namespace std; int main(){ char in; int aCnt = 0, eCnt = 0, iCnt = 0, uCnt = 0, oCnt = 0; while (cin >> in){ if (in == 'a' || in == 'A') ++aCnt; else if (in == 'e' || in == 'E') ++eCnt; else if (in == 'i' || in == 'I') ++iCnt; else if (in == 'o' || in == 'O') ++oCnt; else if (in == 'u' || in == 'U') ++uCnt; } cout << "Number of vowel a: \t" << aCnt << '\n' << "Number of vowel e: \t" << eCnt << '\n' << "Number of vowel i: \t" << iCnt << '\n' << "Number of vowel o: \t" << oCnt << '\n' << "Number of vowel u: \t" << uCnt << endl; return 0; }
练习5.10
#include <iostream> using namespace std; int main(){ char in; int aCnt = 0, eCnt = 0, iCnt = 0, uCnt = 0, oCnt = 0; while (cin >> in) { switch (in) { case 'a': case 'A': ++aCnt; break; case 'e': f310 case 'E': ++eCnt; break; case 'i': case 'I': ++iCnt; break; case 'o': case 'O': ++oCnt; break; case 'u': case 'U': ++uCnt; break; } } cout << "Number of vowel a: \t" << aCnt << '\n' << "Number of vowel e: \t" << eCnt << '\n' << "Number of vowel i: \t" << iCnt << '\n' << "Number of vowel o: \t" << oCnt << '\n' << "Number of vowel u: \t" << uCnt << endl; return 0; }
练习5.11&练习5.12
//合并两个练习 #include <iostream> using namespace std; int main(){ char in; int spaceCnt = 0, tabCnt = 0, nlineCnt = 0, ffCnt = 0, flCnt = 0, fiCnt = 0; char pre = '\0'; // 使用 noskipws 避免忽略空格 while (cin >> noskipws >> in) { switch (in) { case ' ': ++spaceCnt; break; case '\t': ++tabCnt; break; case '\n': ++nlineCnt; break; case 'f': if (pre == 'f') ++ffCnt; break; case 'l': if (pre == 'f') ++flCnt; break; case 'i': if (pre == 'f') ++fiCnt; break; default : break; } pre = in; } cout << "Number of space: " << spaceCnt << '\n' << "Number of tab: " << tabCnt << '\n' << "Number of newline: " << nlineCnt << '\n' << "Number of 'ff': " << ffCnt << '\n' << "Number of 'fl': " << flCnt << '\n' << "Number of 'fi': " << fiCnt << endl; return 0; }
练习 5.13
//(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) ix 在 case 1 处定义且初始化,不合法 unsigned index = some_value(); switch (index) { int ix = get_value(); case 1: ivec[ix] = index; break; default : ix = ivec.size() - 1; ivec[ix] = index; break; } //(c) 每个分支只能对应一个常量 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 10: ++evenCnt; break; } //(d) case 标签必须是整型常量表达式 unsigned ival = 512, jval = 1024, kval = 4096; unsigned bufsize; unsigned swt = get_bufCnt(); switch(swt) { case 512: bufsize = ival * sizeof(int); break; case 1024: bufsize = jval * sizeof(int); break; case 4096: bufsize = kval * sizeof(int); break; }
练习5.14
#include <iostream> #include <string> using namespace std; int main(){ string in,out; string pre; int curCnt = 1,cnt = 1; //curCnt 记录当前计数 cnt 记录最佳的计数 while (cin >> in){ if (in == pre) ++curCnt; else curCnt = 1; if (curCnt > cnt){ cnt = curCnt; out = in; } pre = in; } if (cnt == 1) cout << "No word repeated." << endl; else cout << "The word \"" << out << "\" once occured " << cnt << " times in a row."; return 0; }
练习5.15
//(a) ix 在 for 循环内部声明,所以在后面的 if 语句中是未定义的。 int ix = 0; for ( ; ix != sz; ++ix) { /*...*/ } if (ix != sz) { /*...*/ } //(b) 省略 init-statement 部分是通过用空语句代替来实现的。同时 ix 未被初始化,就要与 sz 比较,不妥。 int ix = 0; for ( ; ix != sz; ++ix) { /*...*/ } //(c) 语句合法,但是这样循环就变成如果一开始 sz 等于0,那么一直条件一直为假,如果一开始 sz 不为0,那么条件一直为真。
练习 5.16
//using for for (int i = 0; i != wat; i++) { /*...*/ } //using while int i = 0; while (i != wat){ //... ++i; }
在多数情况下,两者并没有太多的区别。但在上述的应用中,可以发现,使用 for 有时候可以避免在主函数中声明变量,同时,相比之下 for 语句的可读性也更高。
练习 5.17
#include <iostream> #include <vector> using namespace std; int main(){ vector<int> v1,v2,temp; int in; cout << "Input for v1 (end with -1 ) : " ; while (cin >> in){ if (in == -1) break; v1.push_back(in); } cout << "Input for v2 (end with -1 ) : " ; while (cin >> in){ if (in == -1) break; v2.push_back(in); } if (v1.size() > v2.size()){ temp = v1; v1 = v2; v2 = temp; } decltype(v1.size()) index; for (index = 0; index != v1.size(); ++index) { if (v1[index] != v2[index]) break; } if (index != v1.size()) cout << "false" << endl; else cout << "true" << endl; 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()); //(c) 作为循环的条件的变量也不能定义在 do 的内部 int ival; do { ival = get_response(); } while (ival)
练习5.19
#include <iostream> #include <string> using namespace std; int main(){ string s1,s2; string rsp; do { cout << "Please enter two srings to continue:" << endl; cin >> s1 >> s2; string s; s = s1.size() > s2.size() ? s2 : s1; cout << "\"" << s << "\" is shorter.\nMore? Yes or no?\n"; cin >> rsp; } while (!rsp.empty() && rsp[0] != 'n') ; return 0; }
练习5.20
#include <iostream> #include <string> using namespace std; int main(){ string pre,s; while (cin >> s){ if (s == pre){ cout << s << endl; pre = "\0"; break; } pre = s; } if (!pre.empty()) cout << "Not yet." << endl; return 0; }
练习5.21
#include <iostream> #include <string> using namespace std; int main(){ string pre,s; while (cin >> s){ if (s == pre){ if (!isupper(s[0])) continue; cout << s << endl; pre = "\0"; break; } pre = s; } if (!pre.empty()) cout << "Not yet." << endl; return 0; }
练习5.22
int sz = get_size(); while (sz > 0) sz = get_size();
练习5.23
#include <iostream> using namespace std; int main(){ int num,div; cin >> num >> div; cout << num/div <<endl; return 0; }
练习5.24
#include <iostream> #include <stdexcept> using namespace std; int main(){ int num,div; cin >> num >> div; if (div == 0) throw runtime_error("The divisor can't be 0."); cout << static_cast<double>(num)/div <<endl; return 0; }
会返回这个字符串并且程序停止工作。
练习5.25
#include <iostream> #include <stdexcept> using namespace std; int main(){ int num,div; while (cin >> num >> div){ try { if (div == 0) throw runtime_error("The divisor can't be 0."); cout << static_cast<double>(num)/div <<endl; } catch (runtime_error err) { cout << err.what() << "\nTry again? Enter y or n" << endl; char c; cin >> c; if (!cin || c == 'n') break; } } return 0; }
相关文章推荐
- C++ Primer(第五版)课后习题记录 —— 第七章
- 《C++ Primer》第五版课后习题解答_第五章(2)(09-14)
- 《C++ Primer》第五版课后习题解答_第五章(1)(01-08)
- C++ Primer(第五版)课后习题记录 —— 第四章
- 《C++ Primer》第五版课后习题解答_第五章(4)(20-25)
- C++ Primer(第五版)课后习题记录 —— 第三章
- C++ Primer(第五版)课后习题记录 —— 第八章
- 《C++ Primer》第五版课后习题解答_第五章(3)(15-19)
- 《C++ Primer》第五版课后习题解答_第二章(2)(09-20)
- 《C++ Primer》第五版课后习题解答_第三章(3)(21-29)
- 《C++ Primer》第五版课后习题解答_第六章(4)(27-35)
- 《C++ Primer》第五版课后习题解答_第二章(3)(21-29)
- 《C++ Primer》第五版课后习题解答_第一章(2)(12-25)
- C++ Primer【第五版】习题参考答案——第五章(语句)
- 《C++ Primer》第五版课后习题解答_第二章(4)(30-38)
- 《C++ Primer》第五版课后习题解答_第三章(1)(01-05)
- 《C++ Primer》第五版课后习题解答_第四章(2)(21-33)
- 《C++ Primer》第五版课后习题解答_第一章(1)(01-11)
- 《C++ Primer》第五版课后习题解答_第三章(4)(30-36)
- 《C++ Primer》第五版课后习题解答_第三章(5)(37-45)