《C++ Primer》5th 課後練習 第五章 語句 11~21

練習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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章