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

Лабораторная работа № 4

Шаблоны классов

Теоретическое описание.

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

Определение функции с ключевым словом template (шаблон)

имеет вид:

template<class Ttype>тип имя_функции(список аргументов)

{//тело функции}

Здесь Ttype – фиктивный тип, который используется при объявлении аргументов и локальных переменных функции. Компилятор заменит этот фиктивный тип на один из реальных и создаст соответственно несколько перегружаемых функций. При этом перегружаемые функции являются ограниченными, поскольку выполняют одни и те же действия над данными различных типов.

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

template <class Ttype> class имя_класса {

//имена класса, поля класса

}

Здесь Ttype – фиктивное имя типа, которое заменится компилятором на фактическое. Шаблон класса может иметь больше одного родового типа данных:

template<class Type1,class Type2> class m {Type1 a;Type2 b;}

Пример. Создается шаблон класса для работы с односвязным спи- ском. Тестирование класса выполняется с использованием меню, ко- торое позволяет создать список из чисел типов integer, float, double и выполнить типичные операции с ним.

#include <conio.h> #include <string.h> #include <iostream.h> #include"vip\menu.cpp" void ListForInt();

void ListForFloat(); void ListForDouble(); char bufRus[256];

char*Rus(const char*text){ CharToOem(text,bufRus); return bufRus;

}

//шаблон класса для работы с односвязным списком

template<class mytype>class List {

//внутренний класс, для представления элементов списка

class Node{

public:

mytype d;

Node* next;

Node(mytype dat=0){d=dat; next=0;}

};

Node* pbeg; //указатель на начало списка

public:

List(){pbeg=0;} //конструктор

~List(); //деструктор

Node * Add(mytype d); //добавление в конец списка

Node * Find(mytype key); //поиск по ключу

Node * Insert(mytype key,mytype d); //вставка узла d после узла с // ключом key bool Remove(mytype key); //удаление узла

void Print(); //печать списка

};

//*********************~List() *************************

//ДЕСТРУКТОР. Освобождает память для всех узлов списка

template<class mytype> List<mytype>::~List(){ if(pbeg!=0){

Node* pv=pbeg; while(pv){

pv=pv->next; delete pbeg; pbeg=pv;

}

}

}

//*************************** void Add(mytype d) **********

//Добавляет узел в конец списка и возвращает указатель

// на вставленный узел.

template<class mytype> List<mytype>::Node* List<mytype>::Add(mytype d){

Node* pv=new Node(d); //Создание нового узла

if(pbeg==0)pbeg=pv; //первый узел списка

else {

Node* rab=pbeg; while(rab!=0){

if((rab->next)==0){rab->next=pv;return pv;} rab=rab->next;

}

}

}

//*************************** Node* Find(mytype key)

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

// на него в случае успешного поиска и 0 в случае отсутствия узла в списке

template<class mytype> List<mytype>::Node* List<mytype>::Find(mytype key){

Node* pv=pbeg; while(pv){

if((pv->d)==key)break; pv=pv->next;

}

return pv;

}

//************* Node* Insert(mytype key,mytype d)

//Вставляет в список узел после узла с ключом key и возвращает

// указатель на вставленный узел. Если такого узла в списке нет,

// вставка не выполняется и возвращается значение 0

template<class mytype> List<mytype>::Node* List<mytype>::Insert(mytype key,mytype d){

if(Node* pkey=Find(key)) //поиск узла с ключом key

{

Node* pv=new Node(d);

//выделение памяти под новый узел и его инициализация

pv->next=pkey->next;

//установление связи нового узла с последующим

pkey->next=pv; //установление связи предыдущего узла с новым

return pv;

}

return 0;

}

//******************* bool Remove(mytype key)

//Удаляет узел с заданным ключом из списка и возвращает значение true при

//успешном удалении и false, если узел с таким ключом не найден template<class mytype> bool List<mytype>::Remove(mytype key){ if(Node* pkey=Find(key)){

if(pkey==pbeg)pbeg=pbeg->next; //удаление из начала списка

else{                            //Находим указатель на узел, Node*rab=pbeg;                                               //стоящий в списке перед while(rab)                                               //удаляемым узлом.

{                                 //rab-этот указатель. if((rab->next)==pkey)break;

rab=rab->next;

}

rab->next=pkey->next;

}

delete pkey; return true;

}

return false;

}

//******************** void Print() -Печать списка template<class mytype> void List<mytype>::Print(){ Node*pv=pbeg;

cout<<Rus("Наш список:");cout<<endl; while(pv){

cout<<pv->d<<' '; pv=pv->next;

}

cout<<endl;}

//--------------------------- MAIN ---------------------------------------------

int main(int argc, char* argv[]){ int k=0,max,kol;

char menu[][100]= {{" ListForInt "}, {" ListForFloat "},

{" ListForDouble "}, {" EXIT "}, };

kol=4; //КОЛИЧЕСТВО СТРОК МЕНЮ. Это используется в выравнивании

//строк меню по центру.

//----ВЫРАВНИВАНИЕ СТРОК МЕНЮ ПО ЦЕНТРУ------------------

max=viravnivaniestrok(menu,kol);

//----------------- МЕНЮ НА ЭКРАНЕ---------------------------------------

textmode(C80); while(1){

switch(mmm(kol,menu,max,k))

{      case 0: { ListForInt(); k=0;break;

}

case 1: {

ListForFloat(); k=1;break;

}

case 2: {

ListForDouble(); k=2;break;

}

case 3:{

exit(0);

}

}

}

return 0;

}

//*************************** void ListForInt()

//Эта функция вызывается из главного меню. void ListForInt(){

List<int>l1;

int k=0,max,kol; char menu[][100]=

{ {" PrintList "}, {" Add "}, {" Find "}, {" Insert "},

{" Remove "}, {" EXIT "}, {" Back "} }; kol=7; //КОЛИЧЕСТВО СТРОК МЕНЮ.

max=viravnivaniestrok(menu,kol);

//------------------------ МЕНЮ НА ЭКРАНЕ-----------------------------

textmode(C80); while(1){

switch(mmm(kol,menu,max,k))

{      case 0: {

l1.Print();

while(!kbhit()) k=0;break;}

case 1: {

cout<<Rus("введите число, которое надо вставить:");

int t;cin>>t;

if( (l1.Add(t)) )cout<<Rus("вставка осуществлена"); else cout<<Rus("вставка не осуществлена"); while(!kbhit());

k=1;break;} case 2: {

cout<<Rus("введите искомое число:"); int t;

cin>>t;

if(l1.Find(t))cout<<Rus("искомое число есть в списке."); else cout<<Rus("искомого числа нет в списке."); while(!kbhit());

k=2;break;} case 3: {

cout<<Rus("введите число, которое надо вставить:"); int t;cin>>t;

cout<<Rus("введите число, после которого надо вставить:"); int key;cin>>key;

if( (l1.Insert(key,t)) )cout<<Rus("вставка осуществлена"); else cout<<Rus("вставка не осуществлена"); while(!kbhit());

k=3;break;} case 4: {

cout<<Rus("введите число, которое надо удалить:"); int t;cin>>t;

if( (l1.Remove(t)) )cout<<Rus("удаление осуществлено"); else cout<<Rus("такого числа нет в списке."); while(!kbhit());

k=4;break;} case 5:{exit(0);}

} } }

Таким же образом, как и функция ListForInt(), реализуются функ- ции ListForFloat() и ListForDouble(), предназначенные для тестирова- ния списков из чисел типа float и double, соответственно.


Общие задания

1.   Реализовать пример, описанный в лабораторной работе.

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

 

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

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

2. Создать шаблон класса для работы со стеком. Элемент стека – символ. Использовать стек для проверки правильности расстановки скобок трех типов (круглых, квадратных и фигурных) в выражении.

3. Создать шаблон класса для работы со стеком. Элемент стека – символ. Сформировать два стека, содержащие последовательности символов. Подсчитать общее число элементов в стеках, предусмотреть восстановление их исходного расположения.

4. Создать шаблон класса для работы со стеком. Элемент стека – целое число. Ввести две неубывающие последовательности чисел в два стека. Использовать третий стек для слияния двух последовательностей в одну неубывающую.

5. Создать шаблон класса для работы со стеком. Элемент стека – действительное число. Применить класс для вывода возрастающих серий последовательности действительных чисел: a) в обратном порядке; б) в том же порядке (серия – упорядоченная последовательность максимальной длины).

6. Создать шаблон класса для работы с одномерным массивом. Выполнить тестирование путем создания и обработки массивов, со- держащих элементы различных типов (например, сортировка эле- ментов массивов различными методами).

7. Создать шаблон класса Vector размерности n. Определить несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения, вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, являются ли они коллинеарными или ортогональными.

8. Создать шаблон класса «Квадратная матрица» – Matrix раз- мерности n ´ n. Класс должен содержать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для сложения, вычитания, умножения матриц; вычисления нормы матрицы. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса. Создать массив объектов класса Matrix и передать его в функцию, кото- рая изменяет i -ю матрицу путем возведения ее в квадрат. В головной программе вывести результат.

9. Создать шаблон класса Polynom степени n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления значения полинома; сложения, вычитания и умножения полиномов. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания. Создать массив объектов класса. Передать его в функцию, вычисляющую сумму полиномов массива и возвращающую полином-результат, который выводится на экран в головной программе.

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

