標籤: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 第五版習題答案第三章