它如何获得字符频率和最高字符频率?
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];
}
}
}
所以这是我的职责。我主要关注的是获取字符频率和最高字符频率。
下面的函数(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];
}
}
}