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

練習5.1 什麼是空語句?什麼時候用空語句?

空語句是不做任何操作的語句,當語法上需要一條語句但是邏輯上不需要的時候,可以使用空語句。

練習5.2 什麼是塊?什麼時候會用到塊?

塊是指用花括號括起來的語句和聲明序列,當語法上需要一條語句但是邏輯上需要一組語句的時候,可以使用塊。

練習5.3 使用逗號運算符重寫1.4.1節的 while 循環,使它不再需要塊,觀察改寫之後的代碼可讀性提高了還是降低了。

while (val <= 10)
    sum += val, ++val;

我覺得代碼確實變得簡潔了,但是可讀性有所降低。

練習5.4 說明下列例子的含義,如果存在問題,試着修改它。

(a) while (string::iterator iter != s.end()) { /* . . . */ }
(b) while (bool status = find(word)) { /* . . . */ }
		if (!status) { /* . . . */ }

(a)語句似乎想使用迭代器iter遍歷s,但如果把迭代器iter定義寫在while語句的判斷條件中,會每次循環都重新定義iter,這顯然錯誤。正確的寫法應該把iter定義在while循環之外。

(b)while語句與if語句是相互獨立兩個代碼塊,所以定義在while語句中的變量status是不能在if中訪問的,正確的寫法應把status定義在while循環之前,或把if語句拿到while循環中去判斷。

練習5.5 寫一段自己的程序,使用if else 語句實現把數字轉換爲字母成績的要求。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
	int grade;
	vector<string> souce = { "F", "D", "C", "B", "A", "A++" };
	while(cin >> grade){
		string lettergrade;
		if (grade < 60) {
			lettergrade = souce[0];
		}
		else {
			lettergrade = souce[(grade - 50) / 10];
		}
		if (grade == 100 || grade < 60) {
		}
		else {
			if (grade % 10 > 7) {
				lettergrade += "+";
			}
			else if (grade % 10 < 3) {
				lettergrade += "-";
			}
		}
		cout << lettergrade << endl;
	}
	return 0;
}

練習5.6 改寫上一題的程序,使用條件運算符代替if else語句。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
	int grade;
	vector<string> souce = { "F", "D", "C", "B", "A", "A++" };
	while(cin >> grade){
		string lettergrade = grade < 60 ? souce[0] : souce[(grade - 50) / 10];
		lettergrade += (grade == 100 || grade < 60) ? "" : (grade % 10 > 7) ? "+" : (grade % 10 < 3) ? "-" : "";
		cout << lettergrade << endl;
	}
	return 0;
}

練習5.7 改寫下列代碼段中的錯誤。

(a) if (ival1 != ival2) 
		ival1 = ival2
    else 
    	ival1 = ival2 = 0;
(b) if (ival < minval) 
		minval = ival;
    	occurs = 1;
(c) if (int ival = get_value())
    	cout << "ival = " << ival << endl;
    if (!ival)
    	cout << "ival = 0\n";
(d) if (ival = 0)
    	ival = get_value();

(a)ival1 = ival2 語句後少了';'

(b)應該把minval = ival;occurs = 1;前後加上花括號。

©應該把if(!ival)改成else

(d)if (ival = 0) 應該改爲 if (ival == 0)

練習5.8 什麼是“懸垂else”?C++語言是如何處理else子句的?

C++規定else與距離它最近的尚未匹配的if匹配。

練習5.9 編寫一段程序,使用一系列if語句統計從cin讀入的文本中有多少元音字母。

#include<iostream>
using namespace std;
int main()
{
	char ch;
	int sum_a = 0, sum_e = 0, sum_i = 0, sum_o = 0, sum_u = 0;
	int vowelcnt = 0;
	while(cin >> ch){
		if (ch == 'a') {
			++sum_a;
			++vowelcnt;
		}
		else if(ch == 'e'){
			++sum_e;
			++vowelcnt;
		}
		else if (ch == 'i') {
			++sum_i;
			++vowelcnt;
		}
		else if (ch == 'o') {
			++sum_o;
			++vowelcnt;
		}
		else if (ch == 'u') {
			++sum_u;
			++vowelcnt;
		}
	}
	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 << "vowelcnt is: " << vowelcnt << endl;
	return 0;
}

練習5.10 我們之前實現的統計元音字母的程序存在一個問題:如果元音字母以大寫形式出現,不會被統計在內。編寫一段程序,既統計元音字母的小寫形式,也統計元音字母的大寫形式,也就是說,新程序遇到’a’和’A’都應該遞增 aCnt 的值,以此類推。

#include<iostream>
using namespace std;
int main()
{
	char ch;
	int sum_a = 0, sum_e = 0, sum_i = 0, sum_o = 0, sum_u = 0;
	int vowelcnt = 0;
	while(cin >> ch){
		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;
		default:
			break;
		}
	}
	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 << "vowelcnt is: " << vowelcnt << endl;
	return 0;
}
發佈了290 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章