C++primer第五版 假设有一组成绩的集合,其中成绩的取值是从0到100.以10分为一个分数段,要求统计各个分数段各有多少个成绩。要求使用下标和迭代器两种方法做。

显然,从0到10总共有101种可能的成绩取值,这些成绩分布在11个分数段上:每10个分数构成一个分数段,这样的分数段有10个,额外还有一个分数段表示满分100。这样一个分数段将统计成绩在0~9之间的数量,第二个分数段统计10~19之间的数量,以此类推,最后一个分数段统计满分100分的数量。 

具体实现时,可以使用一个含有11个元素的vector对象,每个元素分别用于统计各个分数段上出现的成绩个数。对于某个成绩来说,将其除以10就能得到对应的分数段索引。

处理数据和打印的时候,可以用下标进行遍历,也可以使用迭代器进行遍历。

以下是用下标的代码:

// primer_3_4_2.cpp : Defines the entry point for the application.
// 假设有一组成绩的集合,其中成绩的取值是从0到100.以10分为一个分数段,要求统计各个分数段各有多少个成绩。
// 要求使用下标和迭代器两种方法做
// 分为11组,0~9,10~19,20~29,...,90~99,100

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
	vector<int> vec(11,0); //初始化,建立11个初始值为0的vector容器vec
	//用下标方法
	int score;
	cout << "input the scores to test Subscripting Operator: (q to over)" << endl;
	while(cin >> score)  //读入数据
	{
		if(score>=0 && score<=100)  //保证输入的是合法数据
			vec[score/10]++;  //相应分数段计数加1
		else
			cout << "input illegal number!" << endl;  //输入明显错误数据时报错
	}
	cout << "use Subscripting Operator" << endl;
	//用下标输出
	for(int i=0;i<11;i++)
		cout << "the total number of level " << i+1 << " is: " << vec[i] << endl;
	system("pause");
	return 0;
}

效果如下: 

以下是用迭代器的代码:

// primer_3_4_2.cpp : Defines the entry point for the application.
// 假设有一组成绩的集合,其中成绩的取值是从0到100.以10分为一个分数段,要求统计各个分数段各有多少个成绩。
// 要求使用下标和迭代器两种方法做
// 分为11组,0~9,10~19,20~29,...,90~99,100

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
	vector<int> vec(11,0); //初始化,建立11个初始值为0的vector容器vec
	int *it=vec.begin();  //定义指针指向vec容器第一个元素
	//用迭代器方法
	int grade;
	cout << "input the scores to test iterator: (q to over)" << endl;
	while(cin >> grade)  //读入数据
	{
		if(grade>=0 && grade<=100)  //保证输入的是合法数据
			(*(it+grade/10))++;  //相应分数段计数加1
		else
			cout << "input illegal number!" << endl;  //输入明显错误数据时报错
	}
	cout << "use iterator" << endl; //提示语
	//用迭代器输出
	for(int j=0;j<11;j++)
		cout << "the total number of level " << j+1 << " is: " << *(it+j) << endl;
	system("pause");
	return 0;
}

效果如下: 

需要注意的是,回车键并不能结束while循环,必须输入与定义不同的数据类型才能结束循环。这里,我在提示语中加入了(q to over)提示用户如果成绩输入完成,则在最后添个‘q’,即可跳出while循环进入打印语句。当然,提示输入‘q’结束只是为了给用户一个明确的引导,其实输入其它非int类型的数据都能结束循环。

另外,书上给的迭代器的用法示例如下

auto it=vec.begin();

但是编译时会报错,在VC6.0下编译遇到的问题是,auto类型符是C++11的标准,VC6.0并不支持。因此在这里我将auto替换成了int,因为我是知道vec中的元素为int类型。同时,it前还应加上指针符号 *,即

int *it=vec.begin();

最后,我最初的设想是把两种方法合在一起,在主函数中使用两个while循环来先后读取一组数据,处理后并打印。即如下程序

// primer_3_4_2.cpp : Defines the entry point for the application.
// 假设有一组成绩的集合,其中成绩的取值是从0到100.以10分为一个分数段,要求统计各个分数段各有多少个成绩。
// 要求使用下标和迭代器两种方法做
// 分为11组,0~9,10~19,20~29,...,90~99,100

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
	vector<int> vec(11,0); //初始化,建立11个初始值为0的vector容器vec
	vector<int> vec2(11,0); //初始化,建立11个初始值为0的vector容器vec2
	//用下标方法
	int score;
	cout << "input the scores to test Subscripting Operator: (q to over)" << endl;
	while(cin >> score)  //读入数据
	{
		if(score>=0 && score<=100)  //保证输入的是合法数据
			vec[score/10]++;  //相应分数段计数加1
		else
			cout << "input illegal number!" << endl;  //输入明显错误数据时报错
	}
	cout << "use Subscripting Operator" << endl;
	//用下标输出
	for(int i=0;i<11;i++)
		cout << "the total number of level " << i+1 << " is: " << vec[i] << endl;

	//用迭代器方法
	int *it=vec2.begin();  //定义指针指向vec容器第一个元素
	int grade;
	cout << "input the scores to test iterator: (q to over)" << endl;
	while(cin >> grade)  //读入数据
	{
		if(grade>=0 && grade<=100)  //保证输入的是合法数据
			(*(it+grade/10))++;  //相应分数段计数加1
		else
			cout << "input illegal number!" << endl;  //输入明显错误数据时报错
	}
	cout << "use iterator" << endl; //提示语
	//用迭代器输出
	for(int j=0;j<11;j++)
		cout << "the total number of level " << j+1 << " is: " << *(it+j) << endl;
	system("pause");
	return 0;
}

然而因为对缓冲器的知识掌握得不好,没能成功实现。设想的是先输入一组数据,用下标的方式处理,再输入一组数据,用迭代的方式处理。但是结果却是:

我输入了一组数据之后,第二个while循环就进不去了,直接跳到while循环外面执行打印语句,所以可以看到,使用迭代器这种方法打印出的结果全为0。不过这个问题先放在此处,留到以后解决。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《C Primer第五》是一本经典的C语言教程。该书内容全面并深入浅出,在C语言初学者和进阶者中广受欢迎。 首先,该书从基础知识出发,逐步引导读者深入学习C语言。它详细介绍了C语言的语法规则、数据类型、运算符、流控制结构等基本概念,并通过丰富的示例和习题帮助读者巩固所学知识。 其次,该书注重实践与理论相结合。作者通过讲解实际示例和编写实用的程序,帮助读者理解C语言的应用场景和解决实际问题的方法。此外,书中还介绍了C标准库函数和常见编程技巧,使读者能够更好地运用C语言进行程序开发。 另外,该书特别强调了代码风格和程序设计的规范。它提供了许多编码规范和最佳实践,帮助读者养成良好的编码习惯。这对于初学者来说非常有价值,可以让他们在编程过程中少走弯路并提高代码的可读性和可维护性。 最后,该书还介绍了一些C语言的高级特性和进阶内容。读者可以从中了解到指针、结构体、内存管理、文件操作等高级主题。这对于有一定C语言基础的读者来说,是继续深入学习和提升技能的绝佳选择。 总的来说,《C Primer第五》是一本循序渐进、内容全面的C语言教材。它适合于C语言初学者入门学习,也适用于有一定基础的读者深入学习和提升技能。无论是作为学习教材还是参考书籍,该书都是值得推荐的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值