它如何获得字符频率和最高字符频率?

How do it get character frequency and highest character frequency?

所以这是我的职责。我主要关注的是获取字符频率和最高字符频率。

下面的函数(get_letter_frequencies)应该得到一个字符串示例("I am a big boy")和return字符频率和最高字符频率。

The Function should return
i - 2
a - 2
m - 1
b - 2
g - 1
o - 1
y - 1
Highest character frequency would be " iab "

我的问题是 get_letter_frequencies 函数。为了return上面的输出,我应该从函数中安排什么?

void get_letter_frequencies(const char *text, size_t len, int freq[26], int *max_freq)
{

for(int i = 0; i<len; i++)
    {
        if(text[i] != ' ' || !(is_sentence_terminator(text[i]))) //this condition is set in order to ignore the spaces and the sentence terminators (! ? .) 
        {
            if(text[i] >= 'a' && text[i] <= 'z')
            {
                freq[text[i] - 'a']++;
            }
        }
    }

    for(int j = 0; j < 26; j++)
    {
        if(freq[j] >= 1)
        {
            *max_freq = freq[j];
        }
    }

下面这个函数(is_sentence_terminator)。这里的函数检查句子是否以“!?或。”结尾,如果它不是以终止符之一结束,则它不是句子并忽略它。

int is_sentence_terminator(char ch)
{

        if(ch == 33 || ch == 46 || ch == 63)
        {
            return 1;
        }else
        {
            return 0;
        }

}

您的代码中存在一些问题:

  • 不需要测试特殊字符,比较text[i]'a''z'对于ASCII系统就足够了。

  • 在第二个循环中,只有当 freq[j] 大于当前值时才应该更新 *max_freq,而不是 1*max_freq 应在循环之前初始化为 0

在调用代码中,您还

  • 打印频率非0的字母
  • 使用最后一个循环打印所有出现频率最高的字母。

这是修改后的版本:

void get_letter_frequencies(const char *text, size_t len, int freq[26], int *max_freq) {

    for (int i = 0; i < 26; i++)
        freq[i] = 0;

    for (int i = 0; i < len; i++) {
        if (text[i] >= 'a' && text[i] <= 'z') {
            freq[text[i] - 'a']++;  // assuming ASCII
        }
    }

    *max_freq = 0;
    for (int i = 0; i < 26; i++) {
        if (*max_freq < freq[i]) {
            *max_freq = freq[i];
        }
    }
}