先奉上效果图:
数组a[10]统计0~9每个数字出现的频率
我们要显示这样的直方图统计数字出现的频率
x x
x x x x
0 1 2 3
要打印出垂直的直方图,从上往下,从出现次数最多的元素开始打印。
统计出现次数最多的数,相应出现次数为n,满足出现次数为n的打印’*’,不满足的打印空格;然后让n-1,再统计出现次数为n-1的元素进行判断和打印,直到n=0时结束。
#include<stdio.h>
int max(int *a) //返回数组中的最大值
{
int i,n=a[0];
for(i=0;i<10;i++)
{
if(n<a[i]) n=a[i];
}
return n;
}
void printstar(int *a,int n)
{
int x=124,y=n; //124对应竖线的ascII码
if(y>=10) printf("%-d%c",y,x); //y>=10显示格式问题
else printf("%2d%c",y,x);
for(int i=0;i<10;i++)
{
if(a[i]==n)
{
putchar('*'); putchar(' '); putchar(' ');
a[i]--; //出现次数最多的元素--
}
else
{
putchar(' '); putchar(' '); putchar(' ');
}
}
putchar('\n'); n--; //数组元素最大值--
if(n>0) printstar(a,n); //递归,n=n--
else
{
printf(" |------------------------------\n");
printf(" 0 1 2 3 4 5 6 7 8 9\n");
}
}
int main()
{
int c,n,a[10]={0}; //a[0]~a[9]代表0~9的计数
printf("请输入数字0~9:");
while((c=getchar())!='\n')
if(c>='0'&&c<='9') ++a[c-'0']; //0~9出现的频率
n=max(a);
printf("\t 数字频率统计直方图\n");
printstar(a,n);
return 0;
}