You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中统计数组元素出现次数?create_hist函数实现求助

嘿,别担心,刚入门编程碰到这种统计问题太正常啦!我来一步步帮你搞定这个create_hist()函数~

实现create_hist()函数的详细指南

首先咱们再明确一遍需求,避免走偏:
我们要写一个函数,接收三个参数:

  • 一个double类型的输入数组,元素值限定在0到16之间
  • 一个int类型的整数,表示输入数组的元素总个数
  • 一个大小为17的int类型输出数组,用来存储0-16每个数字的出现次数(数组的索引i,对应数字i的出现次数)

核心思路拆解

这个函数的逻辑其实很简单,分成两步就能搞定:

  1. 初始化输出数组:把输出数组的所有元素先设为0,不然初始的垃圾值会干扰统计结果
  2. 遍历输入数组统计次数:逐个检查输入数组的元素,把它对应到输出数组的索引位置,然后给该位置的计数加1

⚠️ 小提醒:因为输入是double类型,直接强制转int可能会有精度问题(比如2.999999999会被转成2,但实际应该算3),所以最好用四舍五入来处理。

完整代码示例(以C语言为例,最常见的入门场景)

#include <stdio.h>
#include <math.h> // 用到round函数需要这个头文件

void create_hist(double input[], int input_size, int output[]) {
    // 第一步:把输出数组全部初始化为0
    for (int i = 0; i < 17; i++) {
        output[i] = 0;
    }

    // 第二步:遍历输入数组,统计每个数字的出现次数
    for (int i = 0; i < input_size; i++) {
        double current_num = input[i];
        // 用round处理精度问题,把double转成最接近的整数索引
        int index = (int)round(current_num);
        // 防御性检查:确保索引在0-16范围内(避免题目外的异常值导致越界)
        if (index >= 0 && index <= 16) {
            output[index]++;
        }
    }
}

// 测试一下这个函数是否正常工作
int main() {
    double test_input[] = {0.0, 2.0, 2.0, 5.0, 16.0, 3.0, 5.0, 5.0};
    int input_size = sizeof(test_input) / sizeof(test_input[0]);
    int test_output[17] = {0};

    create_hist(test_input, input_size, test_output);

    // 打印统计结果
    for (int i = 0; i < 17; i++) {
        printf("数字%d出现了%d次\n", i, test_output[i]);
    }

    return 0;
}

代码细节解释

  • 初始化输出数组:用循环把17个元素全部置0,保证统计从0开始计数
  • 处理double精度:round()函数会把接近整数的double值转成对应的整数,比如3.0000001和2.9999999都会被转成3,避免精度误差导致统计错误
  • 防御性检查:虽然题目说输入元素在0-16范围内,但加上索引范围判断,可以避免异常值导致数组越界崩溃

如果是用Python实现,思路完全一致,代码会更简洁:

def create_hist(input_arr, input_size, output_arr):
    # 初始化输出数组为0
    for i in range(17):
        output_arr[i] = 0
    # 遍历输入数组统计次数
    for num in input_arr[:input_size]:
        index = round(num)
        if 0 <= index <= 16:
            output_arr[index] += 1

# 测试函数
test_input = [0.0, 2.0, 2.0, 5.0, 16.0, 3.0, 5.0, 5.0]
test_output = [0]*17
create_hist(test_input, len(test_input), test_output)
for i in range(17):
    print(f"数字{i}出现了{test_output[i]}次")

新手容易踩的坑

  • 忘记初始化输出数组:如果输出数组一开始有随机垃圾值,统计出来的次数会直接加上这些值,结果完全错误
  • 忽略double精度问题:直接用(int)current_num强制转换,会把2.999999转成2,导致统计偏差
  • 忽略索引越界:如果输入了超出0-16的元素,直接访问输出数组会导致程序崩溃,加上范围判断更安全

内容的提问来源于stack exchange,提问作者david_10001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:27:52