首 页最新软件下载排行文章资讯投稿发布下载专题
维维下载站
您的位置:首页编程开发网络编程编程其它 → 统计输入字符各个字母出现频率解题心得

统计输入字符各个字母出现频率解题心得

来源:本站整理 发布时间:2015-8-5 15:50:27 人气:

统计输入字符各个字母出现频率解题心得,先展示一下最终的结果:

刚接手题目时,想得比较复杂,因为26个字母中有大小写嘛,小写a~z,大写A~Z

但无论是大写还是小写,字母都只有26个,所以当输入大写字母时,只要将其转换为小写就行了。

大写字母转换为小写字母,有一个很方便的函数tolow(),在ctype.h中,详情文章末。

看过前一篇文章《c语言:计算输入字符个数》中使用数组统计单词长度的方法,在统计字母的个数的时候,依旧可以,只不过有些"小技巧"。

大小写转换与计算

 
 
if(isalpha(c)) /*详情见文末*/
{
c = tolower(c); //大写转换为小写
++char_count[c-'a'];
}

通过上面的代码将26个字母出现的频率统计后(都存在数组中),再来打印直方图,何为直方图,就是那张图拉,向上看。

由于要画直方图,所以用用到两个for循环语句,通过观察可以知道,直方图的行数由max决定。

max如何求呢,看如下代码:

 
 
max = 0; //初始化
 
/*找出出现频率最高的字母*/
for(x = 0; x < 26; x++)
{
if(char_count[x] > max)
{
max = char_count[x];
printf("max is %d", max);
}
}

现在max也知道了,来画出直方图吧:

 
 
/*打印直方图*/
for(; max > 0; max--)
{
for(x = 0; x < 26; x++)
{
if(char_count[x] >= max)
{
putchar('x');
}
else
putchar('');
}
putchar('\n');
}

现在一切都ok啦,还差一个横坐标,不然我们咋知道每一列代表的是哪一个字母呢:

 
 
/*打印下标,即abcdefghijklml....*/
for(x = 0; x < 26; x++)
{
putchar('a'+x);
}

完整代码:

 
 
#include <stdio.h>
#include <ctype.h>
 
main()
{
int x; //数组下标变量,详情看代码
int max; //出现频率最高的字母
int char_count[26]; //26个字母出现字数的统计
char c;
 
/*将数组初始化,因为我们还没有输入嘛,所以a~z都为0啦*/
for( x= 0; x < 26; x++)
{
char_count[x] = 0;
}
 
while((c = getchar()) != EOF)
{
if(isalpha(c)) /*详情见文末*/
{
c = tolower(c); //大写转换为小写
++char_count[c-'a'];
}
}
 
max = 0; //初始化
 
/*找出出现频率最高的字母*/
for(x = 0; x < 26; x++)
{
if(char_count[x] > max)
{
max = char_count[x];
printf("max is %d", max);
}
}
 
/*打印直方图*/
for(; max > 0; max--)
{
for(x = 0; x < 26; x++)
{
if(char_count[x] >= max)
{
putchar('x');
}
else
putchar('');
}
putchar('\n');
}
/*打印下标,即abcdefghijklml....*/
for(x = 0; x < 26; x++)
{
putchar('a'+x);
}
return 0;
 
 
}

ps:

相关下载
栏目导航
本类热门阅览