• 统计随机数出现个数与直方图显示的C实现


    要求

    统计一列0-9的随机数,打印每个数字出现的次数,并用直方图的形式显示。

    效果:

    实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 20
    #define R 10
    
    int a[N];
    
    void gen_random(int upper_bound)
    {
    	int i;
    	srand(time(NULL));
    	for(i=0;i<N;i++)
    		a[i] = rand() % upper_bound;
    }
    
    int howmany(int value)
    {
    	int count = 0, i;
    	for(i=0;i<N;i++)
    		if(a[i]==value)
    			++count;
    	return count;
    }
    
    int find_max(int p[])
    {
    	int i, temp;
    	for(i=1;i<R;i++)
    	{
    		if(p[0]<p[i])
    			p[0]=p[i];
    	}
    	return p[0];
    }
    
    int main(void)
    {
    	int i, j, max, histogram[R]={0};
    	gen_random(R);
    	//statistics
    	for(i=0;i<N;i++)
    	{
    		histogram[a[i]]++;
    	}
    	//raw data
    	printf("num	freq	
    ");
    	for(i=0;i<R;i++)
    	{
    		printf("%d	%d	
    ", i, histogram[i]);
    	}
    	//find the maximum
    	max = find_max(histogram);
    	//histogram
    	printf("
    random histogram: 
    ");
    	for(i=0;i<R;i++)
    		printf("%d	",i);
    	printf("
    ");
    	for(j=0;j<max;j++)
    	{
    		for(i=0;i<R;i++)
    		{
    			if(histogram[i]>0)
    			{
    				printf("*	");
    				histogram[i]--;
    			}else{
    				printf(" 	");
    			}
    		}
    		printf("
    ");
    	}
    	return  0;
    }
    

    问题

    实际效果是除了0的统计外,一切正常。而0的数字输出正常,直方图输出始终跟随最大值。

    debug了一会,始终找不出原因,所有功能都正常,结果却出错,很烦。

    解决

    吃了口饭,重新梳理了思路,发现我刚开始的思路有问题,已知范围的情况下没必要排序数组的最大值,于是注释掉最大值代码,解决。

    1. 不需要max来限定
    2. max排序算法重构了histogram数组,使得histogram[0]始终是最大值

    修改后的代码:Code

    小结

    1. 算法知识很重要,解决问题的破题之笔
    2. 刚开始实现比优化重要
    3. 享受debug过程,ease yourself

    效果

  • 相关阅读:
    常用颜色代码 (30种)
    C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
    如何: 通过HTML文档对象模型访问文档中的ActiveX控件的属性 .
    理解预编译头
    #ifndef用法总结 .
    C++中MessageBox()的详细用法
    如何用Javascript捕获ActiveX对象的事件
    ActiveX控件调用JavaScript函数的方法
    MFC Activex与JavaScript的接口交互
    include包含文件查找的顺序 .
  • 原文地址:https://www.cnblogs.com/vilogy/p/12631601.html
Copyright © 2020-2023  润新知