第6章 语句
【41】6.10下面每段代码都暴露了一个常见的编程错误,请指出并修改之。
a)switch(ival){
case‘a’:aCnt++;
case’e’:eCnt++;
default:iouCnt++;
}
错误在于,各个case标号对应的语句块中缺少必要的break语句,从而当ival值为’a’时,aCnt、eCnt和iouCnt都会加1;ival值为’e’时,eCnt和iouCnt都会加1;
b)switch(ival){
case1:
intix=get_value();
ivec[ix]=ival;
break;
default:
ix=ivec.size()-1;
ivec[ix]=ival;
}
错误在于,在case 1标号之后,default标号之前定义了变量ix。因为,对于switch结构,只能在它的最后一个case标号或default标号后面定义变量,以避免出现代码跳过变量的定义和初始化的情况。
c)switch(ival){
case1,3,5,7,9:
oddcnt++;
break;
case2,4,6,8,10
eventcnt++;
break;
}
错误在于,case标号中出现了多个值。因为一个case标号只能与一个值相关联。
d)intival=512, jval=1024, kval=4096;
int bufsize;
switch(swt){
caseival:
bufsize=ival*sizeof(int);
break;
casejval:
bufsize=jval*sizeof(int);
break;
casekval:
bufsize=kval*sizeof(int);
break;
}
错误在于,case标号中不能使用ival、jval和kval。因为case标号中的值只能使用常量表达式,而ival、jval和kval都是变量。
【42】6.11解释下面的循环,更正你发现的问题
a)stringbufString,word;
while(cin>>bufString>>word){…}
每次读入两个string对象,直到遇到文件结束符;
b)while(vector<int>::iteratoriter!=ivec.end())
{…}
依次处理vector中的每个元素。此循环有错误,iter没有赋初值。
c)while(ptr=0)
ptr=find_a_value();
调用find_a_value函数,讲返回值赋给ptr,直到ptr为0.此循环有错误,条件表达式中应使用比较操作符,而不是赋值操作符。
d)while(boolstatus=find(word))
{word=get_next_word();}
if(!status)
cout<<Didnot find any words\n”;
每次调用get_next_word()获取一个word,然后调用find函数查找该word,直到找不到word为止。此循环有误,word没有赋初值。
【43】6.12编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足以下条件的单词的输入位置:该单词的后面紧跟着再次出现自己本身。跟踪重复次数最多的单词及其重复次数。输出重复次数的最大值,若没有单词重复则输出说明信息,例如输入是:hownow now now brown cow cow 则输出应表明”now”这个单词出现了三次
答:#include <iostream>
#include<string>
usingnamespace std;
intmain()
{
stringpreWord,currWord;
stringrepWord;
intcurrCnt=0,maxCnt=1;
cout<<”Entersome words(Ctrl+z to end):”<<endl;
while(cin>>currWord){
if(currWord==preWord) ++currCnt;
else{
if(currCnt>maxCnt){
maxCnt=currCnt;
repWord=preWord;
}
currCnt=1;
}
preWord=currWord;
}
if(maxCnt!=1)
cout<<””<<repWord<<””
<<”repeatedfor”<<maxCnt
<<”times”<<endl;
else
cout<<”Thereis no repeated word.”<<endl;
return0;
}
【44】6.13详细解释下面语句是如何执行的
*dest++= *source++;
答:执行过程如下,(1)指针dest加1; (2)指针source加1; (3)讲source原来指向的对象赋给dest原来指向的对象。