【问题描述】

将哈利波特的7本书(txt格式)读入,然后在指定了人名/地名后,显示查询结果,选择指定查询结果序号(选择查询内容),能够显示指定查询结果所在位置前后的一段文字。

【输入形式】

哈利波特的7本书,txt文件

【输出形式】

人名/地名输出:

显示查找到的人名/地名,以及出现的页码和章节,书名, 按照出现的页码顺序显示,每个查询结果都对应序号。

序号 人名/地名 页码 章节 书名

1 Harry 1 1 Harry_Potter_and_the_Chamber_of_Secrets_Book_2

选择查询结果记录项时,显示指定的人名/地名位置前后的一段文字。

选择序号,或者单击查询记录行,能够显示到指定位置人名/地名前后的一段文字。如选择序号1,应显示:

Not for the first time, an argument had broken out over breakfast at number four, Privet Drive. Mr. Vernon Durs-

ley had been woken in the early hours of the morning by a loud, hooting noise from his nephew Harry’s room.

设计思路

首先,需要读入txt中的内容。使用ifstream函数打开txt文件,这里我选择的是STL容器的vector存储内容,长度可以随意添加,且可以使用下标查找。由于题中要求输出页码,章节,书名,所以需要对每一个单词记录页码,章节,书名。我是以行为单位,定义一个结构体,储存某一行的内容,页码,章节,书名。对txt中的内容逐行读入,如果是一个数字,就说明是页码,如果包含chapter就说明是章节编号,其余就是书中的内容,都与其之前的页码和章节相同,加入到定义的vector变量的末尾。内容用string类型存储,对于字符串匹配较为方便。
所有内容读取完之后,接下来就是查找了。查找使用string的find函数即可,会返回查找到的下标,如果找不到就会返回nops。再定一个vector数组,储存查找到的下标,以便之后根据标号查找上下文。
最后按照vector数组中的存储顺序输出下标加1,页码,章节,书名即可。如果要查找某一个的上下文,那么输出其下标+1,下标,下标-1对应的内容即可。
另外,我还制作了查找程序的界面,可以实现使用鼠标点击进入想要的功能。使用了EasyX图形库实现,我是以背景为分隔,不同的背景对应着不同的操作,实现功能的转换。主要的操作主要有鼠标点击切换,指定位置输出,用户输入信息。然后其余的就使用图形库中的函数均可实现。

点击下载
(和下面贴出的代码是一样的,只是多了图片,素材等)

代码

