c++ 数组换行_C程序设计语言 练习1-13

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,所以第一列第二个为“实格”,以此类推……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值