您的位置:首页 > 编程语言 > C语言/C++

C++ primer(第五版) 练习 3.25 个人code 和疑问

2014-07-24 11:12 253 查看

C++ primer(第五版) 练习 3.25

题目:3.3.3节划分分数段的程序是使用下标运算符实现的,请利用迭代器改写该程序并实现完全相同的功能。

3.3.3节划分分数段的程序如下:

假设有一组成绩的集合,其中成绩的取值是从0到100。以10分为一个分数段,要求统计各个分数段各有多少个成绩。显然,从0到100

总共有101种可能的成绩取值,这些成绩分布在11个分数段上:每10个分数构成一个分数段,这样的分数段有10个,额外还有一个分数

段表示满分100分。这样第一个分数段将统计成绩在0到9之间的数量;第二个分数段将统计成绩在10-19之间的数量,以此类推。最后

一个分数段统计满分100分的数量。

书上给的输入如下:

42 65 95 100 39 67 95 76 88 76 83 92 76 93

输出:

0 0 0 1 1 0 2 3 2 4 1

书上的例代码为:

vector<unsigned> scores(11,0);

unsigned grade;

while(cin>>grade)

{

if(grade<=100)

++scores[grade/10];

}

疑问:用书上的代码很方便的就统计出来了,用迭代的方法,我写了一大堆代码实现的,如下答题部分的代码

反而不如原来的简单方便,还有就是也不知道我下面的代码算不算用迭代实现相同的功能。但愿有人看到这个

给初学者解个惑。

答:

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main()
{
vector<int> scores;
vector<unsigned> cnt(11, 0);
unsigned grade;

while (cin >> grade)
{
if (grade >= 0 && grade <= 100)
scores.push_back(grade);
}

auto b = scores.begin(), e = scores.end();

while (b!=e)
{
++cnt[*b / 10];
b++;
}

for (auto i : cnt)
cout << i << " ";

cout << endl;

return 0;
}


执行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: