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

C++Primer第三章习题(1)

2017-11-04 23:51 375 查看


练习3.1:使用恰当的using声明重做1.4.1节和2.6.2节的练习。

略了。

练习3.2:编写一段程序从标准输入中一次读入一整行,然后修改程序使其一次读入一个词。

#include<iostream>
#include<string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

/* 从标准输入中一次读入一整行 */
int main()
{
string str;
int cnt = 0;  //用来存储行数
cout << "请输入字符串,每输入一行就打印一行:" << endl;
while( getline( cin, str ) )
{
++cnt;
cout << "第" << cnt << "行的输入为:"
<< str << endl;
}
return 0;
}

#include<iostream>
#include<string>

using namespace std;

/* 从标准输入中一次读入一个词*/
int main()
{
string word;
int num = 0;
cout << "请输入一个单词(不能包含空格):" << endl;
while ( cin >> word )
{
++num;
cout << "第" << num << "个单词为:"
<< word << endl;
}
return 0;
}


练习3.3:请说明string类的输入运算符和getline函数分别是如何处理空白字符的。

答:标准库string的输入运算符自动忽略字符串开头的空白(包括空格符、换行符、制表符等),从第一个真正的字符开始读起,知道遇见下一处空白为止。

如果希望在最终的字符串中保留输入时的空白符,应该使用getline函数代替原来的>>运算符,getline从给定的输入流中读取数据,直到遇到换行符为止,此时,换行符也被读取进来,但是并不存储在最后的字符串中。

练习3.4:编写一段程序读入两个字符串,比较其是否相等并输出结果。如果不相等,输出较大的那个字符串。改写上述程序,比较输入的两个字符串是否等长,如果不等长,输出长度较大的那个字符串。

#include<iostream>
#include<string>

using namespace std;

int main()
{
string str1,str2;
cout << "请输入两个字符串:" << endl;

while( cin >> str1 >> str2 )
if( str1 == str2 )
cout << "两字符串相等" << endl;
else
cout << "较大的字符串为:" << ( str1 > str2 ? str1 : str2 ) << endl;

return 0;
}


#include<iostream>
#include<string>

using namespace std;

int main()
{
string str1,str2;
cout << "请输入两个字符串:" << endl;

while( cin >> str1 >> str2 )
if( str1.size() == str2.size() )
cout << "两字符串等长" << endl;
else
cout << "较长的字符串为:" << ( str1.size() > str2.size() ? str1 : str2 ) << endl;

return 0;
}


练习3.5:编写一段程序从标准输入中读入多个字符串并将他们连接在一起,输出连接成的大字符串。然后修改程序,用空格把输入的多个字符串分隔开来。

#include<iostream>
#include<string>

using namespace std;

int main()
{
string tmpString,longString;

cout << "请输入多个字符串,我们将把他们连接起来:" << endl;
if( cin >> longString )  //读入第一个字符串
{
while( cin >> tmpString )
longString += tmpString;
cout << "连接而成的大字符串:" << longString << endl;
}

else
{
cout << "输入有误" << endl;
return -1;
}
return 0;
}

#include<iostream>
#include<string>

using namespace std;

int main()
{
string tmpString,longString;

cout << "请输入多个字符串,我们将把他们连接起来:" << endl;
if( cin >> longString )  //读入第一个字符串
{
while( cin >> tmpString )
{
longString += " ";
longString += tmpString;
}
cout << "连接而成的大字符串:" << longString << endl;
}

else
{
cout << "输入有误" << endl;
return -1;
}
return 0;
}


练习3.6:编写一段程序,使用范围for语句将字符串内所有的字符用X代替。

#include<iostream>
#include<string>

using namespace std;

int main()
{
string str;
cout << "请输入一个字符串:" << endl;
cin >> str;
cout << "替换前的字符串为:" << str << endl;

for( auto &c : str )
c = 'X';
cout << "替换后的字符串为:" << str << endl;

return 0;
}


练习3.7:就上一题完成的程序而言,如果将循环控制变量的类型设为char将发生什么?先估计一下结果,然后实际编程进行验证。

答:结果相同。因为auto判断的类型正是char。

练习3.8:分别用while循环和传统的for循环重写第一题的程序,你觉得那种形式更好呢?为什么呢?

#include<iostream>
#include<string>

using namespace std;

int main()
{
string str;
cout << "请输入一个字符串:" << endl;
cin >> str;
cout << "替换前的字符串为:" << str << endl;

decltype ( str.size() ) i = 0;
while( i != str.size() )
{
str[i] = 'X';
++i;
}

cout << "替换后的字符串为:" << str << endl;

return 0;
}


for循环就不写了,差不多。

练习3.9:下面的程序有何作用?它合法吗?如果不合法,为什么?

string s;   //定义并默认初始化一个空串s

cout << s[0] << endl; //不合法。空串的内容为空,不存在首字符。

练习3.10:编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串的剩余部分。

#include<iostream>
#include<string>

using namespace std;

