这是那本著名的《C语言程序设计》里的数组那部分的一个练习题
基本思路是先统计出每个单词的长度(longth)和每个长度的单词出现的次数(number),然后用用两重循环分别扫描X和Y轴绘制直方图
代码:
#include
#include
#define N 50
struct words
{
int longth;
int number;
};
int main()
{
//statistics
printf("Please input some words:\n");
words w[N];
for(int i=0;i
int flag=0;
char c;
for(int i=0;i
{
while((c = getchar())!= ' ')
{
if(c == '\n') break;
else w[i].longth++;
}
flag = i;
if(c == '\n') break;
}
printf("Count the longth of each word inputted:\n");
printf("No.\tLongth\n");
for(int j=0;j
{
if(w[j].longth != 0) printf("%2d\t%2d\n",j+1,w[j].longth);
}
//统计长度为i的单词有几个
for(int i=1;i
{
for(int j=0;j<=flag;j++)
if(w[j].longth == i) w[i].number++;
else continue;
}
printf("Count the appearance times of each longth word:\n");
printf("Longth\tCount\n");
for(int i=1;i
if(w[i].number!=0)printf("%d\t%d\n",i,w[i].number);
//sort
int s[N];
for(int i=0;i
//for(int i=0;i
//找到横坐标的最大值
for(int j=0;j
for(int k=0;k
if(s[k]
{
int temp=s[k];
s[k]=s[k+1];
s[k+1]=temp;
}
int ss[N];
for(int i=1;i
//for(int i=1;i
//找到纵坐标的最大值
for(int j=1;j
for(int k=1;k
if(ss[k]
{
int temp=ss[k];
ss[k]=ss[k+1];
ss[k+1]=temp;
}
//draw the Histogram
int max_longth = s[0];//最长的长度,即横坐标的最大点
int max_number = ss[1];//最多的个数,即纵坐标的最高点
printf("max_longth=%d\nmax_number=%d\n",max_longth,max_number);
printf("The Histogram :\n");
printf("X: The longth of each input word\n");
printf("Y: The statistics of their appearance\n");
for(int i=max_number;i>0;i--)//打印纵坐标
{
printf("%2d",i);
for(int k=1;k<=max_longth;k++)//开始对横坐标进行扫描
{
if((w[k].longth = k)&&(w[k].number >= i)) printf("%c",219);
else printf(" ");
}
printf("\n");
}
printf(" ");
for(int i=1;i<=max_longth;i++)
printf("%d",i);
printf("\nJob Done!\n");
}
其实一部分调试时所用的语句我没有删掉,或许对读程序有帮助。
下面是我的一个测试的结果图: