Menu
CoddyTech

复习:单词频率计数器

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 63 课,共 63 课。

challenge icon

挑战

简单

编写一个 C 程序,实现词频计数器来分析文本输入。你的程序应该:

  1. 编写一个名为 countWordOccurrences 的函数,该函数:
    • 接受两个 char* 参数:sentence 和 targetWord
    • 返回一个整数,表示目标词在句子中出现的次数
    • 使用循环逐个处理句子中的字符
    • 使用空格作为分隔符来识别词语边界
    • 从句子中提取每个词,并使用 strcmp() 将其与目标词进行比较
    • 统计完全匹配的次数(区分大小写)
  2. 编写一个名为 extractWord 的函数,该函数:
    • 接受一个 char* 类型的句子、一个整数 startIndex,以及一个 char* 类型的词语参数
    • 返回一个整数,表示提取出的词语之后的索引
    • 从 startIndex 开始提取一个词,直到遇到空格或空终止符
    • 将提取出的词语存储在 word 参数中
    • 添加一个空终止符,以完成提取的词语
  3. 编写一个名为 analyzeText 的函数,该函数:
    • 接受一个 char* 类型的句子参数
    • 返回一个整数,表示句子中的词语总数
    • 通过识别空格作为分隔符来统计词语
    • 正确处理多个连续空格(将它们视为一个分隔符)
  4. 在 main 函数中:
    • 声明一个大小为 200 的字符数组 inputSentence
    • 声明一个大小为 50 的字符数组 searchWord
    • 从输入中读取一个句子(可以包含由空格分隔的多个词语)
    • 读取要搜索的目标词
    • 调用 analyzeText 函数,并严格按照以下格式打印词语总数:Total words: [count]
    • 调用 countWordOccurrences 函数,并严格按照以下格式打印结果:Occurrences of '[searchWord]': [count]
    • 计算并打印词频百分比,保留 1 位小数,格式严格如下:Frequency: [percentage]%
    • 确定并打印词频类别:
      • 如果词频为 0.0%:打印 Category: Not found
      • 如果词频大于 0.0% 但小于 20.0%:打印 Category: Rare
      • 如果词频在 20.0% 到 50.0% 之间(含两端):打印 Category: Common
      • 如果词频大于 50.0%:打印 Category: Frequent

这个挑战将检验你对字符串操作、分词和文本处理的掌握程度。你将练习把句子拆分成单个词语、比较字符串以查找完全匹配项,以及实现多个协同分析文本数据的函数。这个程序展示了许多 C 应用所必需的真实文本处理技术。

亲手试试

#include <stdio.h>
#include <string.h>

// TODO: 在这里编写你的 extractWord 函数

// TODO: 在这里编写你的 countWordOccurrences 函数

// TODO: 在这里编写你的 analyzeText 函数

int main() {
    char inputSentence[200];
    char searchWord[50];
    
    // 读取输入的句子
    fgets(inputSentence, sizeof(inputSentence), stdin);
    // 如果有换行符,就将其删除
    inputSentence[strcspn(inputSentence, "\n")] = '\0';
    
    // 读取要搜索的单词
    scanf("%s", searchWord);
    
    // TODO: 在下方编写你的代码
    // 调用 analyzeText 函数并保存单词总数
    // 调用 countWordOccurrences 函数并保存出现次数
    // 计算出现频率的百分比
    // 确定频率类别
    
    // 按要求的格式输出结果
    // printf("Total words: %d\n", totalWords);
    // printf("Occurrences of '%s': %d\n", searchWord, occurrences);
    // printf("Frequency: %.1f%%\n", frequency);
    // printf("Category: %s\n", category);
    
    return 0;
}

逻辑与流程中的所有课

自己练习: C 在线编译器