C++Primer_课后习题第五章

本文答案,部分参考于C++ Primer 习题集

前面章节的习题答案

第一章

第二章

第三章

第四章

5.1

​ 空语句是最简单的语句,空语句由一个单独的分号构成.如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句,空语句什么也不做

​ 一种常用的情况是,当循环的全部工作在条件部分就可以完成时,我们通常会用到空语句.使用空语句时最好加上注释,从而令代码的阅读者知道这条语句是有意省略内容的.

5.2

​ 块是指用花括号括起来的语句和声明的序列,也称为复合语句.一个块就是一个作用域,在块中引入的名字只能在快内部以及嵌套在块中的子块里访问,如果在程序的某个地方,语法上需要一条语句,但是逻辑上需要多条语句,此时应该使用块,快不需要以分号结束.

5.3

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	int sum=0,val=1;
	while(val<=10)
		sum+=val,++val;
	cout<<"Sum of 1 to 10 inclusive is "<<sum<<endl;
	return 0;
}

这样也可以,但是可读性大大降低.

5.4

(a)

错误的, iter 需要先赋值,在使用.

正确写法如下:

	string::iterator iter=s.begin();
	while(iter!=s.end()){
		++iter;
	}

(b)

错误的status 只能在定义的while循环内使用:

正确写法如下:

	bool status;
	while(status=find(word)){

	}
	if(!status){}

5.5

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	const vector<string> grade{"A++","A","B","C","D","F"};
	int Grade=0;
	cin>>Grade;
	if(Grade==100)
		cout<<grade[0];
	else if(Grade>60)
		cout<<grade[10-Grade/10];
	else 
		cout<<grade[5];
	return 0;
}

5.6

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	const vector<string> grade{"A++","A","B","C","D","F"};
	int Grade=0;
	cin>>Grade;
	Grade == 100?cout<<grade[0]:Grade>60?cout<<grade[10-Grade/10]:cout<<grade[5];
	
	// if(Grade==100)
	// 	cout<<grade[0];
	// else if(Grade>60)
	// 	cout<<grade[10-Grade/10];
	// else 
	// 	cout<<grade[5];
	return 0;
}

5.7

(a)

在ival1= ival2 后面要加 ; 号

ival1=ival2;

(b)

按照语义,应该加个花括号

if(ival<minval){
	minval=ival;
	occurs=1;
}

©

ival的定义域有问题,而且第一个if的作用就是赋值,不是判断了,

我认为还是要改一下的

	int ival=0;
	if(ival==get_value())
		cout<<"ival="<<ival<<endl;
	if(!ival)
		cout<<"ival=0\n";

(d)

这里用了赋值运算符,改一下

	if(ival==0){
		ival=get_value();
	}

5.8

悬垂else是指当程序中的if 分支多余else分支时,如何为else寻找与之匹配的if 分支的问题

C++规定,else与离他最近的尚未匹配的if 匹配,从而消除了二义性.

5.9

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	string a;
	cin>>a;
	int cntA=0,cntE=0,cntI=0,cntO=0,cntU=0,cntOther=0;
	for(auto t:a){
		if(t=='A')	++cntA;
		else if(t=='E')	++cntE;
		else if(t=='I')	++cntI;
		else if(t=='O')	++cntO;
		else if(t=='U')	++cntU;
		else ++cntOther;
	}
	cout<<cntA<<endl;
	cout<<cntE<<endl;
	cout<<cntI<<endl;
	cout<<cntO<<endl;
	cout<<cntU<<endl;
	cout<<cntOther<<endl;
	return 0;
}

5.10

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	string a;
	cin>>a;
	int cntA=0,cntE=0,cntI=0,cntO=0,cntU=0,cntOther=0;
	for(auto t:a){
		if(t=='A'||t=='a')	++cntA;
		else if(t=='E'||t=='e')	++cntE;
		else if(t=='I'||t=='i')	++cntI;
		else if(t=='O'||t=='o')	++cntO;
		else if(t=='U'||t=='u')	++cntU;
		else ++cntOther;
	}
	cout<<cntA<<endl;
	cout<<cntE<<endl;
	cout<<cntI<<endl;
	cout<<cntO<<endl;
	cout<<cntU<<endl;
	cout<<cntOther<<endl;
	return 0;
}

5.11

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	int cntA=0,cntE=0,cntI=0,cntO=0,cntU=0,cntOther=0,cntSpace=0,cntLine=0,cntTable=0;
	char t;
	while(cin.get(t)){
		if(t=='A'||t=='a')	++cntA;
		else if(t=='E'||t=='e')	++cntE;
		else if(t=='I'||t=='i')	++cntI;
		else if(t=='O'||t=='o')	++cntO;
		else if(t=='U'||t=='u')	++cntU;
		else if(t=='\t')	++cntTable;
		else if(t=='\n')	++cntLine;
		else if(t==' ')	++cntSpace;
		else ++cntOther;
	}
	cout<<cntA<<endl;
	cout<<cntE<<endl;
	cout<<cntI<<endl;
	cout<<cntO<<endl;
	cout<<cntU<<endl;
	cout<<cntTable<<endl;
	cout<<cntSpace<<endl;
	cout<<cntLine<<endl;
	cout<<cntOther<<endl;
	return 0;
}

5.12

#include<iostream>
#include<vector>
#include<cctype>
#include<string>
using namespace std;

