随笔

一、实验目的

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;
}

 

截图:

 

posted @ 2017-11-19 13:48  chendayuan  阅读(138)  评论(0编辑  收藏  举报