练习5.4:
// iter指向nullptr,无效。
while (string::iterator iter != s.end()) { }
// 正确:
string::iterator iter = s.begin();
while (iter != s.end()) { }
// if语句不在while语句块中,所以status是无效的。
while (bool status = find(word)) { }
if (!status) { }
// 正确:
bool status;
while ((status = find(word))) {}
if (!status) {}
练习5.5:
#include#include #include using namespace std; int main() { const vector scores = { "F", "D", "C", "B", "A", "A+" }; unsigned grade = 0; string lettergrade; cout << "please input your grade:" << endl; while (cin >> grade) { if (grade < 60) lettergrade = scores[0]; else lettergrade = scores[(grade - 50) / 10]; cout << lettergrade << endl; } return 0; }
练习5.6:
#include#include #include using namespace std; int main() { const vector scores = { "F", "D", "C", "B", "A", "A+" }; unsigned grade = 0; string lettergrade; cout << "please input your grade:" << endl; while (cin >> grade) { lettergrade = (grade < 60) ? scores[0] : scores[(grade - 50) / 10]; 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)
int val;
if (ival = get_value())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0n";
// (c)
if (ival == 0)
ival = get_value();
练习5.8:
在c++中,else总是与前面最近的不匹配if配对。
练习5.9:
#includeusing namespace std; int main() { unsigned vowelCnt = 0; char c; while (cin >> c) { if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') ++vowelCnt; } cout << "Number of vowel are " << vowelCnt << endl; return 0; }
练习5.10:
#includeusing namespace std; int main() { unsigned vowelCnt = 0, aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, otherCnt = 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; default: ++otherCnt; break; } } vowelCnt = aCnt + eCnt + iCnt + oCnt + uCnt; cout << "vowelCnt = t" << vowelCnt << endl; cout << " aCnt = t" << aCnt << endl; cout << " eCnt = t" << eCnt << endl; cout << " iCnt = t" << iCnt << endl; cout << " oCnt = t" << oCnt << endl; cout << " uCnt = t" << uCnt << endl; cout << "otherCnt = t" << otherCnt << endl; return 0; }
练习5.11:
#includeusing namespace std; int main() { unsigned vowelCnt = 0, aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0, spaceCnt = 0, tableCnt = 0, newlineCnt = 0, otherCnt = 0; char ch; // cin 会过滤掉不可见字符(如 空格 回车,TAB 等) //不想略过空白字符,那就使用 noskipws 流控制 或 cin.get(ch) while (cin >> noskipws >> 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 't': ++tableCnt; break; case 'n': ++newlineCnt; break; default: ++otherCnt; break; } } vowelCnt = aCnt + eCnt + iCnt + oCnt + uCnt; cout << "vowelCnt = t" << vowelCnt << endl; cout << " aCnt = t" << aCnt << endl; cout << " eCnt = t" << eCnt << endl; cout << " iCnt = t" << iCnt << endl; cout << " oCnt = t" << oCnt << endl; cout << " uCnt = t" << uCnt << endl; cout << "spaceCnt = t" << spaceCnt << endl; cout << "tableCnt = t" << tableCnt << endl; cout << "newlineCnt = t" << newlineCnt << endl; cout << "otherCnt = t" << otherCnt << endl; return 0; }
练习5.12:
#includeusing namespace std; int main() { char cur_char, bef_char = ' '; unsigned vowelCnt = 0, aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0; unsigned spaceCnt = 0, tableCnt = 0, newlineCnt = 0; unsigned ffCnt = 0, flCnt = 0, fiCnt = 0; while (cin.get(cur_char)) { switch (cur_char) { case 'a': case 'A': ++aCnt; break; case 'e': case 'E': ++eCnt; break; case 'i': if (bef_char == 'f') { ++fiCnt; } case 'I': ++iCnt; break; case 'o': case 'O': ++oCnt; break; case 'u': case 'U': ++uCnt; break; case ' ': ++spaceCnt; break; case 't': ++tableCnt; break; case 'n': ++newlineCnt; break; case 'f': if (bef_char == 'f') { ++ffCnt; } break; case 'l': if (bef_char == 'f') { ++flCnt; } break; default: break; } bef_char = cur_char; //将当前的字符赋给bef_char,作为下次判断的依据 } vowelCnt = aCnt + eCnt + iCnt + oCnt + uCnt; cout << "vowelCnt = t" << vowelCnt << endl; cout << " aCnt = t" << aCnt << endl; cout << " eCnt = t" << eCnt << endl; cout << " iCnt = t" << iCnt << endl; cout << " oCnt = t" << oCnt << endl; cout << " uCnt = t" << uCnt << endl; cout << " ffCnt = t" << ffCnt << endl; cout << " flCnt = t" << flCnt << endl; cout << " fiCnt = t" << fiCnt << endl; cout << "spaceCnt = t" << spaceCnt << endl; cout << "tableCnt = t" << tableCnt << endl; cout << "newlineCnt = t" << newlineCnt << endl; return 0; }
练习5.13:
// (a) 应该有break语句
unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch) {
case 'a': aCnt++; break;
case 'e': eCnt++; break;
default: iouCnt++; break;
}
// (b) ix应该在外部定义
unsigned index = some_value();
int ix;
switch (index) {
case 1:
ix = get_value();
ivec[ix] = index;
break;
default:
ix = static_cast(ivec.size()) - 1;
ivec[ix] = index;
}
// (c) case语法错误
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 0:
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#include using namespace std; int main() { // 初始化前一个单词,输入的当前单词,重复出现最大次数的单词 string pre_word, cur_word, max_repeat_word; // 初始化重复出现次数,重复出现的最大次数 int repeat_times = 0, max_repeat_times = 0; while (cin >> cur_word) { if (cur_word == pre_word) ++repeat_times; else { pre_word = cur_word; repeat_times = 0; } if (max_repeat_times < repeat_times) { max_repeat_times = repeat_times; max_repeat_word = cur_word; } } if (!max_repeat_times) cout << "no word was repeated" << endl; else cout << "the word '" << max_repeat_word << "' repeatedly occurred " << max_repeat_times << " times" << endl; return 0; }
练习5.15:
// (a)
int ix;
for (ix = 0; ix != sz; ++ix) { }
if (ix != sz)
// . . .
// (b)
int ix;
for (; ix != sz; ++ix) { }
// (c)
for (int ix = 0; ix != sz; ++ix) { }
练习5.16:
// while 常用
int i;
while ( cin >> i )
// ...
// for改写
for (int i = 0; cin >> i;)
// ...
// for 常用
for (int i = 0; i != size; ++i)
// ...
// while改写
int i = 0;
while (i != size)
{
// ...
++i;
}
练习5.17:
#include#include using namespace std; bool is_subVec(vector vec1, vector vec2) { vector ::size_type min_size = vec1.size() < vec2.size() ? vec1.size() : vec2.size(); for (vector ::size_type i = 0; i != min_size; ++i) { if (vec1[i] != vec2[i]) return false; } return true; } int main() { vector vec1{ 0, 1, 1, 2 }; vector vec2{ 0, 1, 1, 2, 3, 5, 8 }; cout << is_subVec(vec1, vec2) << 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)
int ival;
do {
// . . .
} while (ival = get_response());
// (c)
int ival = get_response();
do {
ival = get_response();
} while (ival);
练习5.19:
#includeusing namespace std; int main() { do { cout << "please input two string object:" << endl; string str1, str2; cin >> str1 >> str2; cout << "The shorter is " << (str1.size() <= str2.size() ? str1 : str2) << endl; } while (cin); return 0; }
练习5.20:
#include#include using namespace std; int main() { string cur_str, bef_str; bool repeate_twice = false; while (cin >> cur_str) { if (cur_str == bef_str) { cout << cur_str << " occurs twice in succession." << endl; repeate_twice = true; break; } else bef_str = cur_str; } if (!repeate_twice) cout << "no word was repeated." << endl; return 0; }
练习5.21:
#include#include using namespace std; int main() { string cur_str, bef_str; bool repeate_twice = false; while (cin >> cur_str) { // 首字母不是大写退出当前迭代 if (!isupper(cur_str[0])) continue; if (cur_str == bef_str) { cout << cur_str << " occurs twice in succession." << endl; repeate_twice = true; break; } else bef_str = cur_str; } if (!repeate_twice) cout << "no word was repeated." << endl; return 0; }
练习5.22:
// 向后跳过已初始化的变量定义是可以的
begin:
int sz = get_size();
if (sz <= 0) {
goto begin;
}
for (int sz = get_size(); sz <=0; sz = get_size())
练习5.23:
#includeusing namespace std; int main() { int a, b; cout << "Enter two integers for division: " << endl; while (cin >> a >> b) cout << static_cast (a) / b << endl; return 0; }
练习5.24:
#include#include using namespace std; int main() { int a, b; cout << "Enter two integers for division: " << endl; while (cin >> a >> b) { if (b == 0) throw runtime_error("Integer division by zero."); cout << static_cast (a) / b << endl; cout << "Enter two integers for division: " << endl; } return 0; }
练习5.25:
#include#include using namespace std; int main() { int a, b; cout << "Enter two integers for division: " << endl; while (cin >> a >> b) { try { if (b == 0) throw runtime_error("Integer division by zero."); cout << static_cast (a) / b << endl; cout << "Enter two integers for division: " << endl; } catch (runtime_error err) { cout << err.what() << endl << "Try Again? Enter y or n" << endl; char c; cin >> c; if (!cin || c == 'n') break; } } return 0; }



