练习 1 - 13 编写一个程序,打印输入中单词长度的水平直方图 和 垂直直方图

该博客介绍了如何编写一个程序,根据用户输入的文本,生成单词长度的水平和垂直直方图,展示了具体的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
练习 1 - 13 编写一个程序,打印输入中单词长度的水平直方图 和 垂直直方图
*/

#include <stdio.h>
#define IN	1
#define OUT 0
#define NUM 1024

//求数组元素最值
int getArrarMax(int *arr,int arrLength)
{
	int i,j,temp;
	for(i = 0;i < arrLength; ++i)
		for (j = i + 1; j < arrLength; ++j)
			if(arr[i] < arr[j])
			{
				temp   = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
	return arr[0];
}

//利用双层循环打印水平直方图
void horizontal(int *arr,int arrLength)
{
	int i,k;
	printf("\t*\n\t|\n");
	for(i = 0; i < arrLength;i++)
	{
		printf("\t|");
		for(k = 0; k < arr[i]; k++)
			printf("|");
		printf("<%d>\n\t|\n",arr[i]);
	}
	printf("\t*------------------------水平直方图------------------------*\n");
}

//打印垂直直方图
void vertical(int *arr,int arrLength)
{
	int maxValue=getArrarMax(arr, arrLength);    
	int i,j;
	printf("\t*\n");
	for(i = maxValue+1; i > 0;i--)
	{
		printf("\t|");
		for(j = 0; j < arrLength; j++)
		{
			if(arr[j] == i)
			{
				printf("___\t");
				arr[j]--;
			}
			else if(arr[j] == i - 1)
			{  //显示数目
				printf("(%d)\t",arr[j]);
			}
			else
			{
				printf("\t");
			}
	   }
	   printf("\n");
	}
	printf("\t*------------------------垂直直方图------------------------*\n");
}


int main(int argc, char* argv[])
{
	int c, nw, nc, state,i;
	int arr[NUM];

	c = nw = nc = i = 0;
	state = OUT;
	memset(arr,0,NUM);
	//求出数组的元素个数以及单词数
	while((c = getchar()) != EOF)
	{
		++nc;
		if(c == ' ' || c == '\n' || c == '\t')
		{
			nc -= 1;
			state  = OUT;
			arr[i] = nc - arr[i];//对数组填充值
			++i;
		}
		else if(state == OUT)
		{
			state = IN;
			++nw;//计算单词数
		}
	}//对数组的每个元素 重新赋值每个单词的单词数
	for(i = nw - 1;i >0; --i)
	{
		arr[i] -= arr[i-1];
	}
	horizontal(arr,nw);
	vertical(arr,nw);

	return 0;
}


输出结果:


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值