C++课程设计:单词统计器

一、项目背景

1.1项目来源

个人需求:个人在学习、工作或生活中需要对大量文本进行单词统计,以便更好地理解和分析文本内容。

教育领域:教师或学生需要对阅读材料中的单词进行统计,以帮助学生提高词汇量和阅读理解能力。

自然语言处理:在自然语言处理领域,单词统计是一种基本的文本分析技术,可以用于文本分类、情感分析、机器翻译等应用。

数据分析:在数据分析领域,单词统计可以用于分析文本数据的特征,例如词频分布、词汇多样性等。

开源项目:许多开源项目都提供了单词统计功能,例如 Elasticsearch、Lucene 等,可以作为项目的参考和借鉴。

无论是哪种来源,开发单词统计器程序都需要对自然语言处理和数据结构有一定的了解,同时需要掌握相关的编程技能。

1.2项目意义

提高语言学习效率:通过统计单词出现的频率和语境,学习者可以更好地了解单词的用法和意义,从而提高语言学习的效率。

辅助文本分析:单词统计器可以帮助用户快速了解文本的主题和内容,对于文本分析和信息提取具有重要意义。

自然语言处理应用:在自然语言处理领域,单词统计是一种基本的文本分析技术,可以用于机器翻译、文本分类、情感分析等应用。

提升编程能力:编写单词统计器程序需要掌握数据结构、算法和编程语言等知识,通过实践可以提升编程能力和解决问题的能力。

个性化应用:根据个人需求,可以定制单词统计器的功能,例如添加单词释义、例句展示等,以满足用户的个性化需求。

总的来说,写单词统计器程序可以帮助用户更好地理解和处理文本,对于语言学习、文本分析和自然语言处理等领域都具有重要的意义。同时,编写程序本身也可以提升编程能力和解决问题的能力。

1.3问题解决

语言学习:通过统计单词出现的频率和语境,学习者可以更好地了解单词的用法和意义,从而提高语言学习的效率。

文本分析:在信息爆炸的时代,人们需要快速了解大量文本的内容。单词统计器可以帮助用户快速了解文本的主题和关键词,对于文本分析和信息提取具有重要意义。

学术研究:在学术研究中,需要对大量文献进行分析和处理。单词统计器可以帮助研究人员快速了解文献的主题和关键词,提高文献阅读和理解的效率。

写作辅助:通过分析自己或他人的文章中的单词使用情况,写作者可以发现自己的用词习惯和问题,从而提高写作水平。

翻译辅助:在翻译过程中,单词统计器可以帮助翻译者了解源语言和目标语言之间的词汇差异和用词习惯,提高翻译的准确性和流畅性。

总的来说,写单词统计器程序可以帮助用户更好地理解和处理文本,对于语言学习、文本分析、学术研究、写作和翻译等领域都具有重要的意义。通过项目的实施,这些问题可以得到有效的解决。

二、项目的需求分析

这个程序的模块图可以分为以下几个部分:

WordCounter 类定义

成员变量:std::map<std::string, int> wordCount

成员函数:

void processText(const std::string& text)

void printWordCount() const

int getTotalWords() const

int getWordFrequency(const std::string& word) const

double getWordFrequencyPercentage(const std::string& word) const

main() 函数

输入文本

创建 WordCounter 对象

调用 processText() 函数处理文本

调用 printWordCount() 函数打印单词计数结果

调用 getTotalWords() 函数获取并打印单词总数

输入单词

调用 getWordFrequency() 函数获取并打印特定单词的频率

调用 getWordFrequencyPercentage() 函数计算并打印单词的频率百分比

以下是一个简化的模块图:

该程序是一个简单的文本分析工具,用于统计用户输入文本中单词的出现次数、总单词数、指定单词的频率以及指定单词的频率百分比。以下是项目的需求分析:

1. 输入文本:程序应接受用户输入的一段文本,以便进行进一步的处理和分析。

2. 单词计数:程序需要统计输入文本中每个单词的出现次数。为此,需要创建一个数据结构(如 map)来存储每个单词及其出现次数。

