7-24 树种统计

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

输入格式:

输入首先给出正整数N(≤10
5),随后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%

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int main(){
    int n;
    map<string , int>f;
    cin>>n;
    getchar();
    for(int i = 1 ; i <= n ; i++){
        char s[35];
        cin.getline(s , 35);
        f[s]++;
    }
    map<string , int>::iterator it;
    for(it = f.begin() ; it != f.end() ; it++){
        cout<<it->first<<" ";
        printf("%0.4f%%\n" , it->second * 1.0 / n * 100);
    }
}

### 使用C语言实现树种统计 在C语言中,可以通过定义二叉树的数据结构并利用遍历来完成树种统计。以下是基于前序遍历方式的一个具体实现方案。 #### 1. 数据结构定义 为了便于操作,可以采用指针的方式来构建二叉树节点。每个节点包含三个部分:`data`用于存储当前节点的信息(这里假设为字符型),以及两个指向左右子树的指针 `leftChild` 和 `rightChild`[^3]。 ```c typedef struct TreeNode { char data; struct TreeNode* leftChild; struct TreeNode* rightChild; } TreeNode; ``` #### 2. 创建二叉树 通过递归函数来创建二叉树。用户按照前序遍历的方式输入数据,遇到特定符号(如空格 `' '` 或者特殊标记)时表示该位置为空节点[^3]。 ```c void createBinaryTree(TreeNode** root) { char ch; scanf(" %c", &ch); if (ch == ' ') { // 如果读取到' ', 表示此节点为空 *root = NULL; } else { *root = (TreeNode*)malloc(sizeof(TreeNode)); (*root)->data = ch; // 继续创建左子树和右子树 createBinaryTree(&(*root)->leftChild); createBinaryTree(&(*root)->rightChild); } } ``` #### 3. 树种统计逻辑 设计一个辅助函数用来记录每种类型的节点数量。可以使用数组或者哈希表作为计数器,在本例中简化处理,直接打印各节点及其出现次数。 ```c #include <ctype.h> // 假设只考虑字母A-Z之间的种类统计 #define MAX_TREE_TYPES ('Z' - 'A' + 1) int countTypes[MAX_TREE_TYPES]; // 记录不同树种的数量 void resetCounters() { memset(countTypes, 0, sizeof(int) * MAX_TREE_TYPES); } void updateCounter(char type) { if (isupper(type)) { countTypes[type - 'A']++; } } void traverseAndCount(TreeNode* node) { if (!node) return; // 更新对应的树种计数 updateCounter(node->data); // 对左右子树分别进行遍历 traverseAndCount(node->leftChild); traverseAndCount(node->rightChild); } ``` #### 4. 主程序流程控制 最后编写主函数调用以上功能模块,并展示最终的结果。 ```c void displayResults() { printf("\nTree species statistics:\n"); for (char i = 'A'; i <= 'Z'; ++i) { if (countTypes[i - 'A']) { printf("%c : %d times\n", i, countTypes[i - 'A']); } } } int main() { TreeNode* root = NULL; resetCounters(); printf("Please input the binary tree nodes following Preorder Traversal rules.\n" "(Use space to represent a null child):\n"); createBinaryTree(&root); // 构建二叉树 traverseAndCount(root); // 遍历并统计各类树种数目 displayResults(); // 输出统计数据 return 0; } ``` 这样就完成了整个过程的设计与编码工作。这段代码能够接收用户的输入建立相应的二叉树模型,接着依据设定好的规则计算各个类别下的成员频率,并清晰地呈现出来给使用者查看。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值