c++ Primer 第五版习题答案第三章

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; } ?

原文地址:https://www.cnblogs.com/songshuguiyu/p/9081507.html

时间: 2024-11-08 05:29:45

c++ Primer 第五版习题答案第三章的相关文章

C++Primer第五版——习题答案目录

目前正在刷<C++Primer>这本书,会在博客上记录课后习题答案,答案仅供参考. 因为水平有限,如有有误之处,希望大家不吝指教,谢谢! 目录地址 使用的系统为:win 10,编译器:VS2017,答案用markdown写的. 第1章 开始&&第2章 变量和基本类型 ? 第3章 字符串.向量和数组 ? 第4章 表达式 ? 第5章 语句 ? 第6章 函数 ? 第7章 类 ? 第8章 IO库 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不断学习中,欢迎交流! 原文地址:

C++Primer第五版——习题答案详解(五)

习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第6章 函数 练习6.4 #include<iostream> using namespace std; int fact(int x) { if (x == 1) return x; else return x * fact(x - 1); } int main() { int x; cout << "Please input a number:\n"

C++Primer第五版——习题答案详解(七)

习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第8章 IO库 练习8.1 istream &iofunc(istream &is) { string s; while (is >> s) { cout << s << endl; } is.clear(); return is; } 练习8.2 #include<iostream> #include<string>

C++Primer第五版——习题答案详解

开始刷<C++Primer>这本书,会在博客上更新课后习题. 水平有限,如有有误之处,希望大家不吝指教! 不断学习中,欢迎交流! 第一二章课后题 练习1.3 #include<iostream> int main(){ std::cout<<"Hello world"<<std::endl; return 0; } 练习1.4 #include<iostream> int main(){ std::cout <<

c++ Primer 第五版习题答案第二章

练习2.1 Q: 类型int.long.long long和short的区别是什么,无符号和带符号类型的区别是什么?float和double的区别是什么? A:int. long. long long和short尺寸不同,表示的数据范围不同.无符号只能表示0和正数,无符号还可以表示负数.float为单精度浮点数,double为双精度,一般来说,float占4字节,double占8字节. 练习2.2 Q: 计算按揭贷款时,对于利率.本金和付款分别应选择何种数据类型?说明你的理由. A: 利率应该用

曼昆《经济学原理》(第五版)习题解答 第三章 相互依存性与贸易的好处

1 .在什么情况下,生产可能性曲线是直线,而不是外凸的?答:生产可能性曲线会由于机会成本的动态变化而呈现不同形状.在机会成本不变的情况下,生产可能性曲线是一条直线;机会成本递增的时候,生产可能性曲线凹向原点;而机会成本递减的时候,生产可能性曲线凸向原点.这几种情况如下图所示. 2 .解释绝对优势和比较优势有什么不同.答:同一生产者可能同时在两种物品上都具有绝对优势,但不可能同时在两种物品上都拥有比较优势.绝对优势反映了生产率的高低,比较优势反映了相对机会成本的高低.3 .举例说明一个人在做某件事

C++Primer第五版习题解答---第一章

C++Primer第五版习题解答---第一章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2022/1/7 第一章:开始 练习1.3 #include<iostream> int main() { std::cout << "hello, world" << std::endl; return 0; } 练习1.4: #include<iostream> int main() { int

c primer plus(五版)编程练习-第七章编程练习

1.编写一个程序.该程序读取输入直到遇到#字符,然后报告读取的空格数目.读取的换行符数目以及读取的所有其他字符数目. #include<stdio.h> #include<ctype.h> int main(void){ char ch; int count1,count2,count3; count1 = count2 = count3 = 0;  printf("Enter text to be analyzed(#to terminate):\n"); w

《C++Primer》第五版习题详细答案--目录

作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式 原文地址:https://www.cnblogs.com/cosefy/p/12180771.html