第五章 语句
5.1
空语句:只含有一个单独的分号的语句。
用到空语句的情况:当循环的全部工作在条件部分就可以完成时,我们通常会用到空语句。
5.2
块:复合语句的别称,指用花括号括起来的(可能为空的)语句和声明的序列。
用到块的情况:在程序的某个地方,语法上需要一条语句,但是逻辑上需要多条语句时,就用块将多条语句括起来。
5.3
while (val <= 10) sum += val, val++;
代码的可读性降低了!
5.4
(a):迭代器应在外部创建并初始化
(b):if语句条件中的status变量没定义过
5.5
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 char gradeToLevel(int n) 15 { 16 if (n >= 95) return 'A'; 17 else if (n >= 85) return 'B'; 18 else if (n >= 75) return 'C'; 19 else if (n >= 60) return 'D'; 20 else return 'E'; 21 } 22 23 int main() 24 { 25 int grade; 26 cin >> grade; 27 char level = gradeToLevel(grade); 28 cout << level << endl; 29 return 0; 30 }
5.6
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 char gradeToLevel(int n) 15 { 16 return (n >= 95) ? 'A' : (n >= 85) ? 'B' : (n >= 75) ? 'C' : (n >= 60) ? 'D' : 'E'; 17 } 18 19 int main() 20 { 21 int grade; 22 cin >> grade; 23 char level = gradeToLevel(grade); 24 cout << level << endl; 25 return 0; 26 }
5.8
悬垂else:if分支多余else分支时,怎么知道某个else是和哪个if匹配的。
C++处理else子句:规定else与离它最近的且尚未匹配的if匹配。
5.9
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 char ch; 17 int vowelCnt = 0; 18 while (cin >> ch) { 19 if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') 20 vowelCnt++; 21 } 22 cout << vowelCnt << endl; 23 return 0; 24 }
5.10
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 char ch; 17 int vowelCnt = 0; 18 while (cin >> ch) { 19 switch (ch) { 20 case 'a': 21 case 'e': 22 case 'i': 23 case 'o': 24 case 'u': 25 case 'A': 26 case 'E': 27 case 'I': 28 case 'O': 29 case 'U': 30 vowelCnt++; 31 break; 32 } 33 } 34 cout << vowelCnt << endl; 35 return 0; 36 }
5.11
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 void main() 6 { 7 char cval; 8 int char_a = 0,char_e = 0,char_i = 0,char_o = 0,char_u = 0,sum_space = 0,sum_table = 0,sum_newline = 0; 9 while (cin >> std::noskipws >> cval) // 此处的std::noskipws表示的是不忽略任何地方的空白(包括制表符和空格等) 10 { 11 switch (cval) 12 { 13 case 'a': 14 case 'A': 15 ++char_a; 16 break; 17 case 'e': 18 case 'E': 19 ++char_e; 20 break; 21 case 'i': 22 case 'I': 23 ++char_i; 24 break; 25 case 'o': 26 case 'O': 27 ++char_o; 28 break; 29 case 'u': 30 case 'U': 31 ++char_u; 32 break; 33 case ' ': 34 ++sum_space; 35 break; 36 case '\t': 37 ++sum_table; 38 break; 39 case '\n': 40 ++sum_newline; 41 break; 42 } 43 } 44 cout<<"元音字母a的个数为:"<<char_a<<endl; 45 cout<<"元音字母e的个数为:"<<char_e<<endl; 46 cout<<"元音字母i的个数为:"<<char_i<<endl; 47 cout<<"元音字母o的个数为:"<<char_o<<endl; 48 cout<<"元音字母u的个数为:"<<char_u<<endl; 49 cout<<"空格的个数为:"<<sum_space<<endl; 50 cout<<"制表符的个数为:"<<sum_table<<endl; 51 cout<<"换行符的个数为:"<<sum_newline<<endl; 52 }
5.12
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 void main() 6 { 7 char cval, char_before = '\0'; //计算机中的0值表示的为'\0',可防止它的初始值(随机的)碰巧是某个字符的值. 8 int char_a = 0, char_e = 0, char_i = 0, char_o = 0, char_u = 0, sum_space = 0, sum_table = 0, sum_newline = 0, 9 sum_ff = 0, sum_fl = 0, sum_fi = 0; 10 while (cin >> std::noskipws >> cval) // 此处的std::noskipws表示的是不忽略任何地方的空白(包括制表符和空格等) 11 { 12 switch (cval) 13 { 14 case 'a': 15 case 'A': 16 ++char_a; 17 break; 18 case 'e': 19 case 'E': 20 ++char_e; 21 break; 22 case 'i': 23 if (char_before == 'f') 24 { 25 ++sum_fi; 26 } 27 case 'I': 28 ++char_i; 29 break; 30 case 'o': 31 case 'O': 32 ++char_o; 33 break; 34 case 'u': 35 case 'U': 36 ++char_u; 37 break; 38 case ' ': 39 ++sum_space; 40 break; 41 case '\t': 42 ++sum_table; 43 break; 44 case '\n': 45 ++sum_newline; 46 break; 47 case 'f': 48 if (char_before == 'f') 49 { 50 ++sum_ff; 51 } 52 break; 53 case 'l': 54 if (char_before == 'f') 55 { 56 ++sum_fl; 57 } 58 break; 59 } 60 char_before = cval;//将当前的字符赋给char_before,作为下次判断的依据 61 //如果下次判断中char_before为f字符,那么只要再判断当前字符是否为f、l、i即可 62 } 63 cout<<"元音字母a的个数为:"<<char_a<<endl; 64 cout<<"元音字母e的个数为:"<<char_e<<endl; 65 cout<<"元音字母i的个数为:"<<char_i<<endl; 66 cout<<"元音字母o的个数为:"<<char_o<<endl; 67 cout<<"元音字母u的个数为:"<<char_u<<endl; 68 cout<<"空格的个数为:"<<sum_space<<endl; 69 cout<<"制表符的个数为:"<<sum_table<<endl; 70 cout<<"换行符的个数为:"<<sum_newline<<endl; 71 cout<<"字符序列ff的个数为:"<<sum_ff<<endl; 72 cout<<"字符序列fl的个数为:"<<sum_fl<<endl; 73 cout<<"字符序列fi的个数为:"<<sum_fi<<endl; 74 }
5.14
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 int cnt = 1, maxCnt = 0; 17 string ss, s1, s2; 18 while (cin >> ss) { 19 if (ss == s1) { 20 cnt++; 21 } 22 else { 23 cnt = 1; 24 } 25 if (cnt > maxCnt) { 26 s2 = ss; 27 maxCnt = cnt; 28 } 29 s1 = ss; 30 } 31 if (maxCnt > 1) 32 cout << s2 << "连续出现了"<< maxCnt << "次。" << endl; 33 else cout << "任何单词都没有连续出现过。" << endl; 34 return 0; 35 }
5.17
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 vector<int> a1 = {1, 2, 3, 4, 5, 6}; 17 vector<int> a2 = {1, 2, 3, 4,}; 18 int flag = 0; 19 int minNum = (a1.size() > a2.size() ? a2.size() : a1.size()); 20 for (int i = 0; i < minNum; i++) { 21 if (a1[i] != a2[i]) { 22 cout << "No!" << endl; 23 flag = 1; 24 break; 25 } 26 } 27 if (!flag) cout << "Yes!" << endl; 28 return 0; 29 }
5.19
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 string s1, s2; 17 do { 18 cout << "输入两个string对象:"; 19 cin >> s1 >> s2; 20 cout << (s1.size() > s2.size() ? s2 : s1) << endl; 21 } while (cin); //这个条件我服 22 return 0; 23 }
5.20
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 int flag = 0; 17 string s1, s2; 18 while (cin >> s1) { 19 if (s1 == s2) { 20 cout << s1 << endl; 21 flag = 1; 22 break; 23 } 24 s2 = s1; 25 } 26 if (!flag) cout << "没有任何单词是连续重复出现的!" << endl; 27 return 0; 28 }
5.21
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <string> 6 #include <cstring> 7 8 using std::cin; 9 using std::cout; 10 using std::endl; 11 using std::vector; 12 using std::string; 13 14 int main() 15 { 16 int flag = 0; 17 string s1, s2; 18 while (cin >> s1) { 19 if (s1 == s2) { 20 if(s1[0] >= 'A' && s1[0] <= 'Z') { 21 cout << s1 << endl; 22 flag = 1; 23 break; 24 } 25 continue; 26 } 27 s2 = s1; 28 } 29 if (!flag) cout << "没有任何单词是连续重复出现的!" << endl; 30 return 0; 31 }
5.22
int sz; while ((sz = get_size()) <= 0) ;
5.24
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <stdexcept> 6 #include <string> 7 #include <cstring> 8 9 using std::cin; 10 using std::cout; 11 using std::endl; 12 using std::vector; 13 using std::string; 14 15 int main() 16 { 17 int a, b; 18 cin >> a >> b; 19 if (!b) { 20 throw std::runtime_error("除数不能为0!"); 21 } 22 cout << a / b << endl; 23 return 0; 24 }
发生:
5.25
#include <iostream> #include <vector> #include <cctype> #include <iterator> #include <stdexcept> #include <string> #include <cstring> using std::cin; using std::cout; using std::endl; using std::vector; using std::string; using std::runtime_error; int main() { int a, b; reinput: cin >> a >> b; //带标签语句,作为goto的目标 try { if (!b) { throw runtime_error("除数不能为0!"); } cout << a / b << endl; } //err是runtime_error类的一个实例 catch (runtime_error err) { cout << err.what(); //what是runtime_error类中的成员函数 cout << "\n是否需要重新输入? Enter y or n:" << endl; char ch; cin >> ch; if (ch == 'n') cout << "bye!\n"; else goto reinput; //reinput是用于标识一条语句的标识符 } return 0; }