Напишите функции print() для класса UserQuery. Обоснуйте свой выбор того, что она выводит.

<p>17.8. Соберем все вместе</p>

Функция main() для нашего приложения текстового поиска выглядит следующим образом:

#include "TextQuery.h"

int main()

{

TextQuery tq;

tq.build_up_text();

tq.query_text();

}

Функция-член build_text_map() - это не что иное, как переименованная функция doit() из раздела 6.14:

inline void

TextQuery::

build_text_map()

{

retrieve_text();

separate_words();

filter_text();

suffix_text();

strip_caps();

build_word_map();

}

Функция-член query_text() заменяет одноименную функцию из раздела 6.14. В первоначальной реализации в ее обязанности входили прием запроса от пользователя и вывод ответа. Мы решили сохранить за query_text() эти задачи, но реализовать ее по-другому:

void

TextQuery::query_text()

{

/* локальные объекты:

*

* text: содержит все слова запроса

* query_text: вектор для хранения пользовательского запроса

* caps: фильтр для поддержки преобразования

* прописных букв в строчные

*

* user_query: объект UserQuery, в котором инкапсулировано

* собственно вычисление ответа на запрос

*/

string text;

string caps( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" );

vectorstring, allocator query_text;

UserQuery user_query;

// инициализировать статические члены UserQuery

NotQuery::all_locs( text_locations-second );

AndQuery::max_col( &line_cnt );

UserQuery::word_map( word_map );

do {

// удалить предыдущий запрос, если он был

query_text.clear();

cout "Введите запрос. Пожалуйста, разделяйте все его "

"элементы пробелами.\n"

"Запрос (или весь сеанс) завершается точкой ( . ).\n\n"

"== ";

/*

* прочитать запрос из стандартного ввода,

* преобразовать все заглавные буквы, после чего

* упаковать его в query_text ...

*

* примечание: здесь производятся все действия по

* обработке запроса, связанные собственно с текстом ...

*/

while( cin text )

{

if ( text == "." )

break;

string::size_type pos = 0;

while (( pos = text.find_first_of( caps, pos ))

!= string::npos )

text[pos] = tolower( text[pos] );

query_text.push_back( text );

}

// теперь у нас есть внутреннее представление запроса

// обработаем его ...

if ( ! query_text.empty() )

{

// передать запрос объекту UserQuery

user_query.query( &query_text );

// вычислить ответ на запрос

// вернуть иерархию Query*

// подробности см. в разделе 17.7

// query - это член класса TextQuery типа Query*

query = user_query.eval_query();

// вычислить иерархию Query,

// реализация описана в разделе 17.7

query-eval();

// вывести ответ с помощью

// функции-члена класса TextQuery

display_solution();

// вывести на терминал пользователя дополнительную

// пустую строку

cout endl;

}

}

while ( ! query_text.empty() );

cout "До свидания!\n";

}

Перейти на страницу:

Похожие книги