void Letter_Frequency(string * text)
{
//统计给定文本text中每个字母出现的频率
char alph[]={"abcdefghijklmnopqrstuvwxyz"};
float freq[26]={0};
int total=0;
int n,i;
n= len(text);
string c;
for(i=0;i<n;i++)
{
SubStr(&c,text,i,1);
if(Index(alph,c)>0)
{
total++;
alph[(int)(c.ch[0]-'a']++;
}
}
for(i=0;i<26;i++)
{
freq[i]=alph[i]/total;
if(freq[i]!=0)
printf("%c:%f\n",(char)(i+(int)'a'),freq[i];
}
}
**算法代码如上或者如下图,不是很理解这个代码,比如其中的
SubStr(&c,text,i,1);
if(Index(alph,c)>0)
total++;
alph[(int)(c.ch[0]-'a']++;**
这一串代码不是很理解,还有
freq[i]=alph[i]/total;
if(freq[i]!=0)
printf("%c:%f\n",(char)(i+(int)'a'),freq[i];
这一些不是很理解,有专家说一下原理吗
这个代码有点不伦不类的,勉强解释如下:
void Letter_Freequency(string *text) //c里没有string类型,这里先不管了
{
char alph[] = {"abcdefghijklmnopqrstuvwxyz"};
float freq[2]={0};
int total = 0;
int n,i;
n = len(text); //这里感觉是计算text的长度
string c;
for(i=0;i<n;i++)
{
SubStr(&c,text,i,1); //这里是取出text中的第i个字符
if(Index(alph,c)>0) //如果c在alph数组中
{
total++; //累加字母出现的次数
alph[(int)(c.ch[0]-'a')]++;
//这里想要实现的功能,应该是把对应字母的次数+1,但是这么写应该是错误的,
//正确的写法应该是用一个整数数组记录a-z出现的次数,
//假设整数数组是int nmb[26],nmb[0]是a出现的次数,nmb[1]是b出现的次数
//c.ch[0]如果是字符'a',那么c.ch[0]-'a'就是0,这时候,nmb[0]++,也就是'a'的次数+1
//但是,这里用alph[]++是不对的,猜测只是为了说明这个原理
}
}
for(i=0;i<26;i++)
{
freq[i] = alph[i]/total;//这里是想用alph[i]出现的次数除以字母总数,来得到alph[i]字母出现的频率
if(freq[i]!= 0)
printf("%c:%f\n",(char)(i+(int)'a'),freq[i]);//这里就是输出每个字符出现的频率(如果没有出现,则不输出)
}
}
这里需要注意,float freq[26]定义的是26个元素,正好对应a-z这26个字母
所以,i+'a'就对应第i个字母,也就是当i=0时,i+'a'对应字母'a'
i=1时,i+'a'就对应字母'b',以此类推。
所以对于任意一个字符c,c-'a'得到的就是c在alph中的下标,比如c='a'时,c-'a'=0,也就是'a'在alph中的下标是0,
alph[(int)(c.ch[0]-'a')]++;这句话,写书人的想法应该是让对应的字母次数+1
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!