随笔
一、实验目的
1.理解不同体系结构风格的具体内涵。
2.学习体系结构风格的具体实践。
二、实验环境
硬件: (依据具体情况填写)
软件:Java或任何一种自己熟悉的语言
三、实验内容
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。
尝试用不同的策略实现这个系统。选择2-3种体系结构风格来实现。
四、实验步骤:
一、面向对象程序风格
体系结构图:
首先按照行来读取,每行由若干单词组成,然后将所有行所有的可能移位结果放在一起进行排序,最后输出即可。
读取-》分割-》排序-》输出
代码:
#include <iostream> #include <cstring> #include <vector> using namespace std; struct line { vector<string> vs; } L; vector<line> vl; struct words { int vl_pos, vs_pos; }; vector<words> vw; bool cmp(const words &a, const words &b) { line La, Lb; for (int i = a.vs_pos; i < vl[a.vl_pos].vs.size(); i++) { La.vs.push_back(vl[a.vl_pos].vs[i]); } for (int i = 0; i < a.vs_pos; i++) { La.vs.push_back(vl[a.vl_pos].vs[i]); } for (int i = b.vs_pos; i < vl[b.vl_pos].vs.size(); i++) { Lb.vs.push_back(vl[b.vl_pos].vs[i]); } for (int i = 0; i < b.vs_pos; i++) { Lb.vs.push_back(vl[b.vl_pos].vs[i]); } int len = min((int)La.vs.size(), (int)Lb.vs.size()); for (int i = 0; i < len; i++) { if (La.vs[i] != Lb.vs[i]) { return La.vs[i] < Lb.vs[i]; } } return La.vs.size() < Lb.vs.size(); } string word; int main() { while (cin >> word) { L.vs.push_back(word); if (getchar() == '\n') { vl.push_back(L); L.vs.clear(); } } for (int i = 0; i < vl.size(); i++) { for (int j = 0; j < vl[i].vs.size(); j++) { vw.push_back({i, j}); } } sort(vw.begin(), vw.end(), cmp); for (int i = 0; i < vw.size(); i++) { int vl_pos = vw[i].vl_pos, vs_pos = vw[i].vs_pos; int vs_sz = (int)vl[vw[i].vl_pos].vs.size(), c = 0; for (int j = vs_pos; j < vs_sz; j++) { c++; cout << vl[vl_pos].vs[j] << (c == vs_sz ? '\n' : ' '); } for (int j = 0; j < vs_pos; j++) { c++; cout << vl[vl_pos].vs[j] << (c == vs_sz ? '\n' : ' '); } } return 0; }
截图: