本文答案,部分參考於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;
}