练习3.1:使用恰当的using声明重做1.4.1节和2.6.2节的练习。
略了。
练习3.2:编写一段程序从标准输入中一次读入一整行,然后修改程序使其一次读入一个词。
#include
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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;
}
#include
#include
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;
}
答:结果相同。因为auto判断的类型正是char。
练习3.8:分别用while循环和传统的for循环重写第一题的程序,你觉得那种形式更好呢?为什么呢?
#include
#include
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;
}
练习3.9:下面的程序有何作用?它合法吗?如果不合法,为什么?
string s; //定义并默认初始化一个空串s
cout << s[0] << endl; //不合法。空串的内容为空,不存在首字符。
练习3.10:编写一段程序,读入一个包含标点符号的字符串,将标点符号去除后输出字符串的剩余部分。
#include
#include
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;
}
const string s = "Keep out!";
for ( auto &c : s ) { /* ... */ }
该程序段从语法上是合法的。s是一个常量字符串,则c的推断类型是常量引用。所以,c所绑定的对象值不能改变。
练习3.12:下列vector对象的定义有什么不正确的吗?如果有,请指出来。对于正确的,描述其执行结果;对于不正确的,说明其错误的原因。
(a) vector
(b) vector
(c) vector
练习3.13:下列的vector对象各包含多少个元素?这些元素的值分别是多少?
(a) vector
(b) vector
(c) vector
(d) vector
(e) vector
(f) vector
(g) vector
练习3.14:编写一段程序,用cin读入一组整数并把他们存入一个vector对象。
#include
#include
using namespace std;
int main()
{
cout << "请输入一组整数:" << endl;
int integer;
vector val;
while( cin >> integer )
val.push_back( integer );
cout << "容器的数据为:";
for( const auto &i : val )
cout << i << " ";
cout << endl;
return 0;
}
练习3.15:改写上题的程序,不过这次读入的是字符串。
#include
#include
#include
using namespace std;
int main()
{
cout << "请输入一组字符串:" << endl;
string str;
vector container;
while( cin >> str )
container.push_back( str );
cout << "容器的数据为:";
for( const auto &s : container )
cout << s << " ";
cout << endl;
return 0;
}
#include
#include
using namespace std;
int main()
{
cout << "请输入一组整数:" << endl;
int integer;
vector val;
while( cin >> integer )
val.push_back( integer );
cout << "容器的容量为:"
<< val.size() << endl;
cout << "容器的数据为:";
for( const auto &i : val )
cout << i << " ";
cout << endl;
return 0;
}
#include
#include
#include
#include
using namespace std;
int main()
{
cout << "请输入一组词,我们负责把他们存放并把每个词改写成大写形式:" << endl;
string word;
vector 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;
}
vector
ivec[0] = 42; //不合法。ivec中没有元素,不能用下标访问。
可以修改为:
ivec.push_back( 42 );
练习3.19:如果想定义一个含有10个元素的vector对象,所有元素的值都是42,请列举出三种不同的实现方法。哪种方法更好呢?
vector
vector
vector
for( auto &i : ivec3 )
push_back( 42 );
第一种方法最简洁。
练习3.20:读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。改写你的程序,这次要求先输出第1个和最后一个元素的和,接着输出第2个和倒数第二个元素的和,以此类推。
#include
#include
using namespace std;
int main()
{
cout << "请输入一组整数:" << endl;
vector 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;
}