资源下载地址:https://download.csdn.net/download/sheziqiong/85837773

关键字检索系统

1 分析

1.1 背景分析

检索某个关键字在一段文字中出现次数,是在文字处理、文本统计等工作中经常需要使用的操作。由于其操作相对比较偏向底层,因此使用的频率相对而言较高,所以其执行的效率、复杂度等也是设计者需要考虑的一大问题。对于不同的语言,执行效率也有所不同,比如英语,其单词都以空格鲜明地分隔开来,故实现起来比较容易;但对于中文,一句话所有的字词都紧密地连接在一起,因而实现起来比较复杂。

1.2 功能分析

作为一个关键字检索系统,我们让用户在终端输入多段英语段落(也即多行英文),为了明确标识结束符,我们以单独一行的一个“0”作为终端输入的结束符。在程序中,我们将用户输入的英文段落读入,并将其存储于一个用户指定文件名的文件之中。这是第一个步骤。

而后,我们再通过读取这个文件,去检索关键字。这是第二个步骤。这是题目的要求,虽然看似多此一举比较繁琐,但是它实现了将输入内容存放于文件、从文件中读取内容两个操作,很好地将此题建立在了文件输入输出的基础上,并且能够保存用户输入的文字,一举两得。

2 设计

2.1 类结构设计

我们设计了两个类:一个类(文件初始化类 InitFile)专门负责读取终端输入的英文段落,并将其生成文件;另一个类(关键字检索类 KeywordSearch)负责读取第一个类生成的文件,然后检索关键字在其中出现的次数,最后在 main 函数中输出。

2.2 成员与操作设计

文件初始化类(InitFile)

public://构造函数:初始化文件名,并以ios::out形式创建(或打开)文件//ios::out形式打开文件:若不存在该文件,则创建文件;若存在,则清空文件之后打开InitFile();//析构函数:关闭文件~InitFile();//获取输入的文本(以单独一行的0结尾)void InputText();//获取文件名string getFilename()const;
private://_name是文件名,_input是未经处理的直接从终端输入的内容//_fout是文件输出流string _name, _input;ofstream _fout;

关键字检索类(KeywordSearch)

public://构造函数传入要寻找的关键字,将要搜索的文件打开KeywordSearch(const string& keyword, const string& filename);//析构函数,关闭文件~KeywordSearch();//获取关键字出现的次数int getCount();
private:string _filename,_keyword;ifstream _fin;int _count;

2.3 系统逻辑设计

先生成 InitFile 类的对象 init_file,直接调用其 InputText()函数,同时用户输出相关信息,这样就创建了一个包含了用户输入信息的文件;然后输入要检索的关键字,将其全部转化为小写;使用关键字 keyword 和文件名 init_file.getFilename()生成一个 KeywordSearch 对象 kwSearch,直接调用其 getCount()函数得到关键字出现的次数。

3 实现

3.1 生成文件的实现

3.1.1 实现方法

在 InitFile 构造函数中,先让用户输入文件名,如果用户输入不为空,则将文件名改为用户输入,不然则为默认文件名 Default.txt;然后用该文件名以 ios::out 打开文件。

在 InitFile::InputText()中,先让用户输入英文段落,以单独一行的 0 作为结束标志,使用 getline 读入一行,每读入一行,都全部转换为小写然后储存到打开的文件之中。

这样就实现了文件的生成。

3.1.2 核心代码

