练习5.15:说明下列循环的含义并改正其中的错误。
(a). for (int ix = 0; ix != sz; ++ix) {/*…*/}
if( ix != sz)
//…
答:错误原因,if中,ix只在for循环中有效
改正:
for (int ix = 0; ix != sz; ++ix) {
if( ix != sz)
//…
}
(b).
int ix;
for (ix != sz; ++x) {/*…*/}
答:错误原因,ix没有初始化。
改正:for (int ix = 0; ix != sz; ++x) {/*…*/}
(c).for (int ix = 0; ix != sz; ++ix, ++sz) {/*…*/}
答:sz没有明确定义,因此条件ix != sz可能一直成立,需要在语句里进行判断,将循环停止。
练习5.16:while循环特别适用于那种条件保持不变,反复执行操作的情况,例如,当未达到文件末尾时不断读取下一个值。For循环则更像是在按步骤迭代,它的索引值在某个范围内依次变化。根据每种循环的习惯用法各自编写一段程序,然后分别用另一种循环改写。如果只能用一种循环,你倾向于使用哪种呢?为什么?
答:如果只能一种循环,我更倾向于for循环,原因是,习惯了,按步骤迭代,跑一遍到底。
个人觉得用性格来形容的话,for更暴力一点,不管三七二十一,就是要跑到底,而while更理性一点,会不断检查。
程序见云盘程序练习5.16,简单的一个求和比较。
练习5.17:假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。为了实现这一目标,对于两个不等长的vector对象,只需挑出长度较短的那个,把它的所有元素和另一个vector对象比较即可。例如,如果两个vector对象的元素分别是0,1,1,2和0,1,1,2,3,5,8,则程序的返回结果为真。
答:见云盘程序练习5.17。
练习5.16
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
int sum2 = 0;
int i = 0;
for (i = 0; i != 10; ++i)
sum += i;
int j = 0;
while (j != 10)
{
sum2 += j;
++j;
}
cout << "For sum :" << sum << endl;
cout << "While sum :" << sum2 << endl;
return 0;
}
练习5.17
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int ivec1, ivec2;
vector<int> vec1;
vector<int> vec2;
while (cin >> ivec1 && ivec1 != 999) //输入999 结束
vec1.push_back(ivec1);
while (cin >> ivec2 && ivec2 != 999) //输入999 结束
vec2.push_back(ivec2);
decltype(vec1.size()) length = ( vec1.size() <= vec2.size() ? vec1.size() : vec2.size() );
//返回两者中,长度较短的那个
for (int i = 0; i != length; ++i)
{
if (vec1[i]==vec2[i])
cout << vec1[i] << " ";
else break; //未找到合适的循环停止
}
return 0;
}