C++ PRIMER第五章课后练习

来源:互联网 发布:淘宝客单页模板 编辑:程序博客网 时间:2024/05/09 05:45

5.1

空语句只有一个单独的分号;

当语法上需要一条语句而逻辑上不需要的时候需要用到空语句

5.2

用花括号括起来的区域叫块,语法上需要一条语句,但逻辑上需要不止一条的时候用到块

5.3

vector<int>::size_type cnt=ivec.size(),ix=0;

while(ix!=ivec.size())

{

ivec[ix]=cnt;

++ix;

--cnt;

}

5.4

a)iter没有初始化

b)第2个status无法访问,已在作用域外

5.7

a)第2段结束少分号

b)语法没错误

c)第3段的ival无法访问

d)语法无错误,循环体恒为假, 改为if(ival==0)

5.8

有多个if和多个else分支的时候~~~规定else与离它最近的尚未匹配的if匹配;

5.9

int main()
{
char ch;
int vowelCnt = 0;
while (cin >> ch&&ch != '#')
if (ch == 'a' || ch == 'o' || ch == 'e' || ch == 'u' || ch == 'i')
++vowelCnt;
cout << vowelCnt << endl;
return 0;
}

5.10

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

case ' ':case '\t':case '\n':

++sCnt;break;

5.12

//读取完毕再统计或者用库会更简单点

int main()
{
char  ch;
int ffCnt, flCnt, fiCnt;
ffCnt = flCnt = fiCnt = 0;
while (cin >> ch&&ch != '#')
{
while ('f' == ch)
{
if (!(cin >> ch) || ch == '#')
break;
switch (ch)
{
case 'f':
++ffCnt; break;
case'l':
++flCnt; break;
case'i':
++fiCnt; break;
default:
break;
}
}
if ('#' == ch)
break;
}
cout << "Number of \"ff\":" << ffCnt << endl;
cout << "Number of \"fl\":" << flCnt << endl;
cout << "Number of \"fi\":" << fiCnt << endl;
return 0;
}

5.13

a)少break;

b)case 1里的ix,控制流可能会绕过显示初始化的变量,将int ix放在 swich前面

c)case1:case3:case5....

d)如果swt不等于这3个值,bufsize的值将不确定,加个default给bufsize赋值

5.14

int main()
{
string s,begins,max_count_s;
int count = 0, maxcount=0;
if (cin >> s)
{
count = 1;
begins = s;
while (cin >> s)
{
if (s == begins)
++count;
else 
{
if (count > maxcount)
{
max_count_s =begins;
maxcount = count;
}
count = 1;
begins = s;
}
}
//加这个if以防忽略最后结束输入时连续的单词
if (count > maxcount)
{
max_count_s = begins;
maxcount = count;
}
}
cout << maxcount << "个连续" << max_count_s << endl;
return 0;
}

5.15

a)if里的ix未声明,将 int ix放在for之前

b)ix未初始化,int ix=0;

c)死循环,--sz

5.17

#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 0,0,1,1 };
vector<int> v2{ 0,0,1,1,2,2 };
auto it1 = v1.begin(), it2 = v2.begin();
bool flag = 1;
for (; it1 != v1.end(); ++it1, ++it2)
if (*it1 != *it2)
{
flag = 0;
break;
}
if (flag)
cout << "v1是v2的前缀\n";
else
cout<< "v1不是v2的前缀\n";
return 0;
}

5.18

a)do到while之间需要花括号

b)while里的判断语句=应该改为==

c)应该没什么意义,会死循环吧

5.19

int main()
{
string s1, s2;
do {
cin >> s1 >> s2;
if (s1.size() < s2.size())
cout << s1 << endl;
else if (s1.size() > s2.size())
cout << s2 << endl;
else
cout << "长度相等\n";
} while (cin);
return 0;
}

5.20

#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1, s2;
bool flag = 1;
cin >> s1;
s2 = s1;
while (cin >> s1)
{
if (s2 == s1)
{
flag = 0;
cout << s1 << "连续出现\n";
break;
}
s2 = s1;
}
if (flag)
cout << "没有任何单词是连续出现的\n";
return 0;
}

5.22

int sz=get_size();

while(sz<=0)

sz=get_size();

5.23

int main()
{
int i, j;
double result = 0;
cin >> i >> j;
try {
if (0 == j)
throw range_error("除数不能为0");
result = i / j;
cout << result << endl;
}
catch (range_error& rerr)
{
cout << rerr.what()<<endl;
cout << "j不能为0\n";
}
return 0;
}

5.24

abort() has been called

5.25

int main()
{
int i, j;
double result = 0;
char ch;
while (cin >> i >> j)
{


try {
if (0 == j)
throw range_error("除数不能为0");
result = 1.0*i / j;
cout << i<<"/"<<j<<"="<<result << endl;
cout << "继续输入2个整数:\n";
}
catch (range_error& rerr)
{
cout << rerr.what() << endl;
cout << "j不能为0\n";
cout << "是否重新输入新数(y继续):";
cin.get();
if ((ch = cin.get()) == 'y')
{
cout << "重新输入2个整数:\n";
continue;
}
break;
}
}
return 0;
}