您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 第3章 标准库类型习题+答案

2011-09-25 16:43 344 查看
第3章 标准库类型习题
习题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迭代器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: