尝试在数组中输出多个最常见的字母
Trying to output multiple most frequent letters in an array
我正在尝试从一串文本中获取一些统计信息,例如单词和句子的数量等。在这些统计信息中,有字符串中使用频率最高的字母。我目前正在使用下面的这些函数来获取所需的大部分统计信息。
typedef struct statistics
{
char_counts_t char_info;
int sentences;
int words;
int freq[26];
int max_freq;
char most_freq_chars[27];
} statistics_t;
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] >= 97) && (text[i] <= 122))
freq[text[i] - 97]++;
}
*max_freq = 0;
for (int i = 0; i < 26; i++)
{
if (*max_freq < freq[i])
{
*max_freq = freq[i];
}
}
}
void get_text_statistics(const char *text, size_t len, statistics_t *data)
{
data->words = count_words(text, len);
data->sentences = count_sentences(text, len);
get_char_counts(text, len, &data->char_info);
get_letter_frequencies(text, len, data->freq, &data->max_freq);
for (int q = 0; q < 26; q++)
data->most_freq_chars[q] = 0;
for (int q = 0; q < 26; q++)
{
int max = 0;
if (data->max_freq == data->freq[q])
{
data->most_freq_chars[max] = (char) (q + 97);
max++;
}
}
}
现在,在尝试将统计数据制成表格时,我使用了一个 while 循环,以防出现两个或更多个具有相同频率的字母。
printf("| Most frequent letter(s) | [%c] |\n", data.most_freq_chars[0]);
int a = 1;
while (data.most_freq_chars[a] != '[=11=]')
{
printf("| | [%c] |\n", data.most_freq_chars[a]);
a++;
}
为了尝试这个场景,我输入了字符串“Hello. Goodluck!”期望得到两个最常见的字母([o] 和 [l]),然而,只有其中一个出现([o])。
我该怎么做?
提前致谢
识别max_freq
的代码应该在计算不同字母频率的循环之外,因为我们只有在知道所有频率后才能计算最大频率。
所以get_letter_frequencies
函数应该这样写-
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] >= 97) && (text[i] <= 122))
freq[text[i] - 97]++;
}
*max_freq = 0;
for (int i = 0; i < 26; i++)
if (*max_freq < freq[i])
*max_freq = freq[i];
}
我正在尝试从一串文本中获取一些统计信息,例如单词和句子的数量等。在这些统计信息中,有字符串中使用频率最高的字母。我目前正在使用下面的这些函数来获取所需的大部分统计信息。
typedef struct statistics
{
char_counts_t char_info;
int sentences;
int words;
int freq[26];
int max_freq;
char most_freq_chars[27];
} statistics_t;
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] >= 97) && (text[i] <= 122))
freq[text[i] - 97]++;
}
*max_freq = 0;
for (int i = 0; i < 26; i++)
{
if (*max_freq < freq[i])
{
*max_freq = freq[i];
}
}
}
void get_text_statistics(const char *text, size_t len, statistics_t *data)
{
data->words = count_words(text, len);
data->sentences = count_sentences(text, len);
get_char_counts(text, len, &data->char_info);
get_letter_frequencies(text, len, data->freq, &data->max_freq);
for (int q = 0; q < 26; q++)
data->most_freq_chars[q] = 0;
for (int q = 0; q < 26; q++)
{
int max = 0;
if (data->max_freq == data->freq[q])
{
data->most_freq_chars[max] = (char) (q + 97);
max++;
}
}
}
现在,在尝试将统计数据制成表格时,我使用了一个 while 循环,以防出现两个或更多个具有相同频率的字母。
printf("| Most frequent letter(s) | [%c] |\n", data.most_freq_chars[0]);
int a = 1;
while (data.most_freq_chars[a] != '[=11=]')
{
printf("| | [%c] |\n", data.most_freq_chars[a]);
a++;
}
为了尝试这个场景,我输入了字符串“Hello. Goodluck!”期望得到两个最常见的字母([o] 和 [l]),然而,只有其中一个出现([o])。
我该怎么做?
提前致谢
识别max_freq
的代码应该在计算不同字母频率的循环之外,因为我们只有在知道所有频率后才能计算最大频率。
所以get_letter_frequencies
函数应该这样写-
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] >= 97) && (text[i] <= 122))
freq[text[i] - 97]++;
}
*max_freq = 0;
for (int i = 0; i < 26; i++)
if (*max_freq < freq[i])
*max_freq = freq[i];
}