C++Primer

    技术2024-06-19  80

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

    前面章节的习题答案

    第一章

    第二章

    第三章

    第四章

    文章目录

    前面章节的习题答案 5.15.25.35.4(a)(b) 5.55.65.7(a)(b)(c)(d) 5.85.95.105.115.125.13(a)(b)(c)(d) 5.145.15(a)(b)(c) 5.165.175.18(a)(b)(c) 5.195.205.215.225.235.245.25导图

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

    导图

    Processed: 0.014, SQL: 9