练习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;
}