【C++ Primer】Part1·Day4 第五章 笔记及练习作答

学一门新的程序设计语言的最好方法就是不断地写代码。

switch语句

switch (表达式) {}  表达式的值会转换成整数类型,与case标签中的值比较。
case 标签 必须是整型常量表达式。任何两个case标签的值不能相同。
default 标签 类似于 if-else 语句中的 else。

不要用goto

try语句块和异常处理

异常处理包括:throw表达式(即异常抛出) 和 try语句块(异常处理代码)。

throw runtime_error("balabalababala");
try {
	/* 正常逻辑 */ 
} catch (异常声明) {
	/* 发生异常后的逻辑 */
} catch (异常声明) {
	/* 发生异常后的逻辑 */
}

常用异常类头文件:exception(只报告异常发生)、stdexcept、new、type_info。

stdexcept定义的异常类
exception最常见问题
runtime_error只有在运行时才能检测的问题
range_error运行时错误:结果超出值域范围
overflow_error运行时错误:计算上溢
underflow_error运行时错误:计算下溢
logic_error程序逻辑错误
domain_error逻辑错误:参数对应结果值不存在
invalid_argument逻辑错误:无效参数
length_error逻辑错误:试图创建一个超出该类型最大长度的对象
out_of_range逻辑错误:使用一个超出有效范围的值

异常类型只定义了一个名为what的成员函数,无参数,返回值是指向C风格字符串的const char*,只提供一些文本信息。

没啥笔记,今天摸了



-------------------------------------------------------------- \我 是 分 割 线/ --------------------------------------------------------------

小昭 の 练习作答

5.1~5.2 略
5.3 while(val <= 10) sum += val,++val;
5.4

(a) 每次定义一个迭代器不等于s的尾部。迭代器没有初始化。
string::iterator iter = s.begin();
while(iter != s.end()) { /* ... */;iter++; }
(b) 每次找一个单词是否存在,不存在则执行语句。

5.5

int grade;cin >> grade;
vector<string> scores = {"S","A","B","C","D"};
string lever;
if(grade == 100)  lever = scores[0];
else if(grade >= 90) lever = scores[1];
else if(grade >= 70) lever = scores[2];
else if(grade >= 60) lever = scores[3];
else lever = scores[4];

5.6

int grade;cin >> grade;
vector<string> scores = {"S","A","B","C","D"};
string lever = (grade == 100) ? scores[0]
			 : (grade >= 90) ? scores[1]
			 : (grade >= 70) ? scores[2]
			 : (grade >= 60) ? scores[3] : scores[4];

5.7

(a) 第二行加分号;
(b) if 语句要加上花括号;
(c) int ival; if(val = get_value()) /* ... */;
(d) if(ival == 0) /* ... */

5.8 在多个嵌套 if 语句中,无法确定一个给定的 else 是和哪一个 if 匹配。C++规定 else 与离它最近的尚未匹配的 if 匹配。
5.9

unsigned aCnt = 0,eCnt = 0,iCnt = 0,oCnt = 0,uCnt = 0;
char ch;
while(cin >> ch){
	if(ch == 'a') ++aCnt;
	else if(ch == 'e') ++eCnt;
	else if(ch == 'i') ++iCnt;
	else if(ch == 'o') ++oCnt;
	else if(ch == 'u') ++uCnt;
}

5.10

unsigned aCnt = 0,eCnt = 0,iCnt = 0,oCnt = 0,uCnt = 0;
char ch;
while(cin >> ch){
	switch (ch) {
		case 'a': case 'A':
			++aCnt;
			break;
		case 'e': case 'E':
			++eCnt;
			break;
		case 'i': case 'I':
			++iCnt;
			break;
		case 'o': case 'O':
			++oCnt;
			break;
		case 'u': case 'U':
			++uCnt;
			break;
	}
}

5.11

unsigned aCnt = 0,eCnt = 0,iCnt = 0,oCnt = 0,uCnt = 0,spaceCnt = 0,tCnt = 0,nCnt = 0;
char ch;
while(cin >> ch){
	switch (ch) {
		case 'a':
			++aCnt;
			break;
		case 'e':
			++eCnt;
			break;
		case 'i':
			++iCnt;
			break;
		case 'o':
			++oCnt;
			break;
		case 'u':
			++uCnt;
			break;
		case ' ':
			++spaceCnt;
			break;
		case '\t':
			++tCnt;
			break;
		case '\n':
			++nCnt;
			break;
	}
}

5.12

unsigned ffCnt = 0,flCnt = 0,fiCnt = 0;
char ch;
bool pref = false; // 前置f 
while(cin >> ch){
	switch (ch) {
		case 'f':
			if(pref) ++ffCnt;	// 前置f 存在  ,则存在 ff.
			else pref = true;	// 前置f 不存在,将自己置为前置f 
			break;
		case 'l':
			if(pref) ++flCnt;	// 前置f 存在  ,则存在 fl.
			break;
		case 'i':
			if(pref) ++fiCnt;	// 前置f 存在  ,则存在 fi.
			break;
	}
}

5.13

(a) 两个 case 都没有 break 语句;
(b) ix 需要放在 switch 语句外定义;
(c) case 1:case 3:case 5:case 7:case 9: /* ...*/;
(d) case 后面必须是整型常量表达式.
	constexpr unsigned ival = 512,jval = 1024,kval = 4096;

5.14

string word,preWord,res;int max = 1,cnt = 0;
while(cin >> word && word != "gg"){  // 一直读取直到读取"gg"结束循环。
	if (cnt == 0) {		// 对第一单词作为前置单词
		preWord = word;
		++cnt;
	} else {			// 对其他单词判断
		if (word == preWord){	// 单词与前置单词一致
			if (max < ++cnt) {				// 计数变量自增,并判断最大数量.
				max = cnt;					// 保存最大数量
				res = word;					// 保存最大数量的单词
			}
		} else {				// 单词与前置单词不一致
			cnt = 1;			// 计数为 1
			preWord = word;		// 将其设置为前置单词
		}
	}
}
cout << res << " " << max << endl;

5.15 略
5.16 while循环,能自定义的地方更多。
5.17

vector<int> a = {0,1},b = {0,1,2,3};
bool isqianzui = true;
int n = a.size() < b.size() ? a.size() : b.size();
for(int i = 0;i < n;++i){
	if(a[i] != b[i]){
		isqianzui = false;
		break;
	}
}
if(isqianzui) cout << "是前缀" << endl;
else cout << "不是前缀" << endl;

5.18 略
5.19

string huh;
do{
	cout << "输入两个字符串:";
	string a,b; cin >> a >> b;
	cout << (a.size() < b.size()) ? a : b << endl;
	cout << "还要输入吗?   ";
}while(cin >> huh && huh !="no");

5.20

string word,preWord;int cnt = 0;
while(cin >> word && word != "gg"){  		// 一直读取直到读取"gg"结束循环。
	if (cnt == 0) {		// 对第一单词作为前置单词
		preWord = word;
		cnt = 1;
	} else {			// 对其他单词判断
		if (word == preWord){	// 单词与前置单词一致
			cout << word << endl;
			break;
		} else {				// 单词与前置单词不一致
			preWord = word;		// 将其设置为前置单词
			cnt = 1;			// 计数为 1
		}
	}
}
cout << " 如果前面没有单词出现就是没有连续重复的" << endl;

5.21

string word,preWord;int cnt = 1;
while(cin >> word && word != "gg"){  	// 一直读取直到读取"gg"结束循环
	if (!isupper(word[0])) continue;	// 没有大写字母开头的单词直接略过
	if (cnt == 0) {		// 对第一单词作为前置单词
		preWord = word;
		cnt = 1;
	} else {			// 对其他单词判断
		if (word == preWord){	// 单词与前置单词一致
			cout << word << endl;
			break;
		} else {				// 单词与前置单词不一致
			preWord = word;		// 将其设置为前置单词
			cnt = 1;			// 计数为 1
		}
	}
}
cout << " 如果前面没有单词出现就是没有连续重复的" << endl;

5.22

while(int sz = get_size()){
	if(sz > 0) break;
}

5.23~5.25

int a,b;cin >> a >> b;
cout << a / b << endl;

int a,b;cin >> a >> b;
if(b == 0) throw runtime_error("被除数为 0 啦");
cout << a / b << endl;

int a,b;
while(cin >> a >> b){
	try{
		if(b == 0) throw runtime_error("被除数为 0 啦");
		cout << a / b << endl;
	} catch (runtime_error err){
		cout << err.what() << "\n再输入新的数?y or n " << endl;
		char c; cin >> c;
		if(c == 'n') break;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值