Мегаобучалка Главная | О нас | Обратная связь


Лабораторная работа N 12



2018-07-06 426 Обсуждений (0)
Лабораторная работа N 12 0.00 из 5.00 0 оценок




Библиотека STL

Цель работы: Получение навыка работы с библиотекой STL

 

Домашнее задание

1.1. Тщательно изучите листинг программ №1. Опишите, что делает класс CountedPtr.

1.2 Письменно в отчёте приведите все компонентные функции одной из коллекций из библиотеки STL.

 

Лабораторное задание

2.1. Наберите программу №1.

 

 

#include "stdafx.h"

#include <iostream>

#include <list>

#include <deque>

# include <set>

#include <algorithm>

using namespace std;

 

/* Класс, обеспечивающий семантику подсчёта ссылок.

* Объект, на который ссылается указатель, автоматически

* уничтожается при удалении последнего экземпляра CountedPtr

* для данного объекта.

*/

template <class T>

class CountedPtr {

private:

T* ptr; // Указатель на значение

long* count; // Количество владельцев (общие данные)

public:

// Инициализация объекта существующим указателем

// - указатель p должен быть получен в результате вызова new

explicit CountedPtr(T* p = 0)

: ptr(p), count(new long(1)) {

}

 

// Копирующий указатель (увеличивает счётчик владельцев)

CountedPtr(const CountedPtr<T>& p) throw()

: ptr(p.ptr), count(p.count) {

++*count;

}

// Деструктор (уничтожает объект, если владелец был последним)

~CountedPtr() throw() {

dispose();

}

// Присваивание (перевод указателя на новый объект)

CountedPtr<T>& operator= (const CountedPtr<T>& p) throw() {

if (this != &p) {

dispose();

ptr = p.ptr;

count = p.count;

++*count;

}

return *this;

}

 

// Доступ к объекту, на который ссылается указатель

T& operator*() const throw() {

return *ptr;

}

T* operator->() const throw() {

return ptr;

}

private:

void dispose() {

if (--*count == 0) {

delete count;

delete ptr;

}

}

};

 

 

struct comp {

int* Re, *Im;

comp() { Re = new int; Im = new int; ;*Re = 0; *Im = 0; }

comp(int r, int i) { Re = new int; Im = new int;*Re = r; *Im = i; }

~comp() { delete Re; delete Im; }

const comp& operator=(const comp& T) { // оператор функция=

*Re = *T.Re; *Im = *T.Im; return *this;

}

const comp& operator-() { // оператор функция-

*Re = -*Re; *Im = -*Im; return *this;

}

comp(comp& T) { Re = new int; Im = new int; *Re = *T.Re; *Im = *T.Im;}

const comp operator*(const comp& T) { // оператор функция*

comp Rez(0,0);

*Rez.Re =*Re * *T.Re - *Im * *T.Im;

*Rez.Im = *Re * *T.Im + *Im * *T.Re;

return Rez;

}

double modComp()const {return sqrt(*Re**Re + *Im**Im); }

bool operator<(const comp T) { // оператор функция<

if( modComp() < T.modComp()) return 0;//х<х всегда ложно

return 1;

}

void comp::display() const

{

cout << "\n Re = " << *Re << "\t Im = " << *Im;

}

 

};

 

bool operator< (const CountedPtr<comp> p1, const CountedPtr<comp> p2) {

if (*p1 < *p2) return 0;

return 1;

}

 

void printCountedPtr(CountedPtr<comp> elem)

{

(*elem).display();

}

 

int main()

{

 

// Три разные коллекции

typedef CountedPtr<comp> IntPtr;

deque<IntPtr> coll1;

list<IntPtr> coll2;

set<IntPtr> coll3;

 

/* Вставка общих объектов в коллекции*/

 

for (int i = 0; i<5; ++i) {

IntPtr ptr(new comp(i,i));

coll1.push_back(ptr); //coll1.push_back(comp(i,i));

coll2.push_front(ptr);

coll3.insert(ptr);

}

 

// Вывод содержимого коллекций

cout<<"\n deque";

for_each(coll1.begin(),coll1.end(), printCountedPtr);

cout << "\n list";

for_each(coll2.begin(), coll2.end(), printCountedPtr);

cout << "\n set";

for_each(coll3.begin(), coll3.end(), printCountedPtr);

cout << endl << endl;

/* Модификация значений в разных коллекциях

* - возведение в квадрат значения в coll1

* - изменение знака первого значения в coll2

*/

*coll1[1] = *coll1[1] * *coll1[1];

// *coll2.front() = - (*coll2.front());

 

// Повторный вывод содержимого коллекций

cout << "\n\n deque";

for_each(coll1.begin(), coll1.end(), printCountedPtr);

cout << "\n list";

for_each(coll2.begin(), coll2.end(), printCountedPtr);

cout << "\n set";

for_each(coll3.begin(), coll3.end(), printCountedPtr);

cout << endl;

}

 

 

2.2. Упростите программу. Перейдите от ссылочной семантики к семантике по значению (класс CountedPtr не нужен). Сравните данные, выводимые на экран, упрощённой программой и исходной.

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

 

 

Содержание отчета

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

3.2 Выполненное домашнее задание.

3.3 Тексты программ, написанные при выполнении 2.2 и 2.3 пунктов лабораторного задания.

 

Вопросы к защите

4.1. Какие типы коллекций вы знаете?

4.2. Сравните коллекции между собой. Какие у каждой из них имеются достоинства и недостатки?

4.3. Что такое итератор? Какие типы итераторов вы знаете?

4.4. Напишите программу реализующую список элементов типа квадрат.

4.5. Напишите программу, реализующую вектор комплексных чисел.

4.6. Напишите программу, реализующую набор строк.

4.7. Напишите программу, реализующую дек элементов типа эллипс.

4.8. Напишите класс «круг» вписанный в «квадрат», используя классы ClsEllipse и Square.

4.9. Напишите класс «текст» вписанный в «круг», используя классы ClsEllipse и DrowTxt.

4.10. Напишите класс «магазин», который работает с объектами абстрактного класса «товар». Определите 2-3 класса, производных от класса «товар». Продемонстрируйте примеры полиморфного поведения.

4.11. Напишите класс «вагон», который работает с объектами абстрактного класса «груз». Определите 2-3 класса, производных от класса «груз». Продемонстрируйте примеры полиморфного поведения.

 

 

Литература

 

1. Подбельский В. В. Стандартный Си++ [Текст] : учеб. пособие для студ. вузов. - М. : Финансы и статистика, 2008. - 687 с. : ил.. - Библиогр.: с. 667-669 (31 назв.). - ISBN 978-5-279-03243-3

2. Максимов М. Н. Язык Си++ как инструмент для моделирования радиотехнических цепей и сигналов [Текст] : курс лекций : для студ. радиотехн. спец. всех форм обуч.. Ч. 1 / ТТИ ЮФУ, РТФ, Каф. ТОР. - Таганрог : Изд-во ТРТУ, 2007. - 159 с.. - Библиогр.: с. 159 (5 назв.)

3. Библиотека STL



2018-07-06 426 Обсуждений (0)
Лабораторная работа N 12 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа N 12

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (426)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)