学一门新的程序设计语言的最好方法就是不断地写代码。
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;
}
}