3. 处理文本:程序需要实现一个函数来处理输入文本。该函数应从输入文本中提取单词并更新单词计数。

4. 打印单词计数:程序需要实现一个函数来打印每个单词及其出现次数。该函数应遍历单词计数数据结构并以易于阅读的格式输出结果。

5. 获取总单词数:程序需要实现一个函数来计算输入文本中的总单词数。该函数应遍历单词计数数据结构并将每个单词的出现次数累加到总数上。

6. 获取指定单词的频率:程序需要实现一个函数来获取输入文本中指定单词的出现次数。该函数应在单词计数数据结构中查找指定单词,如果找到则返回其出现次数,否则返回0。

7. 计算单词频率百分比:程序需要实现一个函数来计算指定单词在输入文本中的频率百分比。该函数应首先获取总单词数和指定单词的出现次数,然后计算并返回百分比。

8. 用户交互:程序应提供一个简单的用户界面,提示用户输入文本、指定单词,并显示分析结果。用户界面应包括输入提示、结果输出以及错误处理。

9.输出格式:程序应以易于阅读的格式输出结果。在输出单词频率百分比时,应设置输出格式为固定的两位小数。

三、项目的实现

在程序中,我们使用了一个std::string类型的变量text来存储输入的英文语句。然后,使用一个std::stringstream对象来将输入的语句拆分成一个个的单词。接着,程序创建了一个WordCount结构体数组wordCounts,用于存储拆分后的每个单词及其出现的次数。

在循环中,程序逐个读取拆分后的单词,并检查该单词是否已经存在于wordCounts数组中。如果存在,则将其出现次数加 1;如果不存在且数组尚未满,则将该单词及其出现次数添加到数组中。最后,程序计算了总的单词个数和每个单词出现的频率,并将结果输出到控制台上。

3.1导入所需的头文件

#include <iostream>:用于输入输出操作。

#include <map>:用于存储单词及其出现次数的数据结构。

#include <string>:用于处理字符串。

#include <sstream>:用于创建字符串流对象,方便处理字符串。

#include <iomanip>:用于设置输出格式。

3.2定义 WordCounter 类

私有成员变量 wordCount:使用 std::map<std::string, int> 类型的变量存储单词及其出现次数。

实现 processText 函数:

接受一个 const std::string& 类型的参数 text,用于处理用户输入的文本。

创建一个 std::istringstream 对象 stream,并将 text 初始化为该对象。

使用 while 循环从 stream 中逐个读取单词,并将其加入到 wordCount 中对应的计数器中。

实现 printWordCount 函数:

遍历 wordCount 中的每个键值对,使用 std::cout 对象打印每个单词及其出现次数。

实现 getTotalWords 函数:

初始化一个变量 total 为 0。

遍历 wordCount 中的每个键值对,将每个单词的出现次数累加到 total 中。

返回 total,即为单词的总数。

实现 getWordFrequency 函数:

接受一个 const std::string& 类型的参数 word,表示要查询频率的单词。

使用 wordCount.find(word) 在 wordCount 中查找该单词。

如果找到,则返回对应的出现次数;否则,返回 0。

实现 getWordFrequencyPercentage 函数:

接受一个 const std::string& 类型的参数 word,表示要查询频率百分比的单词。

调用 getTotalWords 函数获取总单词数,并将结果保存在 totalWords 变量中。

调用 getWordFrequency 函数获取特定单词 word 的频率,并将结果保存在 wordFreq 变量中。

计算单词的频率百分比,将结果保存在 percentage 变量中,并返回该值。

3.3 main 函数

定义一个 std::string 类型的变量 text,用于存储用户输入的文本。

提示用户输入文本,并使用 std::getline 函数从标准输入读取一行文本,并将其存储在 text 中。

创建一个 WordCounter 类的对象 counter。

调用 counter.processText(text),使用 counter 对象处理文本,统计每个单词的出现次数。

调用 counter.printWordCount(),打印单词计数结果。

调用 counter.getTotalWords(),打印单词的总数。

提示用户输入一个单词,并将其存储在 std::string 类型的变量 word 中。

调用 counter.getWordFrequency(word),打印该单词的频率。

调用 counter.getWordFrequencyPercentage(word),打印该单词的频率百分比。

返回 0,表示程序正常结束。

通过以上步骤,代码实现了一个简单的单词计数器,并提供了处理文本、统计单词出现次数、获取单词频率百分比等功能。

四、调试运行结果及结果分析

这里我们运行程序,显示结果如图4-1:


输入我们要统计的文本,这里我们使用例文如下:

Youth is not a time of life; it is a state of mind; it is not a matter of rosy cheeks, red lips and supple knees; it is a matter of the will, a quality of the imagination, a vigor of the emotions;

运行输出显示结果如图4-2所示:

这时候我们输入要检索的单词,这里我们输入的检索单词为the:

我们再输入检索单词of:

我们再次输入检索单词it:


通过以上输出结果我们可以得到所检索文本中的单词总数和每个单词出现的频率。

五、问题探讨

输入的文本为空或只有空格:如果输入的文本为空或只有空格,程序将无法正确地拆分单词并进行计数。为了解决这个问题,可以在程序中添加一些输入验证逻辑,例如检查输入的文本是否为空或只包含空格。

单词的大小写问题:程序在拆分单词时忽略了大小写,因此同一个单词的不同大小写形式将被视为不同的单词。例如,"Apple"和"apple"将被视为两个不同的单词。如果需要忽略大小写进行计数,可以在拆分单词之前将文本转换为小写或大写。

单词的界定问题:程序将空格作为单词之间的分隔符,但在实际情况中,单词的界定可能会更加复杂。例如,标点符号、换行符等也可能作为单词之间的分隔符。如果需要更精确地拆分单词,可以使用正则表达式或自然语言处理相关的库来进行处理。

内存管理问题:程序中使用了一个固定大小的WordCount结构体数组来存储拆分后的单词,如果输入的文本包含的单词数量超过了数组的大小,程序将无法正确地处理。为了解决这个问题,可以使用动态分配内存的方式来存储单词。

输出格式问题:程序的输出格式可能不符合用户的期望,例如没有按照出现频率从高到低排序。如果需要改进输出格式,可以在程序中添加排序逻辑。

六、课程设计总结与体会

6.1设计总结

以上程序的开发过程可以总结为以下几个步骤:

需求分析:确定程序的功能和目标,即计算输入文本中每个单词出现的个数和频率。

设计算法:根据需求分析,设计实现该功能的算法。使用字符串流和循环来拆分输入的文本,创建一个结构体数组来存储每个单词及其出现的次数。

编写代码:根据设计的算法,使用 C++语言编写代码实现单词计数器程序。

调试和测试:编写测试用例,对程序进行调试和测试,确保程序的正确性和稳定性。

优化和改进:根据测试结果和实际需求,对程序进行优化和改进,提高程序的性能和用户体验。

总结和反思:对开发过程进行总结和反思,总结经验教训,为以后的开发提供参考。

通过以上开发过程,我们可以开发出一个简单的单词计数器程序,它可以计算输入文本中每个单词出现的个数和频率,并输出到控制台。在开发过程中,我们需要注意代码的可读性、可维护性和性能,以及对可能出现的问题进行充分考虑和处理。

6.2心得体会

经过一个学期的学习,我学习到了基本的理论知识,了解到了C++语言程序设计的思想,这些知识都为我的课程实践和进一步的学习打下了坚实的基础。 在为期近两周的C++课程设计中,我体会颇多,学到了很多东西。我加强了对C++程序设计这门课程的认识,并且复习了自己以前学习到的知识。这些都使得我对计算机语言的学习有了更深入的认识!总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。像职工信息表这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。特别是学会了在Visual C++中如何调试程序的方法。当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,教会了我编译复杂程序的方法。

