c++primer第五章习题答案

学习目标:

语句

学习内容:

1.简单语句
2.语句作用域
3.条件语句
4.迭代语句
5.跳转语句
6.try语句块和异常处理

习题答案:

5.1
一个分号构成的语句,语法上需要一条语句逻辑上不需要,一种常见的情况是,当循环的全部工作在条件部分就可以完成时。

5.2
用花括号括起来的语句和声明序列,语法上需要一条语句逻辑上需要多条语句。

5.3

#include <iostream>

int main()
{
	int sum = 0, val = 1;
	while (val <= 10)
		sum += val, ++val;
	std::cout << sum << " ";
}

更不易于阅读

5.4

std::string::iterator iter = s.begin()
while (iter != s.end()) {/*...*/}

bool status;
while (status = find(word)) {/*...*/}
if (!status) {/*...*/}

5.5

#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;

int main()
{
	vector<string> vs = { "F","D","C","B","A","A++" };
	int cre = 0;
	while (std::cin >> cre) {
		string let;
		if (cre < 60)
			let = vs[0];
		else {
			let = vs[(cre - 50) / 10];
			if (cre != 100) {
				if (cre % 10 > 7)
					let += '+';
				else if (cre % 10 < 3)
					let += '-';
			}
		}
		std::cout << let;
	}
	return 0;
}

5.6

#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;

int main()
{
	vector<string> vs = { "F","D","C","B","A","A++" };
	int cre{ 0 };
	while (cin >> cre) {
		string let = cre < 60 ? let[0] : let[(cre - 50) / 10];
		let +=
			(cre == 100 || cre < 60)
			? ""
			: (cre % 10 > 7) ? "+" : (cre % 10 < 3) ? "-" : "";
		std::cout << let;
	}
	return 0;
}

5.7

(1)
if (ival1 != ival2)
    ival1 = ival2;
    else ival1 = ival2 = 0;
(2)
if (ival < minval){
     minval = ival;
     occurs = 1;
     }
(3)
int ival;
if (ival = get_ivalue())
    cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0\n";
(4)
if (ival == 0)
    ival = get_value();

5.8
当一个if语句嵌套在另一个if语句内部时,很可能if分支会多于else分支,这时候我们我们怎么知道某个给定的else是和哪个if匹配呢。这个问题通常称作悬垂else。
就C++而言,它规定else与它最近的尚未匹配的if匹配,从而消除了程序的二义性。

5.9

#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;


int main()
{
	unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0;
	char ca;
	while (cin >> ca)
	{
		if (ca == 'a')
			++aCnt;
		else if (ca == 'e')
			++aCnt;
		else if (ca == 'i')
			++iCnt;
		else if (ca == 'o')
			++oCnt;
	}
	std::cout << "aCnt:\t" << aCnt << '\n'
		<< "eCnt:\t" << eCnt << '\n'
		<< "iCnt:\t" << iCnt << '\n'
		<< "oCnt:\t" << oCnt << '\n';
}

5.10

#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;


int main()
{
	unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0;
	char ca;
	while (cin >> ca) {
		switch (ca) {
		case 'a':
		case 'A':
			++aCnt;
			break;
		case 'e':
		case 'E':
			++eCnt;
			break;
		case 'i':
		case 'I':
			++iCnt;
			break;
		case 'o':
		case 'O':
			++oCnt;
			break;
		}
	}
	std::cout << "aCnt:\t" << aCnt << '\n'
		<< "eCnt:\t" << eCnt << '\n'
		<< "iCnt:\t" << iCnt << '\n'
		<< "oCnt:\t" << oCnt << '\n';
}

5.11

#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;


