Скачиваний:
12
Добавлен:
01.05.2014
Размер:
1.03 Mб
Скачать

Министерство Образования и Науки Российской Федерации

Санкт-Петербургский Государственный Электротехнический

Университет “ЛЭТИ”

Кафедра МОЭВМ

Отчет

по лабораторной работе №1

“Программирование контейнерных классов”

Выполнил: Смирнов Е.А.

гр. 3351.

Проверил: Романенко С.А.

Санкт-Петербург

2007

Программирование контейнерных классов

1. Разработка программ в среде MS Visual C++.

1.1. Настройка среды. Выполнение индивидуального задания.

  • Найти проекты MFC Tutorial. Откомпилировать и выполнить пример TrialRun.

  • Индивидуальное задание: Написать классы для создания графических объектов. Классы должны иметь общий абстрактный базовый класс Shape с чистыми виртуальными функциями.

  • Необходимо использовать множественное наследование. В классах должны быть предусмотрены виртуальные функции для вывода информации об объектах в поток, а Shape должен иметь дружественный перегруженный оператор <<.

  • Исходный текст должен быть разделен на три файла .h, .cpp и .cpp с тестовой программой.

1.2. Работа в режиме отладки.

  • Запустить программу и просмотреть ее работу по шагам (Build -> Start Debug -> Go)

  • Просмотреть иерархию классов и найти примеры множественного наследования.

  • Расставить точки превывания программы (Break Points) и протестировать её работу.

  • Для выяснения текущих значений переменных, использовать механизм "Watch variable".

1.3. Исследование программы при помощи Profiler.

  • Изучить возможности оптимизации программы в интегрированной среде, в отчете перечислить и объяснить параметры (опции), влияющие на оптимизацию.

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

  • Изменить текст main так, чтобы выполнялись все участки программы.

2. Применение стандартной библиотеки stl.

2.1. Составить консольные приложения, демонстрирующие основные операции с контейнерами и итераторами STL.

  • Заполняя 3 контейнера строками из <cstring> или другими элементами, продемонстрировать отличия

    1. последовательностей (vector, list, dequeue);

    2. адаптеров последовательностей (stack, queue, priority_queue);

    3. ассоциативных контейнеров на базе map.

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

  • Аналогично протестировать ассоциативный контейнер, заполняя его указателями на разные графические объекты из разд. 1.1. Протестировать алгоритны-методы и алгоритмы-классы на множестве графических элементов.

2.2. Реализовать новый шаблон контейнера и шаблон итератора для него по индивидуальному заданию.

  • Предусмотреть обработку исключительных ситуаций.

  • Протестировать контейнер, заполнив его графическими объектами.

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

Проектирование классов объектов на языке С++

Для того, чтобы обеспечить однозначную идентификацию объектов классов и подсчет общего числа объектов в классе, в каждый класс добавлены 2 статических поля

static unsigned long int count;

static unsigned long int total;

count - отвечает за подсчет текущего количества объектов (инкрементируется в конструкторе и декрементируется в деструкторе);

total- отвечает ха подсчет общего количества объектов класса (когда либо созданных) (инкрементируется в конструкторе).

Для идентификации объектов введено поле

constunsignedlongintid;

оно инициализируется в конструкторе путем присвоения ему значения статического поля total.

Для защиты этого поля от изменений введен спецификатор const, который запрещает изменение значенияidобъекта после его инициализации.

Для получения значения idобъекта введена функция

unsigned long int getObjectId() const;

Для защиты значения idот изменений функция объявлена как константная.

Дла получения текущего количества объектов объекта введена статическая функция

static unsigned long int getNumberOfObjects();

В связи с тем, что функция объявлена со спецификатором static, она не может быть сделана константной.

Класс Фигура (Shape)

Это общий абстрактный базовый класс с чистыми виртуальными функциями.

Класс имеет 2 дружественных оператора вывода в поток, один из них принимает в качестве правого операнда ссылку на объект типа Shape, а другой – указатель на объект типаShape

Класс имеет 2 чистые виртуальные ф-ии:

  • Вывод в поток - virtual ostream& print(ostream& os) const = 0;

  • Перемещение объекта - virtual void moveBy(const double x, const double y) = 0;

Все классы, которые наследуются от класса Shape, а именноPoint,Line,Text,Triangle,TextInTriangleимеют следующие функции:

- перемещение объекта на dx,dy(параметры защищены от изменений внутри функции, переопределение виртуальной функции базового класса)

voidmoveBy(constdoubledx,constdoubledy);

- вывод объекта в поток ostream(переопределение виртуальной функции базового класса)

ostream&print(ostream&os)

+ дополнительные функции:

- сериализация объекта в строковую переменную

stringtoString()const;

- перегрузка оператора == для сравнения объектов типа T(в качестве типа выступает соответствующий класс)

