Лабораторная работа №19 Шаблоны (параметризованные типы) - polpoz.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Лабораторная работа №9 структура программы. Скалярные типы данных. 4 863.77kb.
Лабораторная работа «Семейства растений класса Двудольные» 1 43.9kb.
Лабораторная работа «Строение семян» Задачи: знать особенности строения... 1 39.29kb.
Лабораторная работа №1 по дисциплине " Методы и средства гидрометеорологических... 1 147.39kb.
«Шаблоны основного сайта shgpi edu ru. Пояснения» 1 94.37kb.
Лабораторная работа №14 Сетевая файловая система nfs 1 313.45kb.
Лабораторная работа вариант №5 Проверил: Денисов Владимир Петрович 3 509.43kb.
Лабораторная работа №20 изучение осциллографа и проверка градуировки... 1 55.04kb.
Отчет по химии лабораторная работа №3 определение дипольного момента... 1 51.57kb.
Xara Web Designer 0 13296 + rus + Шаблоны[2010/Русский] Оригинальное... 1 16.13kb.
Лабораторная работа №2 «Калькулятор» 1 264.54kb.
Социальная реабилитация граждан пожилого возраста Социально-реабилитационное... 1 10.69kb.
1. На доске выписаны n последовательных натуральных чисел 1 46.11kb.

Лабораторная работа №19 Шаблоны (параметризованные типы) - страница №1/1

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

Шаблоны (параметризованные типы)

Цель работы: изучить представление и правила работы с шаблонами в С++.

Теоретические сведения


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

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

В языке С++ имеются два типа шаблонов - шаблоны функций и шаблоны классов.

Шаблоны функций


Объявление шаблона функции начинается с заголовка, состоящего из ключевого слова template, за которым следует список параметров шаблона.

// Описание шаблона функции

template

T min (T a, T b)

