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;
}
相关文章推荐
- C++Primer第五版 第三章习题答案(31~40)
- c++primer第三章习题(1)
- C++primer[习题][第三章][31-45]
- C++primer第三章习题3.7
- c++primer第四版第三章课后习题的几个解答算法
- C++Primer第三章习题(2)
- C++Primer第五版 第三章习题答案(21~30)
- c++primer第三章习题(2)
- c++primer 第三章习题(4)
- C++Primer第五版 第三章习题答案(11~20)
- C++Primer第五版 第三章习题答案(41~45)
- C++Primer 中文版 第五版 第三章课后习题答案
- C++primer[习题][第三章][1-10]
- C++primer[习题][第三章][11-20]
- C++primer[习题][第三章][21-30]
- C++Primer第五版 第三章习题答案(1~10)
- c++primer 第三章习题(3)
- C++Primer第五版 第五章习题答案(21~25)
- 快学Scala习题解答—第三章 数组相关操作
- c++ Primer Plus(第六版)第三章习题,写代码之路