Вариант 3

Стоимость

30 баллов

Описание

Спроектировать библиотеку коллекций для языка C++. Под коллекцией, в данном контексте, понимается "программный объект, содержащий в себе, тем или иным образом, набор значений одного или различных типов, и позволяющий обращаться к этим значениям." (см. http://ru.wikipedia.org/wiki/Коллекция_данных)

Создаваемая вами библиотека должна состоять из трех "слоев":

  • Слой абстрактных типов данных (верхний). Слой состоит из описаний интерфейсов основных видов коллекций и стратегий доступа: множество, стек, дек, очередь, ассоциированный массив и т.д.
  • Слой структур данных (самый нижний). На этом слое располагаются реализации типовых струкур данных: динамический список, массив, АВЛ-дерево, красно-черное дерево и т.д.
  • Слой реализаций (промежуточный), на котором располагаются классы, предлагающие реализацию того или иного типа данных на основе заданной структуры хранения. Например, на этом слое может находиться класс ArrayStack, реализующий абстрактный тип данных стек на основе структуры данных массив или ListMap, реализующий ассоциативный массив на основе структуры данных связный список.

При проектировании и описании библиотеки следует обратить внимание на различие между интерфейсом коллекции, задающим ее назначение и способ использования, и конкретной реализацией (разница между "множеством вообще" и различными реализациями множества - на основе деревьев, хэш-таблиц и т.д.). Множество, фактически, является интерфейсом, поддерживающим набор стандартных операций (добавление элемента, проверка на наличие, удаление элемента, сложение с другим множеством и т.д.), реализовываться эти операции могут различным образом в зависимости от структур данных, лежащих в основе.

Необходимо разработать интерфейсы следующих коллекций: множество, ассоциированный массив, очередь и стек. Предложить реализации всех коллекций, основанные на массиве переменной длины. Массив переменной длины реализовать самостоятельно (не использовать std::vector и т.д.).

[Внимание]Внимание

Коллекции должны быть реализованы БЕЗ ПРИМЕНЕНИЯ МЕХАНИЗМА ШАБЛОНОВ (TEMPLATES) C++. То есть, коллекции должны быть ориентированы на хранение объектов, являющихся наследниками одного (базового) класса. Необходимо также определить интерфейс этого базового класса.

Защита

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

  • Работающую программу (причем, описания структур должны быть вынесены в заголовочные файлы, а их определение - в соответствующие .cpp-модули).
  • Диаграмму классов. Для каждого реализованного класса должны быть показаны все операции и атрибуты, причем для каждой операции должна быть показана сигнатура и спецификатор доступа.
  • Набор юнит-тестов, выполненных с помощью CppUnitLite.

Пример

Разработанная библиотека должна допускать, например, такое использование:

/*...*/

int main() {

	/* Создается экземпляр множества, основанного на массиве.
	   Указатель на множество сохраняется в переменной абстрактного типа
	   Set (если мы в будущем захотим изменить реализацию множества, то
	   достаточно будет изменить лишь ArraySet в этой строке на новый).
	 */	
	Set *s = new DynamicArraySet();

	/* Класс IntObject - наследник абстрактного класса Object, предназначенный
	   для хранения чисел типа int. Параметром конструктора является 
	   само число.
	 */
	Object *o = new IntObject(5);
	/* Добавляем созданный экземпляр в множество */
	s->add(o);

	Object *o = new IntObject(6);
	s->add(o);

	Object *o = new IntObject(5);

	/* Операция contains возвращает истину, если множество содержит
	   объект 
	 */
	if (s->contains(o)) cout << "As expected\n"; else cout << "Something wrong\n";

	/* Удаляем объект
	 */
	s->remove(o);

	if (s->contains(o)) cout << "Something wrong\n"; else cout << "As expected\n";

	delete s;

	return 0;
}
Сайт управляется системой uCoz