int main(void) {
	int cntA = 0, cntE = 0, cntI = 0, cntO = 0, cntU = 0, cntOther = 0, cntSpace = 0, cntLine = 0, cntTable = 0;
	int cntff = 0, cntfl = 0, cntfi = 0;
	char t;
	int flag = 0;
	//cin.get是可以读取缓冲区里的内容的.

	while (cin.get(t)) {
		if (t == 'A' || t == 'a')	++cntA;
		else if (flag == 1) {
			if (t == 'f')	++cntff;
			else if (t == 'l')	++cntfl;
			else if (t == 'i')	++cntfi;
			else cntOther += 2;
			flag = 0;
		}
		else if (t == 'E' || t == 'e')	++cntE;
		else if (t == 'I' || t == 'i')	++cntI;
		else if (t == 'O' || t == 'o')	++cntO;
		else if (t == 'U' || t == 'u')	++cntU;
		else if (t == '\t')	++cntTable;
		else if (t == '\n')	++cntLine;
		else if (t == 'f') {
			flag = 1;
		}
		else if (t == ' ')	++cntSpace;
		else ++cntOther;
	}

	cout << cntA << endl;
	cout << cntE << endl;
	cout << cntI << endl;
	cout << cntO << endl;
	cout << cntU << endl;
	cout << cntTable << endl;
	cout << cntSpace << endl;
	cout << cntLine << endl;
	cout << cntOther << endl;
	cout << cntff << endl;
	cout << cntfl << endl;
	cout << cntfi << 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语句里面,而且在不同的case里面还在使用ix,

我们需要把ix的定义放在switch语句之前.

unsigned index=some_value();
	int ix=get_value();
	switch(index){
		case 1:
			ivec[ix]=index;
			break;
		default:
			ix=ivec.size()-1;
			ivec[ix]=index;
	}

©

C++规定,一个case里面,只能放一个值.

	unsigned evenCnt=0,oddCnt=0;
	int digit=get_num()%10;
	swich(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(void) {
	string currString,preString="",maxString;
	int currCnt=1,maxCnt=0;
	while(cin>>currString){
		if(currString==preString){
			++currCnt;
			if(currCnt>maxCnt){
				maxCnt=currCnt;
				maxString=currString;
			}
		}
		else{
			currCnt=1;
		}
		preString=currString;
	}
	if(maxCnt>1)
		cout<<"出现最多的字符串是:"<<maxString<<",次数是"<<maxCnt<<endl;
	else
		cout<<"每个字符串都只出现一次"<<endl;
	return 0;
}

5.15

(a)

这题错误的地方在于, ix定义在for循环里面.但是却在for循环以外的地方使用的

改正后如下:

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

(b)

ix没有初始指,for循环会报错

而且for语句在结构上,少一个分号

改正后如下:

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

©

ix和sz都以相同的速率发生着变化,如果ix和sz一开始不相等的话,程序会陷入死循环.

改正如下:

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

5.16

推荐用for,for的结构清晰,容易理解.不易出错.

5.17

代码如下:

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

int main(void) {
	vector<int> LeftArr{1,2,3,4};
	vector<int>	LongArr{1,2,3,4,5};
	int flag=1;
	for(int i=0;i<LeftArr.size();i++){
		if(LongArr[i]!=LeftArr[i]){
			cout<<"不匹配";
			flag=0;
			break;
		}
	}
	if(flag==1)	cout<<"匹配";
	return 0;
}

5.18

(a)

含义就是每次循环读入两个整数并输出它们的和

没有do 和while 之间没有花括号

改正后如下:

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

int main(void) {
	do{
		int v1,v2;
		cout<<"Please enter two numbers to sum:";
		if(cin>>v1>>v2)
			cout<<"Sum is:"<<v1+v2<<endl;
	}while(cin);
	return 0;
}

(b)

当get_response的返回值不为0的时,执行循环体,而且do和while不允许在循环条件内定义变量.

改正后如下:

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

©

当get_response的返回指不为0时,执行循环体,因为出现在do-while语句条件部分的变量必须定义在循环体外

改正后如下:

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

5.19

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

int main(void) {
	string a,b;
	do{
		cin>>a>>b;
		if(a.length()<b.length())
			cout<<a;
		else
			cout<<b;
	}while(cin);
	return 0;
}

5.20

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

int main(void) {
	string currString,preString="";
	int flag=0;
	do{
		cin>>currString;
		if(currString==preString){
			cout<<currString;
			flag=1;
			break;
		}
		preString=currString;
	}while(cin);
	if(flag==0)	cout<<"没有任何单词是连续重复出现的"
	return 0;
}

5.21

#include<iostream>
#include<string>
#include<vector>
#include<cctype>
using namespace std;

int main(void) {
	string currString,preString="";
	int flag=0;
	do{
		cin>>currString;
		if(currString==preString&&isupper(currString[0])){
			cout<<currString;
			flag=1;
			break;
		}
		preString=currString;
	}while(cin);
	if(flag==0)	cout<<"没有任何单词是连续重复出现的";
	return 0;
}

5.22

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

5.23

#include<iostream>
#include<string>
#include<vector>
#include<cctype>
using namespace std;

int main(void) {
	int intergerOne=0,intergerTwo=0;
	cin>>intergerOne>>intergerTwo;
	cout<<intergerOne/intergerTwo<<endl;
	return 0;
}

5.24

1 0                    请按任意键继续. . .    

这个是我电脑上的反应.

卡了一下,然后也没有输出,编译器自己有处理这种异常

5.25

#include<iostream>
#include<string>
#include<vector>
#include<cctype>
#include<stdexcept>
using namespace std;

int main(void) {
	int ival1=0,ival2=0;
	while(cin>>ival1>>ival2){
		try{
			if(ival2==0)	throw runtime_error("除数不能为0");
			cout<<"两数相除的结果是:"<<ival1/ival2<<endl;
		}
		catch(runtime_error err){
			cout<<err.what()<<endl;
			char ch;
			cin>>ch;
			if(ch!='y'&&ch!='Y')
				break;
		}
	}
	return 0;
}

导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值