3.2 编写程序, 从标准输入中一次读入一整行, 然后修改该程序使其一次读入一个词.
- void readByLine ()
- {
- string line;
- ?
- while (getline (cin, line)) {
- cout <<line << endl;
- }
- }
- void readByWord ()
- {
- string word;
- ?
- while (cin>> word) {
- cout <<word << endl;
- }
- }
3.3 说明 string 类的输入运算符和 getline 函数分别是如何处理空白字符的.
输入运算符会自动忽略字符串前的空白 (空格, 制表符, 换行等), 从第一个真正的字符到下一个空白.
getline 函数会保存字符串中的空白, 读入数据直到遇见换行符.
3.4 编写程序, 读入两个字符串, 比较其是否相等并输出结果. 如果不相等, 输出较大的那个字符串. 改写上述程序, 比较输入的两个字符串是否等长, 如果不等长, 输出长度较大的那个字符串.
- void compareString ()
- {
- string s1, s2;
- ?
- cin>> s1>> s2;
- ?
- if (s1 == s2) {
- cout <<"equal" << endl;
- } else if (s1> s2){
- cout <<s1 << endl;
- } else {
- cout << s2 << endl;
- }
- ?
- }
- void compareSize ()
- {
- string s1, s2;
- ?
- cin>> s1>> s2;
- if (s1.size() == s2.size()) {
- cout <<"equal" << endl;
- } else if (s1.size()> s2.size()) {
- cout <<s1 << endl;
- } else {
- cout << s2 << endl;
- }
- }
3.5 编写一段程序, 从标准输入中读入多个字符串并将它们连接在一起, 输出连接成的大字符串. 然后修改程序, 用空格把输入的多个字符串分割开来.
- void linkString ()
- {
- string word;
- string sum;
- ?
- while (getline (cin, word)) {
- ?
- sum += word;
- cout << sum << endl;
- }
- }
- void spliteString ()
- {
- string word;
- string sum;
- ?
- while (getline(cin, word)) {
- sum += (word + " ");
- cout << sum << endl;
- }
- }
3.6 编写程序, 使用范围 for 语句将字符串内的所有字符用 X 代替.
- void test306 ()
- {
- string str("hello world!");
- int len = str.size();
- ?
- // for (int i = 0; i < len; i++) {
- // str[i] = 'x';
- // }
- for (auto &c : str) {
- c = 'X';
- }
- ?
- cout << str << endl;
- }
3.7 就上题的程序, 将循环控制变量的类型设为 char 会发生什么?
Answer: 设置成 char 也是可以的, 因为每个元素都是 char 类型的.
3.8 分别用 while 循环和 for 循环重写第一题, 哪种形式更好呢?
Answer: 用普通 for 循环实现如 3.6 题代码中注释部分, while 实现也差不多, 都要先知道字符串的长度. 相比较而言, 范围 for 语句更加简洁一点.
3.9 下面的程序有何作用? 它合法吗? 如果不合法, 为什么?
- string s;
- cout << s[0] << endl;
Answer: 不合法, 使用超出范围的下标将引发不可预知的结果, 由此推断, 使用下标访问空 string 也会引发不可预知的结果.
3.10 编写程序, 读入一个包含标点符号的字符串, 将标点符号去除后输出字符串剩余的部分.
- void test310 ()
- {
- const string str = "0123&*sjaa,.?70!";
- string result;
- ?
- for (auto c : str) {
- // if ((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z')) {
- if (!ispunct(c)) { //ispunct 函数, 如果 c 为标点符号时为真.
- result += c;
- }
- }
- ?
- cout <<result << endl;
- }
3.11 下面的范围 for 语句合法吗? 如果合法, c 的类型是什么?
- const string s = "Keep out!";
- for (auto &c : s) { /*. . . */ }
不合法, 设置一个 auto 类型的引用时, 初始值中的顶层 const 依旧保留, c 的类型为 const string&. 因此, 如果, 在 for 循环中要改变 c 的值, 则语句不合法.
3.12 下列 vector 对象的定义是否正确?
- vector<vector> ivec; // 合法, 创建类型为 vector 的对象.
- vector svec = ivec; // 不合法, svec 是 string 类型, 而 ivec 是 vector 类型.
- vectorsvec(10, "null"); // 合法, 创建 10 个 string 类型的元素, 每个都被初始化为 null
3.13 下列 vector 对象各包含多少个元素? 值分别是多少?
- (a)vector<int> v1; // 不包含元素
- (b)vector<int> v2(10); // 包含 10 个元素, 每个都初始化为 0
- (c)vector<int> v3(10, 42); // 包含 10 个元素, 每个都初始化为 42
- (d)vector<int> v4{10}; // 包含 1 个元素, 值为 10
- (e)vector<int> v5{10, 42}; // 包含 2 个元素, 值分别是 10 和 42
- (f)vector<string> v6{10}; // 10 个默认初始化的元素, 初始化为空
- (g)vector<string> v7{10, "hi"}; // 10 个值为 hi 的元素
3.14 编写一段程序, 用 cin 读入一组整数并把它们存入 vector 对象.
- void test314 ()
- {
- vector<int> ivec;
- int num;
- while (cin>> num) {
- ivec.push_back(num);
- }
- vector<int>::iterator iter;
- for (iter = ivec.begin(); iter != ivec.end(); iter ++) {
- cout <<*iter << " ";
- }
- cout << endl;
- }
ctrl + D 结束输入
3.15 改写上题程序, 读入字符串.
- void test315 ()
- {
- vector<string> svec;
- string str;
- while (cin>> str) {
- svec.push_back(str);
- }
- ?
- vector<string>::iterator iter;
- ?
- for (iter = svec.begin(); iter != svec.end(); iter ++) {
- cout <<*iter << " ";
- }
- cout << endl;
- }
3.16 编写程序, 将 13 题中的 vector 对象容量和值输出. 检验之前的回答是否正确.
- void test316 ()
- {
- vector<int> v1; // 不包含元素
- vector<int> v2(10); // 包含 10 个元素, 每个都初始化为 0
- vector<int> v3(10, 42); // 包含 10 个元素, 每个都初始化为 42
- vector<int> v4{10}; // 包含 1 个元素, 值为 10
- vector<int> v5{10, 42}; // 包含 2 个元素, 值分别是 10 和 42
- vector<string> v6{10}; // 10 个默认初始化的元素, 初始化为空
- vector<string> v7{10, "hi"}; // 10 个值为 hi 的元素
- ?
- vector<int>::iterator iter;
- for (iter = v3.begin(); iter != v3.end(); iter++) {
- cout <<*iter << " ";
- }
- }
3.17 从 cin 读入一组词并把它们存入一个 vector 对象, 然后设法把所有词都改为大写. 输出改变后的结果, 每个词占一行.
- void test317 ()
- {
- string word;
- vector<string> svec;
- ?
- while (cin>> word) {
- svec.push_back(word);
- }
- ?
- for (auto &str : svec) {
- for (auto &c : str) {
- c = toupper(c);
- }
- }
- ?
- for (auto i : svec) {
- cout <<i << endl;
- }
- }
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 (ivec1);
- vector<int> ivec3 {42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
第一种更好, 简洁. 还可以使用 for 循环挨个赋值, 但都繁琐.
3.20 读入一组整数并把它们存入一个 vector 对象, 将每对相邻整数的和输出出来, 改写程序, 这次要求先输出第一个和最后一个之和, 接着输出第二个和倒数第二个之和, 依次类推.
- void test318 ()
- {
- int num;
- vector<int> ivec;
- vector<int> sum;
- ?
- while (cin>> num) {
- ivec.push_back(num);
- }
- ?
- ?
- for (vector<int>::size_type i = 0; i <ivec.size(); i+=2) {
- sum.push_back(ivec[i]+ivec[i+1]);
- }
- ?
- for (auto &s : sum) {
- cout << s << " ";
- }
- cout << endl;
- }
- void test319 ()
- {
- int num;
- vector<int> ivec;
- vector<int> sum;
- ?
- while (cin>> num) {
- ivec.push_back(num);
- }
- ?
- vector<int>::size_type len = ivec.size();
- int temp;
- // 如果有奇数个数字, 则最中间的数会与自己相加一遍, 未排除这种情况
- for (vector<int>::size_type i = 0; i <(len+1)/2; i++) {
- temp = ivec[i]+ivec[len-i-1];
- cout << "i =" << i << "temp =" << temp << endl;
- sum.push_back(temp);
- }
- ?
- for (auto &s : sum) {
- cout << s << " ";
- }
- cout << endl;
- }
3.21 请使用迭代器重做 3.16 题.
已经使用过迭代器了, 不再赘述.
3.23 创建一个含有 10 个整数的 vector 对象, 使用迭代器将所有元素的值都变为之前的两倍.
- void test323()
- {
- vector<int> integer(10, 2);
- ?
- for (auto& iter : integer) {
- iter *= 2;
- }
- ?
- for (auto it : integer) {
- cout <<it << " ";
- }
- cout << endl;
- }
3.24 使用迭代器重做 3.20 题.
上面的答案就是用迭代器做的.
3.25 对成绩进行分数段的划分, 使用迭代器.
void test325() { vector<unsigned> scores(10, 0); unsigned grade; int i = 0; int n = 0; auto iter = scores.begin(); while (i <5) { cin>> grade; if (grade> 100) { cout << "Wrong grade!" << endl; continue; } n = grade/10; // scores[n] ++; iter = iter + n; (*iter) ++; i++; iter = scores.begin(); } ? cout << "scores are :" ; for (auto iter : scores) { cout << iter << " "; } cout << endl; } ?
来源: http://www.bubuko.com/infodetail-2614957.html