5.1
(1)由一个单独的分号构成的语句,叫做空语句。
(2)如果在程序的某个地方,语法上需要一条语句但逻辑上不需要,此时应该使用空 语句。
例如://重复读入数据直至到达文件末尾或某次输入的值等于 sought
while(cin >> s && s != sought)
; //空语句
注:使用空语句时,应该加上注释。从而令读这段代码的人知道该语句是有意省略
5.2 什么是块?什么时候会用到块?
(1)复合语句就是用花括号括起来的(可能为空)语句和声明的序列,复合语句又被称为块。
(2)在程序的某个地方,语法上需要一条语句但逻辑上需要许多条语句,则应该使用复合语句。
5.3
使用逗号运算符重写1.4.1节的while循环语句,使它不再需要块。
#include<iostream>
int main()
{
int sum = 0, val = 1;
//只要val的值小于等于10 ,while 循环就会持续进行
while (val <= 10)
sum += val, ++val;
std::cout << "Sum of 1 to 10 inclusive is"
<< sum << std::endl;
return 0;
}
改写之后的代码的可读性降低。
5.4
说明下列例子的含义,如果存在问题,试着修改
(1)
利用迭代器进行循环,遍历string 类型变量s包含的所有值 。
++iter,直到 iter == s.end()
while( sting::iterator iter != s.end())
{/*...*/}
(2)
该例子存在问题,status只能在相应的while语句块的内部可见,一旦语句结束,变量也就超出作用范围了。
<pre name="code" class="cpp"><pre name="code" class="cpp">while( bool status = find(word))
{/*...*/}
if( !status )
{/*...*/}
修改后的例子:
如果其他代码也需要访问控制变量,则变量必须定义在语句的外部。
bool status = 0;
while( status = find(word))
{/*...*/}
if( !status )
{/*...*/}
5.5
使用if else语句实现把数字成绩转换成字母成绩的要求:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int grade = 0; //数字成绩变量
string lettergrade; //字母成绩变量
cout << "输入成绩(整数):" << endl;
cin >> grade; //输入成绩
const vector<string> scores { "F", "D", "C", "B", "A", "A++" }; //scores保存string类型的对象
//如果成绩小于60 ,对应字母为F,而且不需要考虑添加加减符号的问题。否则执行 else语句。
if (grade < 60 )
{
lettergrade = scores[0];
}
else
{
lettergrade = scores[(grade - 50) / 10]; //先转换为字母成绩
if (grade != 100) //成绩小于100,执行
{
if ( grade % 10 > 7) //末尾是 8, 9 添加+
{
lettergrade += '+';
}
else if(grade % 10 < 3) //末尾是 0,1,2,添加-
{
lettergrade += '-';
}
}
}
cout << "lettergrade is " << lettergrade; //输出数字成绩相对应的字母成绩
return 0;
}
5.6
修改上一题, 用条件运算符代替 if else 语句
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int grade = 0;
string lettergrade;
const vector<string> scores{ "F", "D", "C", "B", "A", "A++" }; //scores保存string类型的对象
cout << "输入成绩(整数):" << endl;
cin >> grade; //输入成绩
if (grade >= 60) //成绩大于等于60,把数字成绩转换为字母成绩
{
lettergrade = scores[(grade - 50) / 10];
}
//使用条件运算符代替if else 语句
( (grade < 60) ? (lettergrade = scores[0]) : //成绩大于60 执行下一行
( (100 == grade) ? (lettergrade = scores[5]) : //成绩不等于100.执行下一行
( (grade % 10 > 7) ? (lettergrade += '+') : //末尾是 8, 9 添加+
( (grade % 10 < 3) ? (lettergrade += '-') : lettergrade //末尾是 0,1,2,添加-
)
)
)
);
cout << "lettergrade is " << lettergrade; //输出数字成绩相对应的字母成绩
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 (!val)
cout << "ival = 0 \n";
(d)if (ival = 0)
ival = get_value();
<span style="color:#ff0000;">//改正后的代码</span>
(a) if (ival1 != ival2)
ival1 = ival2;
else ival1 = ival2 = 0;
(b) if (ival < minval)
{
minval = ival;
occurs = 1;
}
(c) int ival;
if (ival = get_value())
cout << "ival = " << ival << endl;
if (!val)
cout << "ival = 0 \n";
(d)if (ival == 0)
ival = get_value();
5.8
什么是“悬垂else”?C++语言是如何处理else子句的?
(1)所谓“悬垂else”指的是 当一个语句包含的 if子句多余else子句时,各个else子句应该与哪个if子句匹配的问题。
(2)在C++中,规定else子句与离它最近的尚未匹配的if匹配,从而消除了程序的二义性。
5.9
#include <iostream>
#include<string>
using namespace std;
int main()
{
unsigned aeiouCnt = 0;
char ch = 0;
cout << "输入一段文本(以结束符号结尾):" << endl;
while (cin >> ch)
{
if ('a' == ch)
++aeiouCnt;
if ('e' == ch)
++aeiouCnt;
if ('i' == ch)
++aeiouCnt;
if ('o' == ch)
++aeiouCnt;
if ('u' == ch)
++aeiouCnt;
}
cout << "读入的文本中共有" << aeiouCnt << "元音字母" << endl;
return 0;
}
5.10
#include<iostream>
using namespace std;
int main()
{
char ch;
//初始化每个元音字母的计数器
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
//输入文本文件
while (cin >> ch) //ctrl+Z结束
{
//如果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;
default:
break;
}
}
cout << "Number of vowel a :\t" << aCnt << '\n'
<< "Number of vowel e :\t" << eCnt << '\n'
<< "Number of vowel i :\t" << iCnt << '\n'
<< "Number of vowel o :\t" << oCnt << '\n'
<< "Number of vowel u :\t" << uCnt << endl;
return 0;
}
5.11
#include<iostream>
using namespace std;
int main()
{
char ch;
//初始化每个元音字母的计数器
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,spaceCnt = 0,tabCnt = 0,newlineCnt = 0;
//输入文本文件
while (cin.get(ch)) //ctrl+Z结束
{
//如果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;
case ' ':
++spaceCnt;
break;
case'\n':
++newlineCnt;
break;
case'\t':
++tabCnt;
break;
default:
break;
}
}
cout << "Number of vowel a :\t" << aCnt << '\n'
<< "Number of vowel e :\t" << eCnt << '\n'
<< "Number of vowel i :\t" << iCnt << '\n'
<< "Number of vowel o :\t" << oCnt << '\n'
<< "Number of vowel u :\t" << uCnt << '\n'
<< "Number of space character :\t" << spaceCnt << '\n'
<< "Number of Tab character :\t" << tabCnt << '\n'
<< "Number of newline character :\t" << newlineCnt << endl;
return 0;
}
5.12
统计含有两个字符的字符序列的数量:ff,fl,fi.
#include<iostream>
using namespace std;
int main()
{
unsigned ffCnt = 0, flCnt = 0, fiCnt = 0; //将对应的计数器归零
char currCh, preCh = '\0'; //分别记录当前字符及前字符
while ( cin >> currCh)
{
if ('f' == preCh)
{
switch (currCh)
{
case 'f':
++ffCnt;
break;
case'l':
++flCnt;
break;
case'i':
++fiCnt;
break;
default:
break;
}
}
preCh = currCh; //将前字符 置为当前字符
}
cout << "Number of \"ff\": \t" << ffCnt << '\n'
<< "Number of \"fl\": \t" << flCnt << '\n'
<< "Number of \"fi\": \t" << fiCnt << endl;
return 0;
}
5.13
//改正后的代码
(a)unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch)
{
case'a':
aCnt++;
break;
case'e':
eCnt++;
break;
default :
iouCnt++;
}
(b)unsigned index = some_value();
int ix = 0;
switch (index)
{
case'1':
ix = get_value();
ivec[ix] = index;
break;
default:
ix = ivec.size() - 1;
ivec[ix] = index;
}
(c)
unsigned evenCnt = 0, oddCnt = 0;
int digit = get_num() % 10;
switch (digit)
{
case 1:
case 3:
case 5:
case 7:
case 9:
oddCnt++;
break;
case 2:
case 4:
case 6:
case 8:
case 10:
evenCnt++;
break;
}
(d)//case标号中的值只能使用常量表达式
const unsigned ival = 512, jval = 1024, kval = 4096;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch (swt)
{
case ival:
bufsize = ival * sizeof(int);
break;
case jval:
bufsize = jval * sizeof(int);
break;
case kval:
bufsize = kval * sizeof(int);
break;
}
5.14
#include<iostream>
#include<string >
using namespace std;
int main()
{
string currWord, preWord; //当前输入的单词以及前一单词
string repWord; //重复次数最多的单词
int currCnt = 0, maxCnt = 1; //当前单词重复次数以及重复次数最多的值
cout << "Enter some words :(Ctrl +Z to end)" << endl;
while (cin >>currWord)
{
if (currWord == preWord) //当前单词重复出现
{
++currCnt;
}
else
{
if (currCnt> maxCnt)
{
maxCnt = currCnt;
repWord = preWord;
}
currCnt = 1;
}
preWord = currWord; //修改对前一单词的记录
}
if (maxCnt != 1) //有单词重复
cout << '"' << repWord << '"'
<< "repeated for" << maxCnt
<< "times" << endl;
else
cout << "There is no repeated word" << endl;
return 0;
}
5.15
修改后的代码:
(a) int ix = 0;
for(ix = 0; ix !=sz; ++ix) {/*....*/}
if(ix != sz)
//.......
(b)
int ix;
for( ix = 0; ix != sz ;++ix) {/*.....*/}
(c) 当sz初始值大于零时,这将是一个死循环
5.16
若有如下定义:
const size_t size = 100;
int ia[size];
下面三个程序段等价:
//程序段1
size_t ix = 0;
while(ix != size)
{
/*......*/ //对ia的元素进行处理
++ix;
}
//程序段2
for(size_t ix = 0; ix != size; ++ix)
{
/*......*/ //对ia的元素进行处理
}
//程序段3
size_t ix = 0;
do {
/*......*/ //对ia的元素进行处理
++ix;
}while(ix != size);
如果只用一种循环编写程序,更愿意用for 结构
因为for结构的形式最为简洁灵活。
5.17
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> ivec1;
vector<int> ivec2;
int ival;
cout << "Enter elements for the first vector :(32767 to end)"
<< endl;
cin >> ival;
while (ival != 32767)
{
ivec1.push_back(ival);
cin >> ival;
}
cout << "Enter elements for the second vector :(32767 to end)"
<< endl;
cin >> ival;
while (ival != 32767)
{
ivec2.push_back(ival);
cin >> ival;
}
vector<int>::size_type size1, size2;
size1 = ivec1.size();
size2 = ivec2.size();
bool result = true;
for (vector<int>::size_type ix = 0;
ix != (size1 > size2 ? size2 : size1); ++ix)
if (ivec1[ix] != ivec2[ix])
{
result = false;
break;
}
if (result)
{
if (size1 < size2)
{
cout << "The first vector is prefix of the second one."
<< endl;
}
else if (size1 == size2)
cout << "Two vectors are equal." << endl;
else
cout << "The second vector is prefix of the first one."
<< endl;
}
else
cout << "No vector is prefix of the other one" << endl;
return 0;
}
5.18
//(a)每次循环读入两个整数,输出它们的和。
// 循环有错误:循环应该用一对花括号括住。
// 改为:
do
{
int v1, v2;
cout << "Please enter two numbers to sum :";
if (cin >> v1 >> v2)
cout << "Sum is: " << v1 + v2 << endl;
} while (cin);
/*(b)当get_response 函数返回真值时执行循环体。
此循环有误:do while循环的条件中不能定义变量。
改为:*/
int ival
do
{
ival = get_response();
} while (ival);
/*(c)当get_response 函数返回真值时执行循环体。*/
int ival
do
{
ival = get_response();
} while (ival);
5.19
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1, s2,s3; //定义三个字符串变量
do
{
cout << "Enter two strings:" << endl;
cin >> s1 >> s2; //输入字符串
if (s1.size() > s2.size()) //比较字符串的大小
{
cout << s1 << "is longer than " << s2 << endl;
}
else if (s1.size() < s2.size())
{
cout << s1 << "is smaller than " << s2 << endl;
}
else
cout << "Two strings are equal." << endl;
cout << "continue?(yes or no)" << endl; //选择是否继续循环
cin >> s3;
} while (s3[0] != 'n' && s3[0] != 'N'); //判断条件
return 0;
}
5.20
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1;
bool s = false;
cout << "输入一个字符串:" << endl;
cin >> s1; //输入一个字符串
string::size_type index = 0; //字符串的下标,从零开始
while ( index != s1.size()) //遍历字符串中的每个字符,直到字符串结束
{
if (s1[index] == s1[index + 1]) //如果有连续重复的字母,执行下面代码
{
cout << "\"" << s1[index] << "\"" << "连续重复出现" << endl;
s = true; //标记是否有重复出现的字母
break; //如果有重复出现的字母,跳出while循环语句。
}
else
++index; //下标加一
}
if (false == s) //如果标记没有,输出相应的代码
{
cout << "没有任何单词是连续重复出现的" << endl;
}
return 0;
}
5.23
#include<iostream>
using namespace std;
int main()
{
int num1, num2,result;
cin >> num1 >> num2;
result = num1 / num2;
cout << "结果是: " << result << endl;
return 0;
}
5.24
#include<iostream>
using namespace std;
int main()
{
int num1, num2, result;
cin >> num1 >> num2;
if (0 == num2)
{
throw runtime_error("分母不能为0");
}
result = num1 / num2;
cout << "结果是: " << result << endl;
return 0;
}
5.25
#include<iostream>
using namespace std;
int main()
{
int num1, num2, result;
while (cin >> num1 >> num2)
{
try
{
if (num2 == 0)
{
throw runtime_error("分母不能为零");
}
}
catch (runtime_error err)
{
cout << err.what()
<< "\nTry Agin? Enter y or n " << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;
}
}
result = num1 / num2;
cout << "结果是: " << result << endl;
return 0;
}