int operator==(const T& o) const;

- перегрузка оператора = для присваивания объектов типа T(в качестве типа выступает соответствующий класс)

T& operator= (const T& o);

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

Класс Точка (Point)

Наследуется от .Shape

Члены-данные

- координата 'x'

double x;

- координата 'y'

double y;

- радиус (r>0)

doubler;

- полярный угол

doublefi; (0<fi<=360, в градусах)

Члены-функции

Внутренние:

- определение значения полярного угла

voidcalculatePolarAngle();

- пересчет координат из (x,y) в (r,fi)

voidconvertXYToRFi();

- пересчет координат из (r,fi) в (x,y)

voidconvertRFiToXY();

Интерфейсные:

- конструктор (параметры - координаты точки, параметры функции защищены от изменений в теле функции за счет введения спецификатора const)

Point(const double x, const double y);

- конструктор (параметр - указатель на точку, защищен как указатель, так и объект, на который он указывает)

Point(const Point* const point);

- деструктор

~Point();

- селекторы (функции объявлены как константные, что запрещает изменения полей объекта внутри функций)

double getX() const;

double getY() const;

double getR() const;

double getFi() const;

- поворот точки вокруг (0, 0) (параметр защищен от изменения)

void turnBy(const double angle);

- поворот точки вокруг заданной точки (параметр angleзащищен от изменения, параметрpoint- указатель на точку, вокруг которой происходит вращение - защищен как указатель, так и объект на которое он показывает)

void turnAroundBy(const double angle, const Point* const point);

Класс Отрезок (Line)

Наследуется от .Shape

Члены-данные

- указатель на первую точку

Point*p1;

- указатель на вторую точку

Point*p2;

Члены-функции

Внутренние:

Нет

Интерфейсные:

- дефолтный конструктор (создает 2 точки, вызывая дефолтный конструктор класса Point)

Line();

- конструктор (параметры – указатели на 2 точки)

Line(Point* p1, Point* p2);

- конструктор (параметр - указатель на отрезок)

Line(const Line* o);

- конструктор копирования (параметр – ссылка на отрезок)

Line(const Line& o);

- деструктор

virtual ~Line();

- селектор (возвращает указатель на заданную точку, если параметр n= 1, то возвращаетp1, иначеp2)

Point*getPoint(intn)

Класс Треугольник (Triangle)

Наследуется от .ShapeиLine. Треугольник составлен из прямой и точки – три точки задают его положение в пространстве.

Члены-данные

- указатель на третью точку

Point*point;

Члены-функции

Внутренние:

Нет

Интерфейсные:

- дефолтный конструктор (создает прямую, вызывая дефолтный конструктор класса Lineи точку, вызывая дефолтный конструктор классаPoint)

Triangle();

- конструктор (параметры – указатели на 3 точки)

Triangle (Point* p1, Point* p2, Point* p3);

- конструктор (параметр - указатель на отрезок)

Triangle(constTriangle*o);

- конструктор копирования (параметр – ссылка на отрезок)

Triangle (const Triangle & o);

- деструктор

virtual~Triangle();

- селектор (возвращает указатель на заданную точку, если параметр n= 1, то возвращаетp1, еслиn= 2, тоp2, иначеp3)

Point*getPoint(intn)

Класс Текст (Text)

Наследуется от .Shape

Члены-данные

- строка

stringtext;

Члены-функции

Внутренние:

Нет

Интерфейсные:

- дефолтный конструктор (параметр – строка, значение по умолчанию – пустая строка)

Text(stringtext= ""););

- конструктор (параметр - указатель на отрезок)

Text(const Text* o);

- конструктор копирования (параметр – ссылка на отрезок)

Text (const Text& o);

- деструктор

virtual~Text();

- селектор (возвращает строку)

string getText()

- модификатор

void setText(const string& s);

Класс Текст в треугольник (TextInTriangle)

Наследуется от .Shape,TextиTriangle. Текст в треугольнике составлен издвух объектов – текста и треугольника.

Члены-данные

нет

Члены-функции

Внутренние:

Нет

Интерфейсные:

- дефолтный конструктор (создает треугольник, вызывая дефолтный конструктор класса Triangleи текст, вызывая дефолтный конструктор классаText)

TextInTriangle();

- конструктор (параметры – указатель на треугольник и строка)

TextInTriangle (Triangle* triangle, string text);

- конструктор (параметры – указатели на 3 точки и строка)

TextInTriangle(Point* p1, Point* p2, Point* p3, string text);

- конструктор (параметр - указатель на отрезок)

TextInTriangle(constTextInTriangle*o);

- конструктор копирования (параметр – ссылка на отрезок)

TextInTriangle (const TextInTriangle & o);

- деструктор

virtual ~ TextInTriangle ();