Результаты работы программы

Задание 5

Организация программ с использованием шаблонов

Цель задания

1. Изучение средств языка С++, используемых для создания параметрических типов, т.е. типов, которые выполняются по-разному в зависимости от параметров, переданных при создании класса.

2. Получение навыков в написании программ с использованием шаблонов.

Варианты задания

1. Создать шаблон класса «стек». Использовать его при решении следующей задачи:

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

2. Создать шаблон класса «стек». Использовать его при решении следующей задачи:

Составить программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо открыт, либо закрыт. Вход в закрытый квадрат запрещен. Если квадрат открыт, то вход в него возможен со стороны, но не с угла. Каждый квадрат определяется его координатами в матрице. Программа находит проход через лабиринт, двигаясь от заданного входа. После отыскания прохода программа выводит найденный путь в виде координат квадратов. Для хранения пути использовать стек.

3. Создать шаблон класса «стек». Использовать его при решении следующей задачи:

Гаражная стоянка имеет одну стояночную полосу, причем въезд и выезд находятся в одном конце полосы. Если владелец автомашины приходит забрать свой автомобиль, который не является ближайшим к выходу, то все автомашины, загораживающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном порядке. Написать программу, которая моделирует процесс прибытия и отъезда машин. Прибытие или отъезд автомашины задается командной строкой, которая содержит признак прибытия или отъезда и номер машины. Программа должна выводить сообщение при прибытии или выезде любой машины. При выезде автомашины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.

4. Создать шаблон класса «однонаправленный линейный список». Использовать его при решении задачи:

Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Сведения о каждом автобусе содержат:

номер автобуса;

фамилию и инициалы водителя;

номер маршрута.

Программа должна обеспечивать:

начальное формирование данных о всех автобусах в парке в виде списка;

при выезде каждого автобуса из парка вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся в парке, и записывает эти данные в список автобусов, находящихся на маршруте;

при въезде каждого автобуса в парк вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся на маршруте, и записывает эти данные в список автобусов, находящихся в парке;

по запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте.

5. Создать шаблон класса «однонаправленный линейный список». Использовать его при решении следующей задачи:

Составить программу, которая содержит динамическую информацию о заявках на авиабилеты. Каждая заявка содержит:

пункт назначения;

номер рейса;

фамилию и инициалы пассажира;

желаемую дату вылета.

Программа должна обеспечивать:

хранение всех заявок в виде списка;

добавление заявок в список;

удаление заявок;

вывод заявок по заданному номеру рейса и дате вылета;

вывод всех заявок.

 

6. Создать шаблон класса «бинарное дерево». Использовать его при решении следующей задачи:

Составить программу, которая содержит текущую информацию о книгах в библиотеке.

Сведения о книгах содержат:

номер УДК;

фамилию и инициалы автора;

название;

год издания;

количество экземпляров данной книги в библиотеке.

Программа должна обеспечивать:

начальное формирование данных о всех книгах в библиотеке в виде двоичного дерева;

добавление данных о книгах, вновь поступающих в библиотеку; удаление данных о списываемых книгах;

по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.

7. Создать шаблон класса «бинарное дерево». Использовать его при решении следующей задачи:

Составить программу, которая содержит текущую информацию о заявках на авиабилеты. Каждая заявка содержит:

пункт назначения;

номер рейса;

фамилию и инициалы пассажира;

желаемую дату вылета.

Программа должна обеспечивать:

хранение всех заявок в виде двоичного дерева;

добавление и удаление заявок;

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

вывод всех заявок.

8. Создать шаблон класса «бинарное дерево». Использовать его для сортировки целых чисел и строк, задаваемых с клавиатуры или из файла.

9. Создать шаблон класса «очередь». Написать программу, демонстрирующую работу с этим шаблоном для различных типов параметров шаблона. Программа должна содержать меню, позволяющее осуществить проверку всех методов шаблона.

10. Создать шаблон класса «очередь с приоритетами». При добавлении элемента в такую очередь его номер определяется его приоритетом. Написать программу, демонстрирующую работу с этим шаблоном для различных типов параметров шаблона. Программа должна содержать меню, позволяющее осуществить проверку всех методов шаблона.

Пример выполнения задания

Постановка задачи

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

Исходный текст программы

#include <iostream>

const int DefaultSize = 10;

//объявление простого класса Animal, чтобы получить

// возможность создать массив животных

class Animal

{ public:

Animal(int);

Animal( );

~Animal( ) {}

int GetWeight( ) const { return itsWeight; )

void Display( ) const { std::cout < < itsWeight; }

private:

int itsWeight; };

Animal : : Animal(int weight) : itsWeight(weight) {…}

Animal::Animal( ) : itsWeight(0) { }

template <class T> // объявлен шаблон, параметром которого является тип,

// обозначенный идентификатором T

// параметрический класс

class Array

{ public:

// конструкторы

Array(int itsSize = DefaultSize); //принимает в качестве

//параметра размер целого числа, устанавливаемый по

//умолчанию константой DefaultSize

Array(const Array &rhs);

~Array() { delete [ ] pType; }

// операторы

Array& operator = (const Array&); //присвоения

//непостоянная версия оператора индекса

T& operator [ ] (int offSet) { return pType [ offSet ]; }

//постоянная версия оператора индекса

const T& operator [ ] (int offSet) const { return pType [ offset ]; }

// член-функции

int GetSize( ) const { return itsSize; }// возвращает размер массива

private:

Т *рТуре;

int itsSize; };

// далее следует реализация ...

// реализация конструктора

template <class T>

Аггау<Т> : : Array(int size):

itsSize(size)

{ рТуре = new T[ size ];

for (int i = 0; i < size; i++)

pType[ i ] = 0; }

 

// конструктор копий

template <class T>

Array<T> : : Array(const Array &rhs)

{ itsSize = rhs.GetSize( );

pType = new T[ itsSize ];

for (int i = 0; i < itsSize; i++)

pType[ i ] = rhs[ i ]; }

 

// operator ‘=’

template <class T>

Array<T>& Array<T> : : operator=(const Array &rhs)

{ if (this == &rhs)

return *this;

delete [ ] pType;

itsSize = rhs. GetSize( );

pType = new T[ itsSize ];

for (int i = 0; i < KitsSize ; i++)

pType [ i ] = rhs [ i ] ;

return *this; }

// основная программа

int main()

{ Array<int> theArray; // массив целых чисел

Array<Animal> theZoo; // массив животных

Animal *pAnimal;

// заполнить массивы

for (int i = 0; i < theArray. GetSize( ); i++)

{ theArray[ i ] = i*2;

pAnimal = new Animal(i*3);

theZoo[ i ] = *pAnimal;

delete pAnimal;

}

// вывести на экран содержимое массивов

for (int j = 0; j < theArray.GetSize( ); j++)

{

Std : : cout << "theArray ["<< j << "]:\t";

Std : : cout << theArray[j] << "\t\t";

Std : : cout << "theZoo [" << j << "]:\t";

theZoo[j].Display( );

std : : cout << std : : endl;

}

return 0;

}

Результаты работы программы

theArray [0] : 0 theZoo [0] : 0

theArray [1] : 2 theZoo [0] : 3

theArray [2] : 4 theZoo [0] : 6

theArray [3] : 6 theZoo [0] : 9

theArray [4] : 8 theZoo [0] : 12

theArray [5] : 10 theZoo [0] : 15

theArray [6] : 12 theZoo [0] : 18

theArray [7] : 14 theZoo [0] : 21

theArray [8] : 16 theZoo [0] : 24

theArray [9] : 18 theZoo [0] : 27