垂直直方图

描述
输入4行全部由大写字母组成的文本,输出一个垂直直方图,给出每个字符出现的次数。注意:只用输出字符的出现次数,不用输出空白字符,数字或者标点符号的输出次数。

输入
输入包括4行由大写字母组成的文本,每行上字符的数目不超过80个。

输出
输出包括若干行。其中最后一行给出26个大写英文字母,这些字母之间用一个空格隔开。前面的几行包括空格和星号,每个字母出现几次,就在这个字母的上方输出一个星号。注意:输出的第一行不能是空行。

思路:

利用1+‘A’ = ‘B’,‘B’-‘A’=1的特性,实现字符型数据和整型数据之间的转换,设计一个长度为26的整型数组int cNum[26],数组的下标 i=‘大写字母’-‘A’,下标中的内容即数字大小表示下标对应字母的个数。

定义一个整型变量 int maxLine = -1;存放最大字母数,也就是输出时最大的行数,将其初始化为-1。

输出的时候,当下标对应的字符数小于maxLine时,输出空格,大于等于maxLine时输出‘*’号。

最后输出一行大写字母用数组下标 i+‘A’转换,最后将其转换为char数据即可。

代码如下:

#include <stdio.h>

int main()
{
	int cNum[26];	//初始化为0
	char str[1000];
	int maxLine = -1;
	int i;

	//初始化数组
	for(i=0; i<26; i++)
	{
		cNum[i] = 0;
	}

	//输入四行大写字母,并统计字符
	for(i=0; i<4; i++)
	{
		gets(str);	//输入一行,包括空格
		int j=0;
		while(str[j]!='\0')
		{
			if(str[j]>='A'&&str[j]<='Z')
			{
				int k = str[j]-'A';
				cNum[k]++;	//字母对应位置加一
				//记录最大行数
				if(cNum[k]>maxLine)
				{
					maxLine = cNum[k];
				}
			}
			j++;
		}
	}

	//输出,用直方图显示
	int line;
	for(line=maxLine; line>0; line--)
	{
		for(i=0; i<26; i++)
		{
			if(cNum[i]>=line)
			{
				printf("* ");
			}
			else
			{
				printf("  ");
			}
		}
		printf("\n");
	}
	
	//最后一行输出字母
	for(i=0; i<26; i++)
	{
		printf("%c ",char(i+'A'));
	}
	printf("\n");

	return 0;
}
发布了38 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43851639/article/details/89604125