您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: