C++ Primer 第3章 标准库类型习题+答案
2011-09-25 16:43
344 查看
第3章 标准库类型习题
习题3.1 有适当的Using声明,而不用std::前缀,访问标准库中名字的方法,重新编写2.3节的程序,计算一给定数的给定次幂的结果。
代码如下:
习题3.2 什么是默认构造函数?
答:调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor),当程序没有定义构造函数,系统会自动调用默认构造函数,一个系统提供的默认构造函数,它的函数体是空的,不起初始化作用。
习题3.3 列举出三种初始化String对象的方法。
答:1.String s1;-默认构造函数,s1为空串。
2.String s2(s1);将s2初始化为s1的一个副本。
3.string s3("valut"); 将s3初始化为一个字符串字面值副本。
习题3.4 s和s2的值分别是什么?
string s;
int mian(){
string s2;
}
答:s和s2的均为空字符串。
习题3.5 编写程序实现从标准输入每次读入一行文本。然后改写程序,每次读人一个单词。
代码如下:
习题3.6 解释string类型的输入操作符和getline函数分别如何处理空白字符。
答:string类型的输入操作符对空白字符的处理:读取并忽略开头所有的空白字符,直到再次遇到空白字符,读取终止。
getline函数对空白字符的处理:不忽略行开头的换行符,读取字符知道遇到换行符,读取终止并丢弃换行符。
习题3.7 编写一个程序读入两个string对象,测试它们是否相等。若不相等指出哪个大。接着改写程序测试它们的长度是否相等,若不相等指出哪个较长。
代码如下:
习题3.8 编一个程序,从标准输入读取多个string对象,把它们连接起来存放到一个更大的string对象中。并输出连接后的string对象。
代码如下:
习题3.9 下列程序实现什么功能?实现合法吗?如果不合法,说明理由。
string s;
cout<<s[0]<<endl;
答:不合法。s是一个空字符串,其长度为0,因此s[0]是无效的。
习题3.10 编一个程序,从string对象中去掉标点符号。要求输入到程序的字符串必须含有标点符号,输出结果则是去掉标点符号的string对象。
习题3.13 读一组整数到vector对象,计算并输出每对相邻元素的和如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。然后修改程序:头尾元素两两配对,计算每对元素的和,并输出。
代码如下:
习题3.14
读入一段文本到vector对象,每个单词储存为vector中的一个元素。把vector对象中每个单词转化为大写字母。输出vector对象中转化后的元素,每八个单词为一行输出。
习题 3.15 下面程序合法吗?如果不合法,如何更正?
vecter<int> ivec;
ivec[0]=42;
解:不合法,因为ivec是空的vector对象,其中不含任何元素,而下标操作只能用于获取已存在的元素。更正:将赋值语句改为语句ivec.push_back(42).
习题 3.16 列出三种定义vector对象的方法,给定10个元素,每个元素值为42。指出是否还有更好的实现方法,并说明为什么。
方法1:vector<int> ivec(10,42);
方法2:vector<int> ivec(10);
for (ix=0;ix<10;++ix)
ivec[ix]=42;
方法3:vector<int>ivec(10);
for (vector<int>:: iteratoriter=iver.begin();iter!=ivec.end();++iter)
*iter=42;
方法4:vecctor<int> ivec;
for(cnt =1;cnt<=10;++cnt)
ivec.push_back(42);
方法5:vector<int> ivec;
vector<int>::iterator iter=ivec.end();
for(int i=0;i!=10;++i)
{
ivec.insert(iter,42);
iter=ivec.end();
}
习题 3.17 重做3.2节的习题 用迭代器来访问vector中的元素。
代码如下:
习题 3.18~3.19 编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的2倍,输出vector的所有元素。
代码如下:
习题 3.20 解释一下在上几个习题的程序实现中你用了哪种迭代器,并说明原因。
解:用了vector<int>::iterator和vector<string>::iterator的迭代器,通过这些迭代器的访问的元素类型,分别为int和string的vector对象元素。
习题 3.21 何时使用const迭代器的?又在何时使用const_iterator?解析两者的区别。
解:const迭代器是迭代器常量,该迭代器的值本身不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能使它指向任何其他元素。若需要指定固定元素的迭代器,可以使用const迭代器。
const_iterator是一种迭代器类型,对这种迭代器类型进行解引用,则可以得到一个指向const对象的引用。即通过这种迭代器访问到的对象是常量,该对象不能修改,因此,const_iterator迭代器只能读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素无需修改它们,则可以使用const_iterator迭代器。
习题3.1 有适当的Using声明,而不用std::前缀,访问标准库中名字的方法,重新编写2.3节的程序,计算一给定数的给定次幂的结果。
代码如下:
//程序清单 #include<iostream> using std::cin; using std::cout; using std::endl; int main() { int base,exponent; long result=1; cout<<"Enter base and exponent:"; cin>>base>>exponent; if(exponent<0) { cout<<"exponent can't small than 0"<<endl;return -1;} if(exponent>0) { for(int cnt=1;cnt<=exponent;cnt++) result*=base;} cout<<base<<" raised to the power of " <<exponent<<":"<<result<<endl; system("pause"); return 0;}
习题3.2 什么是默认构造函数?
答:调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor),当程序没有定义构造函数,系统会自动调用默认构造函数,一个系统提供的默认构造函数,它的函数体是空的,不起初始化作用。
习题3.3 列举出三种初始化String对象的方法。
答:1.String s1;-默认构造函数,s1为空串。
2.String s2(s1);将s2初始化为s1的一个副本。
3.string s3("valut"); 将s3初始化为一个字符串字面值副本。
习题3.4 s和s2的值分别是什么?
string s;
int mian(){
string s2;
}
答:s和s2的均为空字符串。
习题3.5 编写程序实现从标准输入每次读入一行文本。然后改写程序,每次读人一个单词。
代码如下:
//程序清单1 #include<iostream> #include<string> using namespace std; int main() { string line; while(getline(cin,line)) cout<<line<<endl; return 0; } //程序清单2 #include<string> using namespace std; int main() { string word; while(cin>>word) cout<<word<<endl; return 0; }
习题3.6 解释string类型的输入操作符和getline函数分别如何处理空白字符。
答:string类型的输入操作符对空白字符的处理:读取并忽略开头所有的空白字符,直到再次遇到空白字符,读取终止。
getline函数对空白字符的处理:不忽略行开头的换行符,读取字符知道遇到换行符,读取终止并丢弃换行符。
习题3.7 编写一个程序读入两个string对象,测试它们是否相等。若不相等指出哪个大。接着改写程序测试它们的长度是否相等,若不相等指出哪个较长。
代码如下:
//程序清单 #include<iostream> #include<string> using namespace std; int main() { string s1,s2; cout<<"Enter two string :"<<endl; cin>>s1>>s2; if(s1==s2) cout<<"它们相等"<<endl; else if(s1>s2) cout<<"\""<<s1<<"\"is bigger than " <<"\""<<s2<<"\""<<endl; else cout<<"\""<<s2<<"\"is bigger than" <<"\""<<s1<<"\""<<endl; system("pause"); return 0; } #include<iostream> #include<string> using namespace std; int main() { string s1,s2; cout<<"Enter two string :"<<endl; cin>>s1>>s2; string::size_type len1,len2; len1=s1.size(); len2=s2.size(); if(len1==len2) cout<<"They have sane length!"<<endl; else if(len1>len2) cout<<"The length of "<<"\""<<s1 <<"\"is logger than \""<<s2<<"\""<<endl; else cout<<cout<<"The length of "<<"\""<<s2 <<"\"is logger than \""<<s1<<"\""<<endl; system("pause"); return 0;; }
习题3.8 编一个程序,从标准输入读取多个string对象,把它们连接起来存放到一个更大的string对象中。并输出连接后的string对象。
代码如下:
//程序清单 #include<iostream> #include<string> using namespace std; int main() { string result_str,str; cout<<"Enter strings(ctrl+z to end):"<<endl; cin>>result_str; while(cin>>str) result_str=result_str+str; cout<<"连接后的string对象:"<<endl <<result_str<<endl; system("pause"); return 0; }
习题3.9 下列程序实现什么功能?实现合法吗?如果不合法,说明理由。
string s;
cout<<s[0]<<endl;
答:不合法。s是一个空字符串,其长度为0,因此s[0]是无效的。
习题3.10 编一个程序,从string对象中去掉标点符号。要求输入到程序的字符串必须含有标点符号,输出结果则是去掉标点符号的string对象。
//程序清单 #include<iostream> #include<string> #include<cctype> using namespace std; int main() { string s,result_str; bool has_punct=false; char ch; cout<<"Enter a string :"<<endl; getline(cin,s); for(string::size_type index=0;index!=s.size();++index) { ch=s[index]; if(ispunct(ch)) has_punct=true; else result_str+=ch; } if(has_punct) cout<<"Result:"<<endl<<result_str<<endl; else{ cout<<"No punctuation character in the string?!"<<endl; return -1;} system("pause"); return 0; }
习题3.13 读一组整数到vector对象,计算并输出每对相邻元素的和如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。然后修改程序:头尾元素两两配对,计算每对元素的和,并输出。
代码如下:
#include<iostream> #include<vector> using namespace std; int main() { vector<int>ivec; intival; //读数据到vector对象 cout<<"输入数据 (按ctrl+z结束):"<<endl; while(cin>>ival) ivec.push_back(ival); //计算相邻元素并输出 if(ivec.size()==0) { cout<<"没有数据!"<<endl; return-1; } cout<<"在vector对象中相邻的每对元素之和:"<<endl; for(vector<int>::size_typeix=0;ix<ivec.size()-1;ix=ix+2) { cout<<ivec[ix]+ivec[ix+1]<<"\t"; if((ix+1)%6==0)//每行输出六个和 cout<<endl; } if(ivec.size()%2!=0)//提示输出最后个元素没有求和 cout<<endl; cout<<"最后一个元素没有求和!"; cout<<"它的值是: "<<ivec[ivec.size()-1]<<endl; system("pause"); return0; } //第二问 #include<iostream> #include<vector> using namespace std; int main() { vector<int>ivec; intival; cout<<"Enternumbers:"<<endl; while(cin>>ival) ivec.push_back(ival); //计算首尾元素并输出 if(ivec.size()==0) { cout<<"没有数据! "<<endl; return -1; } cout<<"计算vector对象中首尾元素之和 "<<endl; vector<int>::size_typecnt=0; vector<int>::size_typefirst,last; for(vector<int>::size_typefirst=0,last=ivec.size()-1; first<last;++first,--last) { cout<<ivec[first]+ivec[last]<<"\t"; ++cnt; if(cnt%6==0) cout<<endl; } /*if(first==last)//提示居中元素没有求和 cout<<endl; cout<<"居中元素没有求和"; cout<<"它的值是:"<<ivec[first]<<endl; */ system("pause"); return0; }
习题3.14
读入一段文本到vector对象,每个单词储存为vector中的一个元素。把vector对象中每个单词转化为大写字母。输出vector对象中转化后的元素,每八个单词为一行输出。
#include<iostream> #include<vector> #include<string> #include<cctype> using namespace std; int main() { vector<string> svec; string str; //读入文本到vector对象中 cout<<" Enter text(Enter ctrl+z to end):"<<endl; while(cin>>str) svec.push_back(str); //将vector对象中小写字母转化为大写字母,并输出 if(svec.size()==0) { cout<< "No string !"<<endl; return -1; } cout<< "Transformed element fromvector :"<<endl; for(vector<string>::size_type ix=0;ix!=svec.size();++ix) { for( string::size_type index=0; index!= svec[ix].size(); ++index) if (islower(svec[ix][index])) { svec[ix][index]=toupper(svec[ix][index]); cout<<svec[ix]<< " "; if((ix+1)%8==0) cout<<endl; } } system("pause"); return 0; }
习题 3.15 下面程序合法吗?如果不合法,如何更正?
vecter<int> ivec;
ivec[0]=42;
解:不合法,因为ivec是空的vector对象,其中不含任何元素,而下标操作只能用于获取已存在的元素。更正:将赋值语句改为语句ivec.push_back(42).
习题 3.16 列出三种定义vector对象的方法,给定10个元素,每个元素值为42。指出是否还有更好的实现方法,并说明为什么。
方法1:vector<int> ivec(10,42);
方法2:vector<int> ivec(10);
for (ix=0;ix<10;++ix)
ivec[ix]=42;
方法3:vector<int>ivec(10);
for (vector<int>:: iteratoriter=iver.begin();iter!=ivec.end();++iter)
*iter=42;
方法4:vecctor<int> ivec;
for(cnt =1;cnt<=10;++cnt)
ivec.push_back(42);
方法5:vector<int> ivec;
vector<int>::iterator iter=ivec.end();
for(int i=0;i!=10;++i)
{
ivec.insert(iter,42);
iter=ivec.end();
}
习题 3.17 重做3.2节的习题 用迭代器来访问vector中的元素。
代码如下:
#include<iostream> #include<vector> using namespace std; int main() { vector<int>ivec; intival; //读数据到vector对象 cout<<"输入数据 (按ctrl+z结束):"<<endl; while(cin>>ival) ivec.push_back(ival); //计算相邻元素并输出 if(ivec.size()==0) { cout<<"没有数据!"<<endl; return-1; } cout<<"在vector对象中相邻的每对元素之和:"<<endl; vector<int>::size_type cnt=0; for (vector<int>::iterator=ivec.begin();iter<ivec.end()-1;iter=iter+2) { cout<<*iter+*(iter+1)<< “\t”; ++cnt; if( cnt%6==0) cout<<endl; } if(ivec.size()%2!=0)//提示输出最后个元素没有求和 cout<<endl; cout<<"最后一个元素没有求和!"; cout<<"它的值是: "<<*( ivec.end()-1)<<endl; system("pause"); return0; }
习题 3.18~3.19 编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的2倍,输出vector的所有元素。
代码如下:
#include<iostream> #include<vector> using namespace std; int main() { vector<int>ivec(10,20); for(vector<int>::iteratoriter=ivec.begin();iter!=ivec.end();++iter) { *iter=(*iter)*2; cout<<*iter<<""<<endl; } system("pause"); return0; }
习题 3.20 解释一下在上几个习题的程序实现中你用了哪种迭代器,并说明原因。
解:用了vector<int>::iterator和vector<string>::iterator的迭代器,通过这些迭代器的访问的元素类型,分别为int和string的vector对象元素。
习题 3.21 何时使用const迭代器的?又在何时使用const_iterator?解析两者的区别。
解:const迭代器是迭代器常量,该迭代器的值本身不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能使它指向任何其他元素。若需要指定固定元素的迭代器,可以使用const迭代器。
const_iterator是一种迭代器类型,对这种迭代器类型进行解引用,则可以得到一个指向const对象的引用。即通过这种迭代器访问到的对象是常量,该对象不能修改,因此,const_iterator迭代器只能读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素无需修改它们,则可以使用const_iterator迭代器。
相关文章推荐
- C++ Primer 第3章 标准库类型习题+答案
- C++ Primer 第3章 标准库类型习题+答案
- c++ primer第五版(中文)习题答案 第三章第二节-标准库类型string
- 【C++ Primer】摘记--第3章 标准库类型
- 【C++ Primer学习笔记】第3章:标准库类型
- 【C++ Primer学习笔记】第3章:标准库类型
- 《C++ Primer 4th》读书笔记 第3章-标准库类型
- C++ Primer 第三章 标准库类型习题解答
- 《C++ Primer》 第四版 第3章 标准库类型
- c++ primer第五版(中文)习题答案 第二章第一节-基本内置类型
- c++ primer第五版(中文)习题答案 第二章第三节-复合类型
- C++ Primer 学习笔记——第3章:标准库类型 string
- C++ Primer 学习笔记——第3章:标准库类型 vector
- 【C++ Primer】第3章 标准库类型
- c++ primer第五版(中文)习题答案 第二章第五节-处理类型
- 《C++ Primer 4 Answer Book》 整理[3]——第3章 标准库类型
- 【C++ Primer学习笔记】第3章:标准库类型
- 第3章 标准库类型 课后习题
- [C++ Primer 第4版]第3章 标准库类型
- c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换