在老师和同学的帮助下,通过自己的努力,终于完成了这次职工信息表的简单课程设计。我经过这段时间的编程,对其中的艰辛,我是深有体会。从刚开始的选择程序、理解程序到后来的调试程序以及改进程序这个过程中,我遇到了各种各样的困难和挫折。但是我坚定信念,对自己充满了信心,想尽一切办法克服重重困难。

通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。另外某些具体的细节内容也是相当的重要。这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。这些经验对我以后的编程会有很大的帮助的,我要好好利用。

虽然这次课程设计是在参考程序的基础之上进行的,但是我觉得对自己是一个挑战和锻炼。我很欣慰自己能在程序中加入自己的想法和有关程序内容,也就是对它的程序改进了一番改进,并有创新。但是我感觉自己的创新还不够典型,总之还不是很满意。另外由于时间的紧迫和对知识的了解不够广泛,造成了系统中还存在许多不足,功能上还不够完善。以后我会继续努力,大胆创新,争取能编写出透射着自己思想的程序。这次课程设计让我充分认识到了自己的不足,认识到了动手能力的重要性。我会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础!

七、代码

#include <iostream> // 导入输入输出库
#include <map> // 导入map库,用于存储单词及其出现次数
#include <string> // 导入字符串库
#include <sstream> // 导入字符串流库,用于处理字符串
#include <iomanip> // 导入iomanip库,用于设置输出格式

class WordCounter {
private:
    std::map<std::string, int> wordCount; // 用于存储单词及其出现次数的map

public:
    // 处理文本的函数
    void processText(const std::string& text) {
        std::string word; // 用于存储每个单词的字符串
        std::istringstream stream(text); // 创建一个字符串流对象
        // 从字符串流中读取每个单词,并增加其在map中的计数
        while (stream >> word) {
            ++wordCount[word];
        }
    }

    // 打印单词计数的函数
    void printWordCount() const {
        // 遍历map,并打印每个单词及其出现次数
        for (const auto& pair : wordCount) {
            std::cout << pair.first << ": " << pair.second << '\n';
        }
    }

    // 获取单词总数的函数
    int getTotalWords() const {
        int total = 0;
        // 遍历map,将每个单词的出现次数加到总数上
        for (const auto& pair : wordCount) {
            total += pair.second;
        }
        return total;
    }

    // 获取特定单词的频率的函数
    int getWordFrequency(const std::string& word) const {
        // 在map中查找单词,如果找到则返回其出现次数,否则返回0
        auto it = wordCount.find(word);
        if (it != wordCount.end()) {
            return it->second;
        } else {
            return 0;
        }
    }

    // 计算单词频率百分比的函数
    double getWordFrequencyPercentage(const std::string& word) const {
        int totalWords = getTotalWords(); // 获取总单词数
        int wordFreq = getWordFrequency(word); // 获取特定单词的频率

        // 计算单词的频率百分比
        double percentage = 100.0 * wordFreq / totalWords;

        return percentage;
    }
};

int main() {
    std::string text; // 用于存储用户输入的文本的字符串
    std::cout << "Enter a text: "; // 提示用户输入文本
    std::getline(std::cin, text); // 从标准输入读取一行文本

    WordCounter counter; // 创建一个单词计数器对象
    counter.processText(text); // 使用单词计数器处理文本
    counter.printWordCount(); // 打印单词计数结果

    // 打印单词总数
    std::cout << "Total words: " << counter.getTotalWords() << '\n';

    // 提示用户输入一个单词,然后打印该单词的频率
    std::string word;
    std::cout << "Enter a word to get its frequency: ";
    std::cin >> word;
    std::cout << "Frequency of '" << word << "': " << counter.getWordFrequency(word) << '\n';

    // 打印单词的频率百分比
    std::cout << "Frequency percentage of '" << word << "': " 
              << std::fixed << std::setprecision(2) // 设置输出格式为固定的两位小数
              << counter.getWordFrequencyPercentage(word) << "%" << '\n';

    return 0; // 程序正常结束
}

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值