11. Создать шаблон класса Set (множество) мощности n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для определения принадлежности заданного элемента множеству, пересечения, объединения, разности двух множеств. Перегрузить операции сложения, вычитания, умножения (пересечения), индексирования, присваивания. Создать массив объектов и передавать пары объектов в функцию, которая строит множество, состоящее из элементов, входящих только в одно из заданных множеств, т. е. ( A È B) \ ( A Ç B), и возвращает его в головную программу.

12. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Элементы списка – целые числа. Создать список List1. Построить список List2, содержащий порядковые номера максимальных элементов списка List1.

13. Создать шаблон класса для работы с бинарным деревом. Применить его для сортировки действительных чисел и строк, вводимых с клавиатуры или из файла.

14. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Создать два списка: List1 и List2. Проверить, содержатся ли элементы списка List1 в списке List2 в указанном списком List1 порядке.

15. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Элемент списка – действительное число. Сформировать список, содержащий неубывающую последовательность чисел, и преобразовать его так, чтобы последовательность была невозрастающей. Для этого необходимо совершить переворот списка, т. е. такую переустановку указателей в списке, при которой элементы его следуют друг за другом в обратном порядке.

16. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Элементы списка – целые числа. Создать список List1. Построить список List2, содержащий порядковые номера максимальных элементов списка List1.

17. Создать шаблон класса, обеспечивающего описание матрицы заданного размера n ´ m и любого минора в ней. Память для матрицы выделять динамически. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для отображения на экране как матрицы в целом, так и заданного минора, а также для изменения минора; сложения, вычитания, умножения миноров. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса. Создать массив объектов данного класса и передать его в функцию, которая изменяет для i -й матрицы ее минор путем умножения на константу.

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

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

20. Создать шаблон класса для работы с одномерным массивом. Выполнить тестирование путем создания и обработки массивов, со- держащих элементы различных типов (например, сортировка эле- ментов массивов различными методами).

21. Создать шаблон класса Vector размерности n. Определить несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления модуля вектора, скалярного произведения, сложения, вычитания, умножения на константу. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания для данного класса. Создать массив объектов. Написать функцию, которая для заданной пары векторов будет определять, являются ли они коллинеарными или ортогональными.

22. Создать шаблон класса «Квадратная матрица» – Matrix раз- мерности n ´ n. Класс должен содержать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для сложения, вычитания, умножения матриц; вычисления нормы матрицы. Перегрузить операции сложения, вычитания, умножения и присваивания для данного класса. Создать массив объектов класса Matrix и передать его в функцию, кото- рая изменяет i -ю матрицу путем возведения ее в квадрат. В головной программе вывести результат.

23. Создать шаблон класса Polynom степени n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для вычисления значения полинома; сложения, вычитания и умножения полиномов. Перегрузить операции сложения, вычитания, умножения, инкремента, декремента, индексирования, присваивания. Создать массив объектов класса. Передать его в функцию, вычисляющую сумму полиномов массива и возвращающую полином-результат, который выводится на экран в головной программе.

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

25. Создать шаблон класса Set (множество) мощности n. Написать несколько конструкторов, в том числе конструктор копирования. Реализовать методы для определения принадлежности заданного элемента множеству, пересечения, объединения, разности двух множеств. Перегрузить операции сложения, вычитания, умножения (пересечения), индексирования, присваивания. Создать массив объектов и передавать пары объектов в функцию, которая строит множество, состоящее из элементов, входящих только в одно из заданных множеств, т. е. ( A È B) \ ( A Ç B), и возвращает его в головную программу.

26. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Элементы списка – целые числа. Создать список List1. Построить список List2, содержащий порядковые номера максимальных элементов списка List1.

27. Создать шаблон класса для работы с бинарным деревом. Применить его для сортировки действительных чисел и строк, вводимых с клавиатуры или из файла.

28. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Создать два списка: List1 и List2. Проверить, содержатся ли элементы списка List1 в списке List2 в указанном списком List1 порядке.

29. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Элемент списка – действительное число. Сформировать список, содержащий неубывающую последовательность чисел, и преобразовать его так, чтобы последовательность была невозрастающей. Для этого необходимо совершить переворот списка, т. е. такую переустановку указателей в списке, при которой элементы его следуют друг за другом в обратном порядке.

30. Создать шаблон класса для работы с односвязным списком. Применить шаблон класса для решения задачи. Элементы списка – целые числа. Создать список List1. Построить список List2, содержащий порядковые номера максимальных элементов списка List1.


Дата добавления: 2020-11-15; просмотров: 217; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!