c++ Primer 第五版習題答案第三章

來源:互聯網
上載者:User

標籤:temp   多少   st3   依次   說明   編寫程式   類型   標點符號   語句   

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實現也差不多,都要Crowdsourced Security Testing道字串的長度。相比較而言,範圍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; } ?

c++ Primer 第五版習題答案第三章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.