数据结构课设第七周 7-7

7-7 树种统计 (25分)

随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。

输入格式:

输入首先给出正整数N(≤10的五次幂​ ),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。

输出格式:

按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。

输入样例:

29
Red Alder
Ash
Aspen
Basswood
Ash
Beech
Yellow Birch
Ash
Cherry
Cottonwood
Ash
Cypress
Red Elm
Gum
Hackberry
White Oak
Hickory
Pecan
Hard Maple
White Oak
Soft Maple
Red Oak
Red Oak
White Oak
Poplan
Sassafras
Sycamore
Black Walnut
Willow

输出样例:

Ash 13.7931%
Aspen 3.4483%
Basswood 3.4483%
Beech 3.4483%
Black Walnut 3.4483%
Cherry 3.4483%
Cottonwood 3.4483%
Cypress 3.4483%
Gum 3.4483%
Hackberry 3.4483%
Hard Maple 3.4483%
Hickory 3.4483%
Pecan 3.4483%
Poplan 3.4483%
Red Alder 3.4483%
Red Elm 3.4483%
Red Oak 6.8966%
Sassafras 3.4483%
Soft Maple 3.4483%
Sycamore 3.4483%
White Oak 10.3448%
Willow 3.4483%
Yellow Birch 3.4483%

做这个题首先要知道C++ STL库中的map

容器重要属性

1、通过键值访问,而不是位置
2、按Key也就是键有序排列
3、键与值一 一对应
4、键唯一,不存在相同的键对应不同的值

涉及到的需要掌握的知识点

使用map要在前面加上头文件,#include
map的一些具体用法可以参照这篇文章
map<键Key类型,值类型> map名;就可以声明一个map
这个题就把树的名称作为键,出现次数作为值类型就很好解了
在解题过程中还涉及到了map::iterator it 的用法可以参考这篇文章,其实就是按键值顺序来访问输出的。
还有一个易错点就是C++中没有string类型 想用的话要声明头文件#include ,输出的时候要在后面加上.c_str()否则会报错
代码也比较简单。
就是声明头文件
定义需要的变量
依次读入
依次计算输出

#include 
#include 
#include 

using namespace std;

int main(){
	map T;
	int i;
	double N;
	string s;
	
	scanf("%lf", &N);
	getchar();
	for( i = 0 ; i < N ; i++){
		getline(cin, s);
		T[s]++;
	}
	
	map::iterator a;
	for(a = T.begin(); a != T.end(); a++){
		printf("%s %.4lf%%\n", (*a).first.c_str(), ((*a).second/N)*100);
	} 
	
	return 0;
}

哦对了 还有一个需要注意的点是 (*a).first——键,(*a).second——值
至于为什么 我现在也不知道

你可能感兴趣的:(数据结构课设)