![94284f48850cf3674a6d88678dc6d20a.png](https://img-blog.csdnimg.cn/img_convert/94284f48850cf3674a6d88678dc6d20a.png)
题目:编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易,垂直方向的直方图则要困难些。
步骤1:统计各个单词长度
说明:此部分基本包含在教材中,没有难度。
#include <stdio.h>
#define MAX 20 //数组默认长度
#define IN 1 //单词内
#define OUT 0 //单词外
int main()
{
int i, j, c, state, len, n;//len统计每个单词的长度,n控制单词的次序
int ndigit[MAX];
state = OUT;
len = n = 0;
for (i = 0; i <= n; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
{
if (c == ' ' || c == 't' || c == 'n')
{
if (state == IN)
{
state = OUT;
ndigit[n] = len;
len = 0;
++n;
}
}
else
{
++len;
state = IN;
}
}
for (i = 0; i < n; ++i) //测试是否统计正确
printf("第%d个单词长度为:%dn", i+1, ndigit[i]);
输出格式:
第1个单词长度为:5
第2个单词长度为:5
第3个单词长度为:3
第4个单词长度为:2
第5个单词长度为:6
步骤2:绘制水平直方图
说明:因为输出本身就是水平方向的,所以我们只要考虑按照数组中元素的大小来展示小方格,为了方便检验,我在最后加了元素大小。
printf("t ↑n");
for (i = 0; i < n; ++i)
{
printf("t%2d|", i+1);
for (j = 0; j < ndigit[i]; ++j)
printf("■");
printf("(%d)n", ndigit[i]);
}
printf("t ——————————————————————————→n");
输出格式:
↑
1|■■■■■(5)
2|■■■■■(5)
3|■■■(3)
4|■■(2)
5|■■■■■■(6)
——————————————————————————→
步骤3:绘制垂直直方图
说明:以下是我的思路:
1.确定Y轴顶端 = 数组最大元素的数值;在本例中数组的最大元素是6。
2.从Y轴顶端开始,逐行逐格判断是绘制空格,还是实格。此处需要嵌套for循环:第一层循环是Y轴刻度递减,在本例中是6,5,4,3,2,1,Y轴顶端刻度是6,末端刻度是1;第二层循环是取出数组中的每个元素,逐个对比:当前Y轴刻度(如初始是6)是否大于数组元素(如数组[0] = 5),如果刻度大于元素,那么就是空格,不然就是实格。
3.判断是否是首列,绘制Y轴刻度与坐标轴,只要判断i == 0就可以了。
4.Y轴的每行输出完之后换行,向下输出Y轴第二行。
5.绘制X轴
int maxlen; //元素最大值
int y;
maxlen = 0;
for (i = 0; i < n; ++i) //求出数组元素最大值
{
if (maxlen < ndigit[i])
maxlen = ndigit[i];
}
y = maxlen; //将元素最大值作为y轴的最大值,用y只是为了清晰
printf("t ↑n");
for (j = y; j > 0; --j) //从Y轴最大作为首行循环
{
for (i = 0; i <= n; ++i) //分别取出X轴数组的第一个元素
{
if (i == 0) //判别是否是X轴首列
{
if (j > ndigit[i]) //如果Y轴刻度大于i元素,则为|空格
printf("t%2d| ",j); //%2d是刻度
else //否则为|实格
printf("t%2d|■ ",j); //%2d是刻度
}
else if (i == n) // 一行输出完换行
printf("n");
else
{
if (j > ndigit[i]) //同理,Y轴刻度大于i元素,则为空格
printf(" "); //非首列,不用刻度
else //否则为实格
printf("■ "); //非首列,不用刻度
}
}
}
printf("t ——————————————————————————→n"); //打印X轴
输出格式:
↑
6| ■
5|■ ■ ■
4|■ ■ ■
3|■ ■ ■ ■
2|■ ■ ■ ■ ■
1|■ ■ ■ ■ ■
——————————————————————————→
补充:从最后的结果更好理解,图中可见,数组最大元素是6,Y轴最大刻度必然是6;接着,数组的第0个元素是5,因为Y轴刻度6大于第0个元素5,所以第一列第一格为“空格”,以此类推,可以得出第一行的结果;第二行,Y轴刻度为5小于等于数组第0个元素5,所以第一列第二个为“实格”,以此类推……