int main()
{
string str;
cout << "请输入一个含有标点符号的字符串:" << endl;

getline( cin, str );
cout << "除去标点符号后剩余的字符串:";

for( const auto &c : str )
if( !ispunct( c ) )
cout << c;
cout << endl;

return 0;
}

练习3.11:下面的范围for语句合法吗?如果合法,c的类型是什么?
4000

const string s = "Keep out!";

for ( auto &c : s ) { /* ... */ } 

该程序段从语法上是合法的。s是一个常量字符串,则c的推断类型是常量引用。所以,c所绑定的对象值不能改变。

练习3.12:下列vector对象的定义有什么不正确的吗?如果有,请指出来。对于正确的,描述其执行结果;对于不正确的,说明其错误的原因。

(a) vector<vector<int>> ivec;  // 正确。 ivec的每个元素都是vector<int>对象

(b) vector<string> svec = ivec; //不正确。svec的元素类型是string,故不能用ivec初始化 svec

(c) vector<string> svec( 10, "null" );//正确。svec有10个元素,每个元素都为"null"

练习3.13:下列的vector对象各包含多少个元素?这些元素的值分别是多少?

(a) vector<int> v1; // v1不包含元素。

(b) vector<int> v2(10); //v2含有10个元素,每个元素都值初始化为0。

(c) vector<int> v3( 10, 42 ); //含有10个元素,每个元素都是42。

(d) vector<int> v4{10}; //含有一个元素,值为10。

(e) vector<int> v5{ 10, 42 }; //含有两个元素,分别为10,42。

(f) vector<string> v6{ 10 }; // 含有10个元素,每个元素都被初始化为空串。

(g) vector<string> v7{ 10, "hi" }; //含有10个元素,每个元素都被初始化为"hi"。

练习3.14:编写一段程序,用cin读入一组整数并把他们存入一个vector对象。

#include<iostream>
#include<vector>

using namespace std;

int main()
{
cout << "请输入一组整数:" << endl;
int integer;
vector<int> val;
while( cin >> integer )
val.push_back( integer );
cout << "容器的数据为:";
for( const auto &i : val )
cout << i << " ";
cout << endl;

return 0;
}


练习3.15:改写上题的程序,不过这次读入的是字符串。

#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main()
{
cout << "请输入一组字符串:" << endl;
string str;
vector<string> container;
while( cin >> str )
container.push_back( str );
cout << "容器的数据为:";
for( const auto &s : container )
cout << s << " ";
cout << endl;

return 0;
}


练习3.16:编写一段程序,把练习3.13对象的容量和具体内容输出出来。
#include<iostream>
#include<vector>

using namespace std;

int main()
{
cout << "请输入一组整数:" << endl;
int integer;
vector<int> val;
while( cin >> integer )
val.push_back( integer );
cout << "容器的容量为:"
<< val.size() << endl;
cout << "容器的数据为:";
for( const auto &i : val )
cout << i << " ";
cout << endl;

return 0;
}


练习3.17:从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写形式。输出改变后的结果,每个词占一行。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>

using namespace std;

int main()
{
cout << "请输入一组词,我们负责把他们存放并把每个词改写成大写形式:" << endl;
string word;
vector<string> container;

while( cin >> word )
container.push_back( word );

for( auto &str : container )
for( auto &c : str )
c = toupper( c );

cout << "输出结果:" << endl;

for( const auto &s : container )
cout << s << endl;

return 0;
}


练习3.18:下面的程序合法吗?如果不合法,你准备如何修改?
vector<int> ivec;

ivec[0] = 42; //不合法。ivec中没有元素,不能用下标访问。

可以修改为:

ivec.push_back( 42 );

练习3.19:如果想定义一个含有10个元素的vector对象,所有元素的值都是42,请列举出三种不同的实现方法。哪种方法更好呢?

vector<int> ivec1( 10, 42 );

vector<int> ivec2{ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 };

vector<int> ivec3( 10 );

for( auto &i : ivec3 )

push_back( 42 );

第一种方法最简洁。

练习3.20:读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。改写你的程序,这次要求先输出第1个和最后一个元素的和,接着输出第2个和倒数第二个元素的和,以此类推。

#include<iostream>
#include<vector>

using namespace std;

int main()
{
cout << "请输入一组整数:" << endl;

vector<int> ivec;
int ival = 0;
decltype ( ivec.size() ) len = 0;

while( cin >> ival )
ivec.push_back( ival );
len = ivec.size();

cout << "容器的数据为:" << endl;
for( const auto &i : ivec )
cout << i << " ";
cout << endl;

cout << "每对相邻整数的和为:" << endl;
for( decltype( len ) i = 0; i != len - 1; ++i )
cout << ivec[ i ] + ivec[ i + 1 ] << " ";
cout << endl;

cout << "相对元素的和(比如第3和倒数第三个元素的和)为:" << endl;

for( decltype( len ) i = 0; i <= len - 1; ++i, --len )
cout << ivec[ i ] + ivec[ len -1 ] << " ";
cout << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: