描述
输入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;
}