算法与数据结构:统计各字母频率的算法,程序已有,其中有几个代码不懂,望解答

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];
这一些不是很理解,有专家说一下原理吗

img

img

这个代码有点不伦不类的,勉强解释如下:

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


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632