{ return a

Ключевое слово class в описании шаблона означает тип, идентификатор в списке параметров шаблона T означает имя некоторого типа.

В описании заголовка функции этот же идентификатор означает тип возвращаемого функцией значения и типы параметров функции.

...


// Использование шаблона функции

int m, k, l;

cout<<”Input k, l”;

cin>>k>>l;

m = min (k, l);

...


Компилятор генерирует (порождает) экземпляр функции для указанного типа параметров:

int min (int a, int b)

{ return a

}

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



Так как компилятор генерирует экземпляры шаблонов функций согласно типам, заданным при их вызовах, то очень важным моментом является передача корректных типов, особенно если шаблон функции имеет два или более параметров. Хорошим примером является классическая функция max():

template

T max (T a, T b)

{ return a > b ? a : b; }

Функция max() будет работать правильно, если оба ее аргумента имеют один и тот же тип:

int k,l;


double p,q;

int i = max (k, l);

double d = max (p, q);

Однако, если аргументы имеют разные типы, то вызов max() приведет к ошибке.

Один из возможных способов решения этой проблемы состоит в использовании приведения типов.

int i = max ((int)'a', 100);

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

template

T1 max (T1 a, T2 b)

{ return a > (T1)b ? a : (T1)b;

}

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



max ('a', 100);

то компилятор будет использовать два заданных (посредством аргументов типа) и построит версию функции max() с заголовком

char max (char, int);

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

max ('a', 100)

дает значение типа char, в то время как

max (100, 'a')

передает в вызывающую программу int.


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


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

Синтаксис шаблона класса:

template class имя_класса

{ // описание класса

}

Здесь Ttype - фиктивное имя типа, который будет определен (задан) при создании экземпляра класса. После определения шаблона класса можно создать конкретный экземпляр этого класса:



имя_класса объект;

где type - имя типа данных, с которым будет оперировать класс.

Функции-элементы родового класса автоматически становятся родовыми. Для них не обязательно указывать ключевое слово template.
Пример 19.1 Реализация класса stack в виде шаблона для хранения объектов любого типа.

#include

using namespace std;

#define SIZE 10

// создание шаблона класса stack

template class stack

{ StackType stck[SIZE]; // массив, содержащий стек

int tos; // индекс вершины стека

public:

void init() { tos = 0; } // инициализация стека



void push(StackType ob); // поместить объект в стек

StackType pop(); // извлечь объект из стека

};
template

void stack :: push(StackType ob)

{ if (tos == SIZE) { cout << "Stack is full" << endl;

return;


}

stck[tos] = ob;

tos++;

}

template



StackType stack :: pop()

{ if (tos == 0) { cout << "Stack is empty" << endl;

return 0;

}

tos--;



return stck[tos];

}
int main()

{ int i;

char sym = 'a';

// символьный стек

stack st_ch;

st_ch.init();

for (i = 0; i < 7; i++) { st_ch.push(sym); sym++; }

for (i = 0; i < 7; i++) cout << st_ch.pop() << ' ';

cout << endl;

// стек типа int

stack st_int;

st_int.init();

for (i = 0; i < 8; i++) st_int.push(i * 10);

for (i = 0; i < 8; i++) cout << st_int.pop() << ' ';

cout << endl;

// стек типа float

stack st_fl;

st_fl.init();

for (i = 0; i < 5; i++) st_fl.push(i * 2.5);

for (i = 0; i < 5; i++) cout << st_fl.pop() << ' ';

cout << endl;

return 0;

}

Пример 19.2. Создание шаблона класса, реализующего односвязный список.

#include

using namespace std;


template class list

{ public:

DatList info;

list *next;

list(DatList data) { info = data;

next = 0;

}

void insert(list *node) { node->next = this; // поместить объект в список



next = 0;

}

list *get_next() { return next; } // получить значение поля next



DatList get_info() { return info; } // получить значение поля info

};
int main()

{ list *head, *tail, *p;

int i;


head->info = 'a';

tail = head;

for (i = 1; i < 26; i++)

{ p = new list ('a' + i);

p->insert(tail);

tail = p;

}

p = head;



while (p) { cout << p->get_info();

p = p->get_next();



}

return 0;



}
Контрольные вопросы

  1. Что такое шаблоны и с какой целью они используются?

  2. Какого типа шаблоны используются в программах?

  3. Как оформляются шаблоны функций?

  4. Какие требования предъявляются к фактическим параметрам шаблонов?

  5. Какие преимущества программы обеспечиваются при использовании шаблонов классов?

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


Номер варианта

Задание

1, 16

Описать параметризованный класс односвязный список. Предусмотреть выполнение функций формирования списка, вставки элемента в нужное место списка, удаления элемента.

2, 17

Опишите параметризованный класс очередь. Предусмотреть выполнение функций формирования очереди, добавления и удаления элемента.

3, 18

Опишите параметризованный класс стек. Предусмотреть выполнение функций формирования стека, вставки и удаления элемента.

4, 19

Опишите параметризованный класс стек ограниченной ёмкости (параметр – тип и число). Предусмотреть выполнение функций формирования стека, вставки и удаления элемента.

5, 20

Опишите параметризованный класс геометрическая фигура на плоскости (параметр – тип и число). Предусмотреть выполнение функции вычисления и вывода площади фигуры.

6, 21

Опишите параметризованную функцию сортировки вставкой. Продемонстрируйте использование функции для разных типов данных.

7, 22

Опишите параметризованную функцию сортировки выборкой. Продемонстрируйте использование функции для разных типов данных.

8, 23

Опишите параметризованную функцию сортировки пузырьком. Продемонстрируйте использование функции для разных типов данных.

9, 24

Опишите параметризованную функцию нахождения элемента в неупорядоченном массиве. Продемонстрируйте использование функции для разных типов данных.

10, 25

Опишите параметризованную функцию нахождения элемента в упорядоченном массиве. Продемонстрируйте использование функции для разных типов данных.

11, 26

Опишите параметризованную функцию замены одного элемента массива на другой. Продемонстрируйте использование функции для разных типов данных.

12, 27

Опишите параметризованную функцию инверсии массива элементов. Продемонстрируйте использование функции для разных типов данных.

13, 28

Опишите параметризованную функцию вычисления среднего арифметического значения массива элементов. Продемонстрируйте использование функции для разных типов данных.

14, 29

Описать параметризованный класс массив с двумя аргументами. Предусмотреть выполнение функций формирования массива, поиска заданного значения в массиве.

15, 30

Описать параметризованный класс сортированный массив с двумя аргументами. Предусмотреть выполнение функций формирования массива, и вставки заданного значения в соответствующее место массива.









izumzum.ru