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