練習5.11 修改統計元音字母的程序,使其也能統計空格、製表符、和換行符的數量。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int sum_a = 0, sum_e = 0, sum_i = 0, sum_o = 0, sum_u = 0,
sum_space = 0, sum_tab = 0, sum_enter = 0;
int vowelcnt = 0;
while(getline(cin, s)){
for(auto ch: s)
switch (ch)
{
case 'a':
case 'A':
++sum_a;
++vowelcnt;
break;
case 'e':
case 'E':
++sum_e;
++vowelcnt;
break;
case 'i':
case 'I':
++sum_i;
++vowelcnt;
break;
case 'o':
case 'O':
++sum_o;
++vowelcnt;
break;
case 'u':
case 'U':
++sum_u;
++vowelcnt;
break;
case ' ':
++sum_space;
break;
case '\t':
++sum_tab;
break;
default:
break;
}
++sum_enter;
}
cout << "acnt is: " << sum_a << endl;
cout << "ecnt is: " << sum_e << endl;
cout << "icnt is: " << sum_i << endl;
cout << "ocnt is: " << sum_o << endl;
cout << "ucnt is: " << sum_u << endl;
cout << "spacecnt is: " << sum_space << endl;
cout << "tabcnt is: " << sum_tab << endl;
cout << "entercnt is: " << sum_enter << endl;
cout << "vowelcnt is: " << vowelcnt << endl;
return 0;
}
練習5.12 修改統計元音字母的程序,使其能統計含以下兩個字符的字符序列的數量: ff、fl和fi。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int sum_a = 0, sum_e = 0, sum_i = 0, sum_o = 0, sum_u = 0,
sum_space = 0, sum_tab = 0, sum_enter = 0, sum_ff = 0, sum_fl = 0, sum_fi = 0;
int vowelcnt = 0;
char prech = '\0';
while (getline(cin, s)) {
for (auto ch : s) {
switch (ch)
{
case 'a':
case 'A':
++sum_a;
++vowelcnt;
break;
case 'e':
case 'E':
++sum_e;
++vowelcnt;
break;
case 'i':
if (prech == 'f') ++sum_fi;
case 'I':
++sum_i;
++vowelcnt;
break;
case 'o':
case 'O':
++sum_o;
++vowelcnt;
break;
case 'u':
case 'U':
++sum_u;
++vowelcnt;
break;
case ' ':
++sum_space;
break;
case '\t':
++sum_tab;
break;
case 'f':
if (prech == 'f') ++sum_ff;
break;
case 'l':
if (prech == 'f') ++sum_fl;
break;
default:
break;
}
prech = ch;
}
++sum_enter;
}
cout << "acnt is: " << sum_a << endl;
cout << "ecnt is: " << sum_e << endl;
cout << "icnt is: " << sum_i << endl;
cout << "ocnt is: " << sum_o << endl;
cout << "ucnt is: " << sum_u << endl;
cout << "spacecnt is: " << sum_space << endl;
cout << "tabcnt is: " << sum_tab << endl;
cout << "entercnt is: " << sum_enter << endl;
cout << "vowelcnt is: " << vowelcnt << endl;
cout << "ff cnt is: " << sum_ff << endl;
cout << "fi cnt is: " << sum_fi << endl;
cout << "fl cnt is: " << sum_fl << endl;
return 0;
}
練習5.13 下面顯示的每個程序都含有一個常見的編碼錯誤,指出錯誤在哪裏,然後修改它們。
(a) unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch) {
case 'a': aCnt++;
case 'e': eCnt++;
default: iouCnt++;
}
(b) unsigned index = some_value();
switch (index) {
case 1:
int ix = get_value();
ivec[ ix ] = index;
break;
default:
ix = ivec.size()-1;
ivec[ ix ] = index;
}
(c) unsigned evenCnt = 0, oddCnt = 0;
int digit = get_num() % 10;
switch (digit) {
case 1, 3, 5, 7, 9:
oddcnt++;
break;
case 2, 4, 6, 8, 10:
evencnt++;
break;
}
(d) unsigned ival=512, jval=1024, kval=4096;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch(swt) {
case ival:
bufsize = ival * sizeof(int);
break;
case jval:
bufsize = jval * sizeof(int);
break;
case kval:
bufsize = kval * sizeof(int);
break;
}
- (a) 少了 break語句。應該爲:
unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch) {
case 'a':
aCnt++;
break;
case 'e':
eCnt++;
break;
default:
iouCnt++;
break;
}
- (b) 在 default 分支當中,ix 未定義。應該在外部定義ix。
unsigned index = some_value();
int ix;
switch (index) {
case 1:
ix = get_value();
ivec[ ix ] = index;
break;
default:
ix = static_cast<int>(ivec.size())-1;
ivec[ ix ] = index;
}
- © case 後面應該用
:
而不是,
。
unsigned evenCnt = 0, oddCnt = 0;
int digit = get_num() % 10;
switch (digit) {
case 1: case 3: case 5: case 7: case 9:
oddcnt++;
break;
case 2: case 4: case 6: case 8: case 0:
evencnt++;
break;
}
- (d) case 標籤必須是整型常量表達式。
const unsigned ival=512, jval=1024, kval=4096;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch(swt) {
case ival:
bufsize = ival * sizeof(int);
break;
case jval:
bufsize = jval * sizeof(int);
break;
case kval:
bufsize = kval * sizeof(int);
break;
}
**練習5.14 **
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
string bef = "", mts = "";
int msum = 0, sum = 0;
while(cin >> s){
if (s == bef) {
++sum;
if (msum < sum) {
msum = sum;
mts = s;
}
}
else {
sum = 1;
bef = s;
}
}
cout << mts <<" occurred cnt is: " << sum << endl;
return 0;
}
練習5.15 說明下列循環的含義並改正其中的錯誤。
(a) for (int ix = 0; ix != sz; ++ix) { /* ... */ }
if (ix != sz)
// . . .
(b) int ix;
for (ix != sz; ++ix) { /* ... */ }
(c) for (int ix = 0; ix != sz; ++ix, ++sz) { /*...*/ }
改正:
(a) int ix;
for (ix = 0; ix != sz; ++ix) { /* ... */ }
if (ix != sz)
// . . .
(b) int ix;
for (ix = 0;ix != sz; ++ix) { /* ... */ }
(c) for (int ix = 0; ix != sz; ++ix) { /*...*/ }
練習5.16 while 循環特別適用於那種條件不變、反覆執行操作的情況,例如,當未達到文件末尾時不斷讀取下一個值。for 循環更像是在按步驟迭代,它的索引值在某個範圍內一次變化。根據每種循環的習慣各自編寫一段程序,然後分別用另一種循環改寫。如果只能使用一種循環,你傾向於哪種?爲什麼?
//反覆操作
while (cin >> s) {
//...
}
for (;cin >> s;) {
//...
}
//迭代
for (int i = 0; i < s.size(); ++i) {
//...
}
int i = 0;
while (i < s.size()) {
//...
++i;
}
我更傾向於保留for,因爲它寫法更緊湊,利於讀者瞭解循環的目的。
練習5.17 假設有兩個包含整數的vector對象,編寫一段程序,檢驗其中一個vector對象是否是另一個的前綴。爲了實現這一目標,對於兩個不等長的vector對象,只需挑出長度較短的那個,把它的所有元素和另一個vector對象比較即可。例如,如果兩個vector對象的元素分別是0、1、1、2 和 0、1、1、2、3、5、8,則程序的返回結果爲真。
bool ispre(vector<int> &a, vector<int> &b) {
bool flag = true;
int sz = min(a.size(), b.size());
for (int i = 0; i < sz; ++i) {
if (a[i] != b[i]) {
flag = false; break;
}
}
return flag;
}
練習5.18 說明下列循環的含義並改正其中的錯誤。
(a) do { // 應該添加花括號
int v1, v2;
cout << "Please enter two numbers to sum:" ;
if (cin >> v1 >> v2)
cout << "Sum is: " << v1 + v2 << endl;
}while (cin);
(b) int ival;
do {
// . . .
} while (ival = get_response()); // 應該將ival 定義在循環外
(c) int ival = get_response();
do {
ival = get_response();
} while (ival); // 應該將ival 定義在循環外
練習5.19 編寫一段程序,使用do while 循環重複地執行下述任務:首先提示用戶輸入兩個string對象,然後挑出較短的那個並輸出它。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string s1, s2;
do {
cout << "Please input two string" << endl;
cin >> s1 >> s2;
cout << ((s1.size() <= s2.size()) ? s1 : s2) << endl;
cout << "continue? Enter yes or no: ";
cin >> s1;
} while (!s1.empty() && s1[0] != 'n');
return 0;
}
**練習5.20 **
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string s, pres="";
bool flag = true;
while (cin >> s) {
if (s == pres) {
flag = false;
break;
}
pres = s;
}
if(flag)
cout << "no word was repeated." << endl;
else {
cout << s << " occurs twice in succession." << endl;
}
return 0;
}