打印输入中单词长度的直方图

From: 《C程序设计语言》练习1-13 打印输入中单词长度的直方图
#include 
   
   
    
    

#define OUT 0			// 在单词外
#define IN  1			// 在单词内
#define MAXLEN	10		// 单词最大长度
#define MAXWORD 100		// 单词最大个数

int wl[MAXWORD];				// word length   用于存放输入中每个单词对应的长度

/* 练习1-13 打印输入中单词长度的直方图 */

void main()
{
	int i,j,c,state;
	int len = 0;						// 当前操作的单词长度
	int wc;								// word count    单词个数
	
	
	wc = 0;
	state = OUT;					// 状态初始化,在单词外
	for (i = 0; i < MAXLEN; i++)
		wl[MAXLEN] = 0;					// 初始化数组

	while ((c = getchar()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t')
		{
			if(state == IN)
			{
				if (len >MAXLEN)
					len = MAXLEN;
				wl[++wc] = len;
			}
			len = 0;				// 空格、制表符、换行的长度为0
			state = OUT;			// 遇到空格、制表符、换行,即为下一个单词,即在单词外
		}
		else if (state == OUT)		// 除空格、制表符、换行,且在单词外
		{
			state = IN;
			len++;
		}	
		else						// 除空格、制表符、换行,且在单词里 
			len++;
	}
	if (wc < 1)
		printf("没有单词!\n");
	else if (wc > MAXWORD)
		wc = MAXWORD;

	/* 水平直方图*/
	printf("水平直方图如下:\n");
	for (i = 1; i <= wc; i++)
	{
		if (i < 10)					
			printf(" %d: ",i);
		else 
			printf("%d|   ",i);
		for (j = 1; j <= wl[i]; j++)
			printf("*");
		printf("\n");
	}
	
	printf("\n");

	/* 垂直直方图 */
	printf("垂直直方图如下:\n");
	printf("  ^\n");				// 建立坐标轴
	printf("  |\n");
	for (i = MAXLEN; i > 0; i--)
	{
		if (i < 10)					// 建立坐标轴
			printf(" %d|",i);
		else 
			printf("%d|",i);		
		for (j = 1; j <= wc; j++)	// 画直方图
			if (wl[j] % MAXLEN >= i)
				printf(" * ");
			else 
				printf("   ");
		printf("\n");
	}
	// 建立坐标轴
	printf("  0 -  -  -  -  -  -  -  -  -  - ->\n");
	printf("    1  2  3  4  5  6  7  8  9  1\n");
	printf("                               0\n");
	printf("\n");
}

   
   
运行结果:

Tips:
1、难点在于垂直方向的直方图。
for (j = 1; j <= wc; j++) // 画直方图 !!!
if (wl[j] % MAXLEN >= i) 
printf(" * ");
else 
printf("   ");
printf("\n");
2、注意对边界情况的处理,这点比较容易遗忘。比如wc < 1 、wc  >  MAXWORD、len  > MAXLEN
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值