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;
}

導圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章