统计随机数出现个数与直方图显示的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\tfreq\t\n");
	for(i=0;i<R;i++)
	{
		printf("%d\t%d\t\n", i, histogram[i]);
	}
	//find the maximum
	max = find_max(histogram);
	//histogram
	printf("\nrandom histogram: \n");
	for(i=0;i<R;i++)
		printf("%d\t",i);
	printf("\n");
	for(j=0;j<max;j++)
	{
		for(i=0;i<R;i++)
		{
			if(histogram[i]>0)
			{
				printf("*\t");
				histogram[i]--;
			}else{
				printf(" \t");
			}
		}
		printf("\n");
	}
	return  0;
}

问题

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

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

解决

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

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

修改后的代码:Code

小结

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

效果

猜你喜欢

转载自www.cnblogs.com/vilogy/p/12631601.html
今日推荐