int main()
{
	unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, lineCnt = 0, tabCnt = 0;
	char ca;
	while (cin >> std::noskipws >> ca){
		switch (ca) {
		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 '\v':
		case '\t':
			++tabCnt;
			break;
		case '\n':
			++lineCnt;
			break;
		}
	}
	std::cout << "aCnt:\t" << aCnt << '\n'
		<< "eCnt:\t" << eCnt << '\n'
		<< "iCnt:\t" << iCnt << '\n'
		<< "oCnt:\t" << oCnt << '\n'
	    << "tabCnt:\t" << tabCnt << '\n'
	    << "lineCnt:\t" << lineCnt << '\n';

}

5.12

#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;


int main()
{
	unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, lineCnt = 0, tabCnt = 0,
		ffCnt = 0, flCnt = 0, fiCnt = 0;
	char ca;
	char praca;
	while (cin >> std::noskipws >> ca){
		switch (ca) {
		case 'a':
		case 'A':
			++aCnt;
			break;
		case 'e':
		case 'E':
			++eCnt;
			break;
		case 'i':
		case 'I':
			++iCnt;
			if (praca == 'f') ++fiCnt;
			break;
		case 'o':
		case 'O':
			++oCnt;
			break;
		case '\v':
		case '\t':
			++tabCnt;
			break;
		case '\n':
			++lineCnt;
			break;
		case 'f':
			if (praca == 'f') ++ffCnt;
			break;
		case 'l':
			if (praca == 'f') ++flCnt;
			break;
		}
		praca = ca;
	}
	std::cout << "aCnt:\t" << aCnt << '\n'
		<< "eCnt:\t" << eCnt << '\n'
		<< "iCnt:\t" << iCnt << '\n'
		<< "oCnt:\t" << oCnt << '\n'
		<< "tabCnt:\t" << tabCnt << '\n'
		<< "lineCnt:\t" << lineCnt << '\n'
		<< "ffCnt:\t" << ffCnt << '\n'
		<< "flCnt:\t" << flCnt << '\n'
		<< "fiCnt:\t" << fiCnt << '\n';

}

5.13
(1)加上break
(2)case 1可能被忽略,defualt又用到了ix,所以把ix定义在switch case之外。
(3)Switch case不合法
(4)case标签不是一个常量

5.14
呜呜呜

5.15
(1)for循环头定义的对象只有在循环体内部可见

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

(2)如果初始换部分是空的也应该填入一个分号

int ix
for (/*空语句*/; ix != sz; ++ix){ /*...*/}

(3)
sz初始值是0,循环一次都不执行。sz不是0,如果循环体不终止循环就会一直执行下去

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

5.16

int ix;
while (cin >> ix)

for (int ix; cin >> ix;)

正如所说各有优劣

5.17
暂缓

5.18
(a)添加花括号

do 
{
int v1, v2;
cout << "Please enter two numbrrs to sum:";
if (cin >> v1 >> v2)
cout << "sum is: " << v1 + v2 << endl;
}
while (cin);

(b)变量定义要在循环体外

int ival;
	do {
		ival = get_response());
	} while (ival);

(c)变量定义要在循环体外

int ival;
	do {
		ival = get_response());
	} while (ival);

5.19

#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::cin;
using std::endl;

int main()
{
	string s1, s2;
	do {
		cin >> s1 >> s2;
		s1.size() > s2.size() ? cout << s2 : cout << s1;
	} while (cin);
	return 0;
}

5.20

#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::cin;
using std::endl;

int main()
{
	string s1, s2, s3;
	while (cin >> s1)
	{
		if (s1 == s2)
		{
			s3 = s1;
			cout << s3 << endl;
			break;
		}
		s2 = s1;
		if (s3.empty())
		{
			cout << "no" << endl;
		}
	}
	
	return 0;
}

5.21

string s1, s2, s3;
	while (cin >> s1)
	{
	    if (!supper(s1[0])) continue;
		if (s1 == s2)
		{
			s3 = s1;
			cout << s3 << endl;
			break;
		}
		s2 = s1;
		if (s3.empty())
		{
			cout << "no" << endl;
		}
	}```

5.22

```css
#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::cin;
using std::endl;

int main()
{
	int sz;
	do {
		sz = get_size();
	} while (sz <= 0);
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值