#include<iostream>
#include<windows.h>
#include<graphics.h>
#include<conio.h>
#include<string>
#include<vector>
#include<fstream>
#include<algorithm>
#include<cstring>#pragma warning(disable : 4996)                              //sprintf()函数的使用会警告,将警告忽略using namespace std;int picture_bk;                                             //控制背景切换到哪个
bool change_bk;                                             //控制背景切换
wchar_t tpattern[20];                                       //待查找字符串
char pattern[20];                                           //待查找字符串
bool isInput;                                               //控制是否输入
int showPage;                                               //结果显示页码
int dataNum;                                                //结果每一页的数量
bool isShowReslut;                                          //是否显示结果
int nfind;                                                  //要查找的序号IMAGE img_background1;                                      //欢迎背景
IMAGE img_background2;                                      //功能选择背景
IMAGE img_background3;                                      //检索背景
IMAGE img_background4;                                      //帮助背景
IMAGE img_background5;                                      //关于背景
IMAGE img_background6;                                      //显示结果背景
IMAGE img_background7;                                      //查询详细信息背景
IMAGE img_background8;                                      //详细信息显示背景struct Text                                                   //文章一行的信息
{string content;string bookName;int page=0;int chapter=0;
};vector<Text>save_book;                                      //存书
vector<int>text_index;                                        //查询到的下标void startup();                                             //数据初始化
void readBook();                                            //获取所有书的内容
void getText(string book_name);                             //获取一本书的内容
void search();                                              //查找字符串
void showResult();                                          //显示搜索结果
void show();                                                //显示
void backgroundShow();                                      //改变背景
void control();                                             //操作
void bk2Control();                                          //操作2
void bk3Control();                                          //操作3
void bk45Control();                                         //操作45
void bk6Control();                                          //操作6
void bk7Control();                                          //操作7
void bk8Control();                                          //操作8int main()
{startup();                                             //初始化readBook();                                                //读入txtSetConsoleOutputCP(65001);                               //防止乱码while (1){show();control();}
}void startup()                                                 //数据初始化
{picture_bk = 1;change_bk = 1;isInput = 1;showPage = 1;dataNum = 13;initgraph(820, 615);                                       //定义画布大小loadimage(&img_background1, _T(".\\picture\\background2.jpg"));//载入图片loadimage(&img_background2, _T(".\\picture\\background3.jpg"));loadimage(&img_background3, _T(".\\picture\\background4.jpg"));loadimage(&img_background4, _T(".\\picture\\background5.jpg"));loadimage(&img_background5, _T(".\\picture\\background6.jpg"));loadimage(&img_background6, _T(".\\picture\\background7.jpg"));loadimage(&img_background7, _T(".\\picture\\background4.jpg"));loadimage(&img_background8, _T(".\\picture\\background4.jpg"));
}void readBook()                                                    //获取所有书的内容
{                                                               //重复操作,调用函数实现getText("J.K. Rowling - HP 0 - Harry Potter Prequel");getText("J.K. Rowling - HP 2 - Harry Potter and the Chamber of Secrets");getText("J.K. Rowling - HP 3 - Harry Potter and the Prisoner of Azkaban");getText("J.K. Rowling - HP 4 - Harry Potter and the Goblet of Fire");getText("J.K. Rowling - HP 6 - Harry Potter and the Half-Blood Prince");getText("J.K. Rowling - HP 7 - Harry Potter and the Deathly Hallows");getText("J.K. Rowling - Quidditch Through the Ages");getText("J.K. Rowling - The Tales of Beedle the Bard");
}                                                               void getText(string book_name)                                  //获取一本书的内容
{string pname = ".\\TXT\\"+book_name + ".txt";               //加上路径和扩展名ifstream fs(pname.c_str());                                   //打开txt文件if (!fs)                                                   //打开失败,退出{cout << "文本读取错误!!!" << endl;exit(1);}Text temp_text;                                             //临时存储texttemp_text.bookName = book_name;                              //书名不变temp_text.chapter = 0;                                       //开始为0temp_text.page = 1;                                          //因为页码最后显示,初始为1string line;while (getline(fs, line))                                 //逐行读入{int len = line.length();if (len <= 3 && line[0] >= '1' && line[0] <= '9')       //页码{temp_text.page++;continue;}else if (len < 20)                                     //判断是否是章节编号if (line.substr(0, 7) == "chapter" || line.substr(0, 7) == "CHAPTER"){temp_text.chapter++;continue;}if (len < 3)continue;temp_text.content = line;save_book.push_back(temp_text);                          //不是页码和章节编号,加入数组}
}void search()                                                  //查找字符串
{int tot = save_book.size();                                   //文件总行数int cnt = 0;string::size_type nnpos = string::npos;                        //未查找到的返回值while (cnt < tot){string::size_type position = save_book[cnt].content.find(pattern);if (position != nnpos)                                   //查找到,加入答案数组text_index.push_back(cnt);cnt++;}
}void showResult()
{int cnt = dataNum * (showPage - 1);                           //该页的起始答案编号int tot = dataNum * showPage;                               //末尾编号if (tot > text_index.size())                               //可能该页不满,避免越界tot = text_index.size();if (text_index.size()== 0)                                   //长度为0,说明没有查找到{settextstyle(80, 40, _T("黑体"));                     //设置字体格式outtextxy(240, 270, "Not found!");                        //指定位置输出return;}else if (tot <= 0||tot<cnt||cnt<0)                            //翻到第一页之前或最后一页之后{settextstyle(40, 20, _T("黑体"));outtextxy(100, 240, "Please return to the previous page");return;}int distance = 30;                                           //每一行输出的间距for (int i = cnt; i < tot; i++){int pos = text_index[i];TCHAR s[30];_stprintf(s, _T("%d"),i+1);                             //将序号转换为TCHAR型settextstyle(20, 10, _T("黑体"));outtextxy(10, 90+distance*(i-cnt), s);                  //指定位置输出outtextxy(70, 90+distance * (i - cnt), pattern);_stprintf(s, _T("%d"),save_book[pos].page );outtextxy(160, 90+distance * (i - cnt), s);_stprintf(s, _T("%d"), save_book[pos].chapter);outtextxy(215, 90+distance * (i - cnt), s);char ss[150];int j;string str = save_book[i].bookName;for (j = 0; j < str.length(); j++)                     //sting转换为char型数组ss[j] = str[j];ss[j] = '\0';settextstyle(16, 8, _T("黑体"));outtextxy(290, 90 + distance * (i - cnt), ss);}
}void show()
{if (change_bk)                                             //是否需要更换背景{backgroundShow();                                        //更换背景change_bk = 0;                                           //控制变量更新}
}void backgroundShow()                                          //背景切换
{if (picture_bk == 1)                                     //欢迎背景{putimage(0, 0, &img_background1);                        //应用图片Sleep(2000);                                          //停留2spicture_bk = 2;                                          //直接切换到背景2}if (picture_bk == 2)                                       //选择功能背景putimage(0, 0, &img_background2);                       else if (picture_bk == 3)                                 //检索背景putimage(0, 0, &img_background3);else if (picture_bk == 4)                                  //帮助背景putimage(0, 0, &img_background4);else if (picture_bk == 5)                                  //关于背景putimage(0, 0, &img_background5);else if (picture_bk == 6)                                  //结果背景putimage(0, 0, &img_background6);else if (picture_bk == 7)                                  //查询背景putimage(0, 0, &img_background7);else if (picture_bk == 8)                                  //详细背景putimage(0, 0, &img_background8);
}void control()                                                 //操作
{if (picture_bk == 2)                                     //每个背景对应操作bk2Control();else if (picture_bk == 3)bk3Control();else if (picture_bk == 4)bk45Control();else if (picture_bk == 5)bk45Control();else if (picture_bk == 6)bk6Control();else if (picture_bk == 7)bk7Control();else if (picture_bk == 8)bk8Control();
}void bk2Control()                                              //操作2
{MOUSEMSG m;                                                    //鼠标信息if (MouseHit())                                               //鼠标动了{m = GetMouseMsg();                                      //获取鼠标信息if (m.uMsg == WM_LBUTTONDOWN)                         //按下左键{if (m.x >= 300 && m.x <= 520 && m.y <= 260 && m.y >= 210){                                                   //点击指定位置picture_bk = 3;                                    //检索change_bk = 1;                                 //更新控制变量}else if (m.x >= 300 && m.x <= 520 && m.y <= 325 && m.y >= 280){                                                    picture_bk = 4;                                    //帮助change_bk = 1;}else if (m.x >= 360 && m.x <= 460 && m.y <= 400 && m.y >= 350){picture_bk = 5;                                 //关于change_bk = 1;}else if (m.x <= 820 && m.x >= 720 && m.y <= 615 && m.y >= 565)exit(1);                                      //退出}}
}void bk3Control()                                              //操作3
{                                                               //输入框InputBox(pattern,20, "请输入要查找的人名/地名                      (不要多打回车哦)",NULL,NULL,300,150);text_index.clear();                                          //清空上一次结果下标search();                                                    //查找picture_bk = 6;                                                //更换至结果显示背景change_bk = 1;isShowReslut = 1;                                            //控制变量更新showPage = 1;                                              //初始显示页码为1
}void bk45Control()                                             //4,5对应操作相同
{MOUSEMSG m;if (MouseHit()){m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN)                      {if (m.x <= 820 && m.x >= 720 && m.y <= 615 && m.y >= 565){                                                 //返回至功能选择picture_bk = 2;change_bk = 1;                                    }}}
}void bk6Control()                                              //操作6
{if (isShowReslut)                                          //结果输出{showResult();isShowReslut = 0;}MOUSEMSG m;if (MouseHit()){m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN){if (m.x <= 820 && m.x >= 720 && m.y <= 615 && m.y >= 565)  {                                                   //返回功能选择picture_bk = 2;change_bk = 1;}else if (m.x>=410&&m.x<=810&&m.y>=0&&m.y<=50)       //详细详细信息{picture_bk = 7;change_bk = 1;}else if (m.x>=682&&m.x<=810&&m.y>=510&&m.y<=570)   //下一页{picture_bk = 6;change_bk = 1;isShowReslut = 1;showPage++;                                        //页码加1}else if (m.x>=0&&m.x<=140&&m.y>=510&&m.y<=570)       //上一页   {picture_bk = 6;change_bk = 1;isShowReslut = 1;showPage--;}else if (m.x >= 210 && m.x <= 610 && m.y >= 570 && m.y <= 615){                                                   //重新查询picture_bk = 3;change_bk = 1;}}}
}void bk7Control()                                              //操作7
{char pfind[100];                                           //输入框InputBox(pfind, 20, "请输入要查找的序号                               (不要多打回车哦)", NULL, 0, 300, 150);nfind = 0;if (*pfind != '0'){for (int i = 0; pfind[i] != '\0'; i++)                  //转换为整型nfind = nfind * 10 + (int)(pfind[i] - '0');                              }nfind--;                                                   //下标为序号减一picture_bk = 8;                                               //显示详细信息change_bk = 1;
}void bk8Control()
{MOUSEMSG m;if (MouseHit()){m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN){if (m.x <= 820 && m.x >= 720 && m.y <= 615 && m.y >= 565){picture_bk = 6;                                   //返回至结果显示change_bk = 1;isShowReslut = 1;}}}char s[5000];                                              //存储上下文int i=0;int k = 0;if (nfind<0||nfind >=text_index.size())                       //输入的查询序号越界{settextstyle(20, 10, _T("黑体"));outtextxy(230, 230, "information you entered is incorrect"); picture_bk = 7;                                            change_bk = 1;Sleep(2500);                                         //提示信息停留两秒return;                                                   //越界退出该函数}int j = text_index[nfind];if(j-1>=0)                                                 //获取上下文,注意越界for (i = 0; i < save_book[j-1].content.length(); i++)s[i] = save_book[j-1].content[i];for (k=i; i-k < save_book[j].content.length();i++)s[i] = save_book[j].content[i-k];/*if(j+1<save_book.size())for (k = i; i - k < save_book[j+1].content.length(); i++)s[i] = save_book[j+1].content[i-k];*/s[i] = '\0';setbkmode(TRANSPARENT);                                       //设置显示字体背景透明RECT r = { 100,100 ,610,500 };                             //显示框大小drawtext(s, &r, DT_WORDBREAK);                               //显示格式
}

课程作业 哈利波特文章检索系统相关推荐

  1. 一个简单的blog系统(十一) 增加文章检索功能

    一个简单的blog系统(十一) 增加文章检索功能 1. 现在,我们就来给博客添加文章检索功能.假定,可以根据关键字魔木查询文章标题,也就是说支持正则表达式,而且字母不会区分大小写. 1.1 首先,我们 ...

  2. 计算机控制作业及答案,《微机系统与维护》课程作业及答案(二)

    中央广播电视大学计算机网络技术专业(专科) <微机系统与维护>课程作业(二) 第3章 微机组装技术 一.单项选择题 1. 为了避免人体静电损坏微机部件,在维修时可采用(  B)来释放静电. ...

  3. SpringBoot SSM vue课程作业在线批阅系统

    ​​​​​​​ SpringBoot SSM vue课程作业在线批阅系统 登录 新闻公告 在线留言 课程管理 指定课代表 作业下发 作业审批 评分 在线预览 所列功能完整 使用技术: SpringBo ...

  4. 基于Android的课程作业,基于Android的大学生个人课程助理系统的设计与实现

    摘要: 为了提高同学们的学习积极性,各个高校纷纷提供选课系统供大学生选择自己感兴趣的课程进行学习,激发同学们学习热情的同时,也带来一些课程管理方面的问题.公共课的同学来自不同的专业和院系,导致大家比较 ...

  5. 航班信息查询和检索系统-数据结构课程设计

    问题及代码: 设计并实现一个航班信息查询和检索系统.要求:对飞机航班信息进行排序和查找,可按照航班号.起点站.到达站.起飞时间和到达时间等信息进行查询.航班信息表的样式如下: 航班号 起点站 终点站 ...

  6. 飞机订票系统c语言大作业,c语言课程设计---飞机订票系统

    <c语言课程设计---飞机订票系统>由会员分享,可在线阅读,更多相关<c语言课程设计---飞机订票系统(46页珍藏版)>请在皮匠网上搜索. 1.C 语言程序设计课程设计报告设计 ...

  7. 航班信息查询和检索系统

    课程设计 哈夫曼编码/译码器 教室数据管理 电网建设造价计算 计算机竞赛管理系统 文章目录 一.设计任务及要求 二.设计导向 1. 设计目的 2. 总体设计方案 3. 详细设计 4. 系统测试与结果分 ...

  8. 如何提高论文被SCI,EI,ISTP三大检索系统收录的几率??

    如何提高论文被SCI,EI,ISTP三大检索系统收录的几率?? 近年来,在对个人或单位科研水平.学术成就的评价指标中,个人或团体单位所发表论文在三大检索系统中的收录量被作为主要评价指标.那么何为三大检 ...

  9. 【课程作业】发电及互联系统可靠性计算程序说明文档

    本文为电力系统可靠性课程编程大作业的程序说明文档,可靠性的计算方式为通过构建停运表形成发电系统及互联系统的裕度表,并计算可靠性指标.关于电力系统可靠性的概念.计算方式等将不会在本文说明. 在此分享程序 ...

最新文章

  1. qcustomplot 游标吸附_qcustomplot游标测量功能--Apple的学习笔记
  2. 机器学习的5个常见痛点及解决方法
  3. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-上
  4. java 反射应用_java反射(二)--反射应用案例
  5. lstm 输入数据维度_LSTM 股票市场预测入门
  6. matplotlib设置线条的样式、颜色
  7. 搜狗发布全球首位 3D AI 主播,背后分身技术有玄机
  8. Nginx1.10编译安装
  9. Java:装饰设计模式
  10. 用 VC++ 调用最小的浏览器内核创建一个简易的浏览器
  11. Manjaro下安装和美化i3wm,以及相关软件配置
  12. 设置后台事务的执行人
  13. python通过文件头识别音频格式
  14. Vscode运行Demo程序出现错误
  15. 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法
  16. 岁月让人从批判走向了建设
  17. 笔记本电脑配备支架有什么作用吗
  18. win10系统安装到服务器失败怎么回事,U盘安装win10系统失败,提示Windows无法安装怎么办...
  19. 墨刀实现区域内滚动效果
  20. 肺炎期间,送上一份家庭健身计划

热门文章

  1. 中易云嵌入式工业主机-低功耗工业控制智能终端
  2. 【纪中集训2019.3.15】恶熊咆哮
  3. NLP错别字识别(附代码和模型和服务,可在线测试)
  4. struct lnode是什么结构类型_练字应该练什么之:汉字基本结构的类型
  5. 图像中出现的“鬼影”和“重影”区分
  6. ios中图层的用法(1)
  7. linux was 读音,linux正确读音
  8. win10磁盘管理_Win10系统如何分区
  9. 视频会议时对方无法听清楚我的声音(解决办法)
  10. 3万字英国留学生Java后台面经,中offer率5/7 精