学习目标:
语句
学习内容:
1.简单语句
2.语句作用域
3.条件语句
4.迭代语句
5.跳转语句
6.try语句块和异常处理
习题答案:
5.1
一个分号构成的语句,语法上需要一条语句逻辑上不需要,一种常见的情况是,当循环的全部工作在条件部分就可以完成时。
5.2
用花括号括起来的语句和声明序列,语法上需要一条语句逻辑上需要多条语句。
5.3
#include <iostream>
int main()
{
int sum = 0, val = 1;
while (val <= 10)
sum += val, ++val;
std::cout << sum << " ";
}
更不易于阅读
5.4
std::string::iterator iter = s.begin()
while (iter != s.end()) {/*...*/}
bool status;
while (status = find(word)) {/*...*/}
if (!status) {/*...*/}
5.5
#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
int main()
{
vector<string> vs = { "F","D","C","B","A","A++" };
int cre = 0;
while (std::cin >> cre) {
string let;
if (cre < 60)
let = vs[0];
else {
let = vs[(cre - 50) / 10];
if (cre != 100) {
if (cre % 10 > 7)
let += '+';
else if (cre % 10 < 3)
let += '-';
}
}
std::cout << let;
}
return 0;
}
5.6
#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;
int main()
{
vector<string> vs = { "F","D","C","B","A","A++" };
int cre{ 0 };
while (cin >> cre) {
string let = cre < 60 ? let[0] : let[(cre - 50) / 10];
let +=
(cre == 100 || cre < 60)
? ""
: (cre % 10 > 7) ? "+" : (cre % 10 < 3) ? "-" : "";
std::cout << let;
}
return 0;
}
5.7
(1)
if (ival1 != ival2)
ival1 = ival2;
else ival1 = ival2 = 0;
(2)
if (ival < minval){
minval = ival;
occurs = 1;
}
(3)
int ival;
if (ival = get_ivalue())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0\n";
(4)
if (ival == 0)
ival = get_value();
5.8
当一个if语句嵌套在另一个if语句内部时,很可能if分支会多于else分支,这时候我们我们怎么知道某个给定的else是和哪个if匹配呢。这个问题通常称作悬垂else。
就C++而言,它规定else与它最近的尚未匹配的if匹配,从而消除了程序的二义性。
5.9
#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;
int main()
{
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0;
char ca;
while (cin >> ca)
{
if (ca == 'a')
++aCnt;
else if (ca == 'e')
++aCnt;
else if (ca == 'i')
++iCnt;
else if (ca == 'o')
++oCnt;
}
std::cout << "aCnt:\t" << aCnt << '\n'
<< "eCnt:\t" << eCnt << '\n'
<< "iCnt:\t" << iCnt << '\n'
<< "oCnt:\t" << oCnt << '\n';
}
5.10
#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;
int main()
{
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0;
char ca;
while (cin >> ca) {
switch (ca) {
case 'a':
case 'A':
++aCnt;
break;
case 'e':
case 'E':
++eCnt;
break;
case 'i':
case 'I':
++iCnt;
break;
case 'o':
case 'O':
++oCnt;
break;
}
}
std::cout << "aCnt:\t" << aCnt << '\n'
<< "eCnt:\t" << eCnt << '\n'
<< "iCnt:\t" << iCnt << '\n'
<< "oCnt:\t" << oCnt << '\n';
}
5.11
#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;
int main()
{
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, lineCnt = 0, tabCnt = 0;
char ca;
while (cin >> std::noskipws >> ca){
switch (ca) {
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 '\v':
case '\t':
++tabCnt;
break;
case '\n':
++lineCnt;
break;
}
}
std::cout << "aCnt:\t" << aCnt << '\n'
<< "eCnt:\t" << eCnt << '\n'
<< "iCnt:\t" << iCnt << '\n'
<< "oCnt:\t" << oCnt << '\n'
<< "tabCnt:\t" << tabCnt << '\n'
<< "lineCnt:\t" << lineCnt << '\n';
}
5.12
#include<iostream>
#include<string>
#include<vector>
using std::vector; using std::string;
using std::cin;
int main()
{
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, lineCnt = 0, tabCnt = 0,
ffCnt = 0, flCnt = 0, fiCnt = 0;
char ca;
char praca;
while (cin >> std::noskipws >> ca){
switch (ca) {
case 'a':
case 'A':
++aCnt;
break;
case 'e':
case 'E':
++eCnt;
break;
case 'i':
case 'I':
++iCnt;
if (praca == 'f') ++fiCnt;
break;
case 'o':
case 'O':
++oCnt;
break;
case '\v':
case '\t':
++tabCnt;
break;
case '\n':
++lineCnt;
break;
case 'f':
if (praca == 'f') ++ffCnt;
break;
case 'l':
if (praca == 'f') ++flCnt;
break;
}
praca = ca;
}
std::cout << "aCnt:\t" << aCnt << '\n'
<< "eCnt:\t" << eCnt << '\n'
<< "iCnt:\t" << iCnt << '\n'
<< "oCnt:\t" << oCnt << '\n'
<< "tabCnt:\t" << tabCnt << '\n'
<< "lineCnt:\t" << lineCnt << '\n'
<< "ffCnt:\t" << ffCnt << '\n'
<< "flCnt:\t" << flCnt << '\n'
<< "fiCnt:\t" << fiCnt << '\n';
}
5.13
(1)加上break
(2)case 1可能被忽略,defualt又用到了ix,所以把ix定义在switch case之外。
(3)Switch case不合法
(4)case标签不是一个常量
5.14
呜呜呜
5.15
(1)for循环头定义的对象只有在循环体内部可见
int ix;
for (ix = 0; ix != sz; ++ix) { /*...*/}
if (ix != sz)
(2)如果初始换部分是空的也应该填入一个分号
int ix
for (/*空语句*/; ix != sz; ++ix){ /*...*/}
(3)
sz初始值是0,循环一次都不执行。sz不是0,如果循环体不终止循环就会一直执行下去
for (int ix = 0; ix != sz; ++ix) {/*...*/}
5.16
int ix;
while (cin >> ix)
for (int ix; cin >> ix;)
正如所说各有优劣
5.17
暂缓
5.18
(a)添加花括号
do
{
int v1, v2;
cout << "Please enter two numbrrs to sum:";
if (cin >> v1 >> v2)
cout << "sum is: " << v1 + v2 << endl;
}
while (cin);
(b)变量定义要在循环体外
int ival;
do {
ival = get_response());
} while (ival);
(c)变量定义要在循环体外
int ival;
do {
ival = get_response());
} while (ival);
5.19
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
int main()
{
string s1, s2;
do {
cin >> s1 >> s2;
s1.size() > s2.size() ? cout << s2 : cout << s1;
} while (cin);
return 0;
}
5.20
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
int main()
{
string s1, s2, s3;
while (cin >> s1)
{
if (s1 == s2)
{
s3 = s1;
cout << s3 << endl;
break;
}
s2 = s1;
if (s3.empty())
{
cout << "no" << endl;
}
}
return 0;
}
5.21
string s1, s2, s3;
while (cin >> s1)
{
if (!supper(s1[0])) continue;
if (s1 == s2)
{
s3 = s1;
cout << s3 << endl;
break;
}
s2 = s1;
if (s3.empty())
{
cout << "no" << endl;
}
}```
5.22
```css
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
int main()
{
int sz;
do {
sz = get_size();
} while (sz <= 0);
return 0;
}