InitFile::InitFile()
{_input = "";cout << "请输入文件名(默认情况下为Default.txt):";getline(cin, _input);_name = (_input == "" ? "Default.txt" : _input);_fout.open(_name, ios::out /*| ios::app*/);
}void InitFile::InputText()
{cout << "请输入英文段落(以单独一行的0作为结束标志):" << endl;while (getline(cin, _input)){if (_input == "0") {break;}transform(_input.begin(), _input.end(), _input.begin(),std::tolower);//全部转为小写_fout << _input << endl;}
}

3.2 关键字检索的实现

3.2.1 实现方法

通过关键字 keyword 和文件名 init_file.getFilename()(文件名要从 InitFile 类的对象中获取)来初始化 KeywordSearch 对象 kwSearch,在其构造函数中将私有成员_keyword 和_filename 分别赋值,将关键字出现次数_count 初始化为-1,然后用 ios::in 打开_filename,并将文件标识符设置在文件的 begin 位置。

而后在 mian 函数中调用 kwSearch.getCount(),在 KeywordSearch::getCount()中,先判断_count 是否为-1,若不为-1 则说明已经检索过,直接返回_count 即可;不然则将其赋值为 0,然后不断读取文件中的字符串(因为英文以空格为分隔符,而字符串的读取也是以空格为分界,所以能很好地模拟读取过程),逐个判断字符串是否为关键字,若是则_count++。

这里需要注意标点符号可能和英文单词一起被读入在字符串中,因此需要判断一下字符串的末尾是否是英文,若不是,则提取字符串的纯英文子串作为新的判断对象。

3.2.2 核心代码

 KeywordSearch::KeywordSearch(const string& keyword, const string& filename)
{_count = -1;_keyword = keyword;_filename = filename;_fin.open(_filename, ios::in);//以ios::in形式打开文件,只能读取文件_fin.seekg(ios::beg);//将文件标识符设置在begin位置
}int KeywordSearch::getCount()
{//_count!=-1时说明已查找过,直接返回_countif (_count == -1) {_count = 0;string word;//当未读取到文件末尾时while (!_fin.eof()) {//清空,防止最后一行读不到东西导致最后一个单词被两次计算word.clear();_fin >> word;//从文件读取字符串,有可能连着标点符号一起读取,故需要作二次处理int size = word.size();if (!word.empty()) {//如果读取字符串最后一位不是字母,则说明连着标点一起读进来了if (word[size - 1] < 'a' || word[size - 1]>'z') {//获取子串,重新构造字符串word = word.substr(0, size - 1);}//此时字符串一定是纯英文,直接判断是否与关键字相等if (word == _keyword) {_count++;}}}}return _count;
}

4 测试

4.1 基础功能测试

4.2 默认文件名测试

4.3 极端情况测试

资源下载地址:https://download.csdn.net/download/sheziqiong/85837773

基于C++的关键字检索系统相关推荐

  1. python优秀源码新闻系统_[内附完整源码和文档] 基于python的新闻检索系统

    1 系统介绍 1.1 系统需求 新闻检索系统:定向采集不少于 4 个中文社会新闻网站或频道,实现这些网站新闻信息及评论信息的自动爬取.抽取.索引和检索.本项目未使用 lucene,Goose 等成熟开 ...

  2. [内附完整源码和文档] 基于python的新闻检索系统

    1 系统介绍 1.1 系统需求 新闻检索系统:定向采集不少于 4 个中文社会新闻网站或频道,实现这些网站新闻信息及评论信息的自动爬取.抽取.索引和检索.本项目未使用 lucene,Goose 等成熟开 ...

  3. Milvus 实战|基于 Milvus 的图文检索系统

    本文主要介绍基于 Milvus 搭建的多模态图文检索系统.检索流程为: 1. 通过 TIRG(Text Image Residual Gating)模型将图片特征和文本特征转化为多模态特征向量. 2. ...

  4. 万方数据基于PaddleNLP的文献检索系统实践

    又是一年开学季,看着大批莘莘学子步入高校,同时又有大批学生即将面临毕业,这一年要饱受论文的洗礼.在学术论文领域,几乎每一位大学生都避不开论文检索.查重环节.想写出一篇高质量论文,前期大量的信息储备必不 ...

  5. 基于C语言实现的关键字检索系统

    1 项目简介 建立一个文本文件,文件名由用户用键盘输入,输入一个不含空格的关键字,统计输出关键字在文本中的出现次数. 2 项目功能要求 本项目的设计要求可以分成两个部分实现:首先建立一个文本文件,文件 ...

  6. 基于Web的搜索引擎检索系统(Java+Lucene+SqlServer)

    目 录 目 录 IV 1 绪论 1 1.1 项目背景 1 1.2 国内外发展现状及分类 2 1.3 本论文组织结构介绍 3 2 相关技术介绍 5 2.1什么是搜索引擎 5 2.2 sqlserver数 ...

  7. 基于内容的视频信息检索系统

    基于内容的视频信息检索系统 汪志强 (江西财经大学信息管理学院 09信息管理与信息系统2班) 摘 要: 本文从基于内容的视频信息检索技术的发展历史出发,对基于内容的视频检索系统的技术要点及主要的功能模 ...

  8. 【音乐检索】基于matlab音乐检索系统【含Matlab源码 435期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[音乐检索]基于matlab音乐检索系统[含Matlab源码 435期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费专栏 ...

  9. 基于不同策略的英文单词的词频统计和检索系统(C++)

    文章目录 准备工作 一.实验目的 二.设计内容 三.测试数据 四.源程序清单 五.运行结果 5.1 程序运行结果 5.2 文件输出结果 六.关键算法 6.1 顺序表的顺序查找 6.2 单链表的顺序查找 ...

  10. java中的smm,java毕业设计_springboot框架的基于SMM框架的局域网文件共享及检索系统...

    这是一个基于java的毕业设计项目,毕设课题为springboot框架的基于SMM框架的局域网文件共享及检索系统, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse ...

最新文章

  1. Python 的练手项目有哪些值得推荐?
  2. JDK1.8源码(二)——java.lang.Integer 类
  3. 关于SimpleDateFormat时间转换总是显示1970年的问题
  4. MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...
  5. leetcode 1239. 串联字符串的最大长度
  6. Spring 异常处理三种方式
  7. mysql锁的基本类型_Mysql的锁
  8. 13 岁自学编程,提出演进式架构的她,成 ThoughtWorks CTO!
  9. java 折线_用Java绘制简单的折线图
  10. curl上传图片的大坑
  11. Atitit.web 视频播放器classid clsid 大总结quicktime,vlc 1. Classid的用处。用来指定播放器 1 2. object 标签用于包含对象,比如图像、音
  12. java 启动resin,Resin 启动时报错!解决方法
  13. WinCC界面中通过插件打开pdf文件
  14. L13过拟合欠拟合及其解决方案
  15. 木子-前端-方法标签属性小记(普通jsp/html篇)2020-11-24
  16. 上海博物馆——古代的邂逅
  17. 【推荐系统】如何解决冷启动问题
  18. http://www.hi-donet.com/网站
  19. 教你如何建立STM32F103通用工程模板(固件库)
  20. 回忆专用小马甲和泷泽萝拉为何钟情VR手机?

热门文章

  1. R语言使用Epi包的的ROC函数对多变量进行ROC分析并可视化ROC曲线、寻找最佳阈值(threshold、cutoff)、在可视化曲线中添加最佳阈值点
  2. python文件转换为pyd
  3. python推理拟合函数
  4. 有关龙的成语(词语)、故事、诗歌
  5. 实现memcmp函数
  6. 电脑怎么批量修改图片大小kb?
  7. clear linux
  8. GBK版本和UTF-8版本的区别
  9. Bazinga(HDU5510+KMP)
  10. DLL和EXE加载包在自身内部的资源文件