要求
统计一列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了一会,始终找不出原因,所有功能都正常,结果却出错,很烦。
解决
吃了口饭,重新梳理了思路,发现我刚开始的思路有问题,已知范围的情况下没必要排序数组的最大值,于是注释掉最大值代码,解决。
- 不需要max来限定
- max排序算法重构了histogram数组,使得histogram[0]始终是最大值
修改后的代码:Code
小结
- 算法知识很重要,解决问题的破题之笔
- 刚开始实现比优化重要
- 享受debug过程,ease yourself