1、水平直方图
问题及代码:
/*打印输入单词长度的直方图*/
#include<stdio.h>
#define MAXHIST 15 //最大直方图
#define MAXWORD 11 //单词最大长度
#define IN 1 //单词内
#define OUT 0 //单词外
int main()
{
int c,i,nc,state;
int len;
int maxvalue; //数组wl[]的最大值
int ovflow; //溢出的单词数量
int wl[MAXWORD]; // 单词长度的数组
state=OUT;
nc=0; //单词的字符数
ovflow=0;
for(i=0;i<MAXWORD;i++)
wl[i]=0; //数组的所有元素赋初值为0
while((c=getchar())!=EOF)
{
if(c==' '||c=='\t'||c=='\n')
{
state=OUT;
if(nc>0)
if(nc<MAXWORD)
++wl[nc];
else
++ovflow;
nc=0;
}
else if(state==OUT)
{
state=IN;
nc=1; //开始一个新单词(首字符)
}
else
++nc; //单词非首字符
}
maxvalue=0;
for(i=1;i<MAXWORD;i++)
if(wl[i]>maxvalue)
maxvalue=wl[i];
for(i=1;i<MAXWORD;i++)
{
printf("5%d-5%d:",i,wl[i]);
if(wl[i]>0)
{
if((len=wl[i]*MAXHIST/maxvalue)<=0)
len=1;
}
else
len=0;
while(len>0)
{
putchar('*');
--len;
}
putchar('\n');
}
if(ovflow>0)
printf("他们有%d个单词>=%d\n",ovflow,MAXWORD);
}
运行结果:
学习心得:
知识总结:
2、垂直直方图
问题及代码:
/*打印输入单词长度的垂直直方图*/
#include<stdio.h>
#define MAXHIST 15 //最大直方图
#define MAXWORD 11 //单词最大长度
#define IN 1 //单词内
#define OUT 0 //单词外
int main()
{
int c,i,j,nc,state;
int maxvalue; //数组wl[]的最大值
int ovflow; //溢出的单词数量
int wl[MAXWORD]; // 单词长度的数组
state=OUT;
nc=0; //单词的字符数
ovflow=0;
for(i=0;i<MAXWORD;i++)
wl[i]=0; //数组的所有元素赋初值为0
while((c=getchar())!=EOF)
{
if(c==' '||c=='\t'||c=='\n')
{
state=OUT;
if(nc>0)
if(nc<MAXWORD)
++wl[nc];
else
++ovflow;
nc=0;
}
else if(state==OUT)
{
state=IN;
nc=1; //开始一个新单词(首字符)
}
else
++nc; //单词非首字符
}
maxvalue=0;
for(i=1;i<MAXWORD;i++)
if(wl[i]>maxvalue)
maxvalue=wl[i];
for(i=MAXHIST;i>0;i--)
{
for(j=1;j<MAXWORD;j++)
if(wl[j]*MAXHIST/maxvalue>=i)
printf("*");
else
printf(" ");
putchar('\n');
}
for(i=1;i<MAXWORD;i++)
printf("%4d",i);
putchar('\n');
for(i=1;i<MAXWORD;i++)
printf("%4d",wl[i]);
putchar('\n');
if(ovflow>0)
printf("他们有%d个单词>=%d\n",ovflow,MAXWORD);
}
运行结果:
学习心得:
知识总结: