如何在C语言中统计数组元素出现次数?create_hist函数实现求助
嘿,别担心,刚入门编程碰到这种统计问题太正常啦!我来一步步帮你搞定这个create_hist()函数~
实现
create_hist()函数的详细指南 首先咱们再明确一遍需求,避免走偏:
我们要写一个函数,接收三个参数:
- 一个double类型的输入数组,元素值限定在0到16之间
- 一个int类型的整数,表示输入数组的元素总个数
- 一个大小为17的int类型输出数组,用来存储0-16每个数字的出现次数(数组的索引i,对应数字i的出现次数)
核心思路拆解
这个函数的逻辑其实很简单,分成两步就能搞定:
- 初始化输出数组:把输出数组的所有元素先设为0,不然初始的垃圾值会干扰统计结果
- 遍历输入数组统计次数:逐个检查输入数组的元素,把它对应到输出数组的索引位置,然后给该位置的计数加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
相关产品推荐
相关产品推荐

