Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

6.11 Дополнительные задания

При выполнении данных заданий может потребоваться также материал главы 8.

6.11.1 Шаблон Iterator

Разработать итераторы для перебора символов, слов, предложений и подстрок в заданной строке. Приблизительный интерфейс класса-контейнера представлен в следующем фрагменте кода.

1. Итератор символов последовательно перебирает все символы в тексте.

2. Итератор слов перебирает все слова. Разделителем слов будет выступать символ или последовательность символов, отличных от букв.

3. Итератор предложений. Последовательно перебирает все предложения текста. Текст может быть разделен на предложения точкой, вопросительным и восклицательным знаком.

4. Итератор подстрок. Последовательно перебирает все заданные подстроки. Подстрока передается в качестве параметра в функцию begin(), соответствующую данному итератору.

class TextContainer

{

public:

CharIterator beginChar();

CharIterator endChar();

SubStringIterator beginSubString(std::string substring);

SubStringIterator endSubString(std::string substring);

WordIterator beginWord();

WordIterator endWord();

SentenceIterator beginSentence();

SentenceIterator endSentence();

};

6.11.2 Шаблон Observer

Разработать класс TextManager, позволяющий хранить и изменять некоторый текст. Данный класс, помимо возможностей хранения и изменения текста, должен хранить список наблюдателей. При изменении текста должны оповещаться все наблюдатели, которые зарегистрированы в менеджере.

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

1. Расчет количества слов.

2. Расчет количества вхождений заданного слова.

3. Поиск самого длинного предложения в тексте.

Наблюдатели должны получать доступ к тексту через итераторы.

6.11.3 Шаблоны Command и Observer

1. Доработать пример шаблона Command. Добавить команды:

Swap − поменять местами элементы (int index1, int index2)

Change − изменить значение элемента по индексу (int index, int value)

Команды должны поддерживать возможность отмены.

2. Добавить возможность наблюдения за изменяемым объектом (массивом) по аналогии с шаблоном Observer. В отличие от рассмотренной реализации шаблона Observer, наблюдатели должны иметь возможность реагировать на определенные типы событий. Для этого вместо одной виртуальной функции Observer::update() нужно добавить несколько виртуальных функций для каждого типа событий.

Изменение значения элементов массива Observer::valuesChanged();

Изменение порядка следования элементов Observer::orderChanged();

Удаление элемента из массива Observer::valueErased();

Добавление элемента в массив Observer::valueAdded();

Разработать классы-слушатели, которые будут реагировать на указанные события.

6.11.5 Шаблон Visitor

Разработать класс − коллекцию для объектов определенного типа (автомобили, продукты, студенты, сотрудники и так далее). На основе шаблона Visitor разработать механизм выполнения запросов к коллекции.

Разработать минимум по одному запросу каждого типа:

1. Запросы для выбора объектов с заданными характеристиками (например, выбрать всех студентов с фамилией Иванов).

2. Запрос на изменение характеристик объектов (например, изменить номер курса для всех студентов).

3. Запрос, осуществляющий расчет по характеристикам объектов − среднее, максимальное, минимальное значение (например, рассчитать средний возраст студентов).

Запросы реализуются в виде посетителей. Класс коллекции предоставляет механизм для обхода всех объектов посетителем.

За основу можно взять рассмотренный пример шаблона Visitor.