qq_39677327 2022-03-31 21:24 采纳率: 94.9%
浏览 23
已结题

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

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

  • 写回答

2条回答 默认 最新

  • 关注

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

    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
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月31日

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan