Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Наследование и подтипизация классов



В главе 6 для иллюстрации обсуждения абстрактных контейнерных типов мы частично реализовали систему текстового поиска и инкапсулировали ее в класс TextQuery. Однако мы не написали к ней никакой вызывающей программы, отложив реализацию поддержки формулирования запросов со стороны пользователя до рассмотрения объектно-ориентированного программирования. В этой главе язык запросов будет реализован в виде иерархии классов Query с одиночным наследованием. Кроме того, мы модифицируем и расширим класс TextQuery из главы 6 для получения полностью интегрированной системы текстового поиска.

Программа для запуска нашей системы текстового поиска будет выглядеть следующим образом:

#include " TextQuery.h"

 

int main()

{

TextQuery tq;

 

tq.build_up_text();

tq.query_text();

}

build_text_map() – это слегка видоизмененная функция-член doit() из главы 6. Ее основная задача – построить отображение для хранения позиций всех значимых слов текста. (Если помните, мы не храним семантически нейтральные слова типа союзов if, and, but и т.д. Кроме того, мы заменяем заглавные буквы на строчные и устраняем суффиксы, обозначающие множественное число: например, testifies преобразуется в testify, а marches в march.) С каждым словом ассоциируется вектор позиций, в котором хранятся номера строки и колонки каждого вхождения слова в текст.

query_text() принимает запросы пользователя и преобразует их во внутреннюю форму на основе иерархии классов Query с одиночным наследованием и динамическим связыванием. Внутреннее представление запроса применяется к отображению слов на вектор позиций, построенному в build_text_map(). Ответом на запрос будет множество строк текстового файла, удовлетворяющих заданному критерию:

 

Enter a query - please separate each item by a space.

Terminate query (or session) with a dot(. ).

 

==> fiery & & ( bird || shyly )

 

    fiery ( 1 ) lines match

    bird ( 1 ) lines match

    shyly ( 1 ) lines match

     ( bird || shyly ) ( 2 ) lines match

    fiery & & ( bird || shyly ) ( 1 ) lines match

 

Requested query: fiery & & ( bird || shyly )

 

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her.

 

В нашей системе мы выбрали следующий язык запросов:

· одиночное слово, например Alice или untamed. Выводятся все строки, в которых оно встречается, причем каждой строке предшествует ее номер, заключенный в скобки. (Строки печатаются в порядке возрастания номеров). Например:

 

==> daddy

 

daddy ( 3 ) lines match

 

Requested query: daddy

 

( 1 ) Alice Emma has long flowing red hair. Her Daddy says

( 4 ) magical but untamed. " Daddy, shush, there is no such thing, "

( 6 ) Shyly, she asks, " I mean, Daddy, is there? "

 

· запрос “НЕ”, формулируемый с помощью оператора!. Выводятся все строки, где не встречается указанное слово. Например, так формулируется отрицание запроса 1:

 

==> ! daddy

 

daddy ( 3 ) lines match

! daddy ( 3 ) lines match

 

Requested query: ! daddy

 

( 2 ) when the wind blows through her hair, it looks almost alive,

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her,

( 5 ) she tells him, at the same time wanting him to tell her more.

 

запрос “ИЛИ”, формулируемый с помощью оператора ||. Выводятся все строки, в которых встречается хотя бы одно из двух указанных слов:

 

==> fiery || untamed

 

   fiery ( 1 ) lines match

   untamed ( 1 ) lines match

   fiery || untamed ( 2 ) lines match

 

Requested query: fiery || untamed

 

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her,

( 4 ) magical but untamed. " Daddy, shush, there is no such thing, "

 

запрос “И”, формулируемый с помощью оператора & &. Выводятся все строки, где оба указанных слова встречаются, причем располагаются рядом. Сюда входит и случай, когда одно слово является последним в строке, а другое – первым в следующей:

 

==> untamed & & Daddy

 

   untamed ( 1 ) lines match

   daddy ( 3 ) lines match

   untamed & & daddy ( 1 ) lines match

 

Requested query: untamed & & daddy

 

( 4 ) magical but untamed. " Daddy, shush, there is no such thing, "

 

Эти элементы можно комбинировать:

 

fiery & & bird || shyly

 

Однако обработка производится слева направо, и все элементы имеют одинаковые приоритеты. Поэтому наш составной запрос интерпретируется как fiery bird ИЛИ shyly, а не как fiery bird ИЛИ fiery shyly:

 

==> fiery & & bird || shyly

 

   fiery ( 1 ) lines match

   bird ( 1 ) lines match

   fiery & & bird ( 1 ) lines match

   shyly ( 1 ) lines match

   fiery & & bird || shyly ( 2 ) lines match

 

Requested query: fiery & & bird || shyly

 

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her,

( 6 ) Shyly, she asks, " I mean, Daddy, is there? "

 

Чтобы можно было группировать части запроса, наша система должна поддерживать скобки. Например:

 

fiery & & (bird || shyly)

 

выдает все вхождения fiery bird или fiery shyly1. [O.A.5] Результат исполнения этого запроса приведен в начале данного раздела. Кроме того, система не должна многократно отображать одну и ту же строку.


Поделиться:



Последнее изменение этой страницы: 2019-04-09; Просмотров: 286; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.02 с.)
Главная | Случайная страница | Обратная связь