Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Б3.Б.5 Основы объектно-ориентированного программирования

.pdf
Скачиваний:
21
Добавлен:
28.03.2016
Размер:
1.59 Mб
Скачать

Конструктор по умолчанию должен создавать дату соответствующую текущему времени UTC (для получения времени можно использовать функции из time.h)

Класс должен реализовывать конструктор копии.

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

Реализовать полный конструктор (unsigned аргументы — год, месяц, число, час, минуты, секунды).

В случае если значения в конструктор переданы некорректно, осуществлять автоматическую нормализацию даты (значение большее допустимого в определенном поле приводит к увеличению старших полей, таким образом вызов конструктора от аргументов Date(2010, Feb, 30, 22, 59, 72) приведет к созданию объекта соответствующего

Date(2010, Mar, 2, 23, 00, 13))

Реализовать дополнительно конструкторы:

Date (unsigned int year, Month m, unigned int day) — создает объект с временем 0 ч 0

м 0 сек

Date (unsigned int hrs, unsigned int mnts, unsigned int days) - создает объект с указанным временем и текущей датой

Операции addYears, addMonths, addDays, addHours, addMinutes, addSeconds должны возвращать новый объект «по значению», оставляя исходный объект неизменным. Класс должен реализовывать оператор присваивания (единственный метод-модификатор в классе).

Таким образом для изменения исходного объекта нужно пользоваться конструкцией вида:

Date theDate = theDate.addMonths(1);

Аргументы методов addXXX могут быть отрицательными, но при этом дата не может быть меньше 0:00:00 1 Jan 1 или больше 9999-12-31 23:59:59

Реализовать метод std::string toString() const возвращающий строковое представление даты в формате:

YYYY-MMM-DD hh::mm::ss

Написать тестовую программу, демонстрирующую корректную работу календаря.

3б (5 баллов)

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

DateInterval обеспечить полным набором методов — селекторов, конструктором копии, оператором присваивания.

Класс Date дополнить методом DateInterval getInterval(const Date& another) const

возвращающий интервал между датами и методом Date addInterval (const DateInterval&) const возвращающий новую дату относительно исходной.

31

Реализовать метод std::string formatDate (std::string format) принимающий аргументом строку формата для представления даты в виде строки. Значимыми символами в строке формата являются:

YYYY

MM (месяц в числовом формате)

MMM (месяц в формате Jan, Feb... Dec)

DD

hh

mm

ss

Остальные символы должны быть включены в итоговую строку без изменения. В случае если строка формата некорректна, возвращать строку «Invalid date format»

Написать тестовую программу демонстрирующую работу с интервалами и форматированием даты.

Задание №4. Перегрузка операторов

4а (8 баллов)

Реализовать класс Vector для вещественных чисел. Вектор должен хранить массив вещественных чисел выделенных в свободной памяти (по new).

В случае переданного некорректного аргумента размера или индекса просто выбрасывать std::out_of_range исключение, никакой дополнительно обработки не делать (прямым throw std::out_of_range ("Illegal size") либо std::out_of_range("out of bounds") ).

Индексация элементов ведется с нуля (при использовании оператора [ ])

Требования к реализации вектора:

Набор конструкторов

explicit Vector(n); //конструктор с резервированием памяти. инициализирован нулями

Vector (n, const double* dp); //конструктор от массива double и с заданным размером, данные для вектора должны копироваться из массива

Vector (const Vector &); //конструктор копии

Vector (n, const Vector& another) // конструктор создающий вектор размера n и заполняющий его элементами из другого вектора, при необходимости подставляя вместо недостающих нули, либо отбрасывающий лишние

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

int size() const; // размер

Перегрузить операторы

Обеспечить доступ к элементам через [ ] (константный и обычный)

operator = (const Vector&)

operator+= (const Vector&)

operator*= (const double d)

operator-= (const Vector&) реализовать через сложение с вектором умноженным на -1

Внешние операторы:

double operator* (const Vector&, const Vector&)

Vector operator* (double, const Vector&)

Vector operator* (const Vector&, double)

Vector operator+ (const Vector&, const Vector&)

32

Vector operator- (const Vector&, const Vector&)

Ввода-вывода в стандартные потоки. В случае ошибки ввода-вывода, исходный вектор переданный в качестве аргумента оператору >> должен оставаться неизменным. При этом оператор ввода вектора должен понимать формат { 5.0 ,

-3.0, 4.0 }

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

Написать тестовую программу, демонстрирующую корректную работу векторов.

4б (7 баллов)

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

Реализовать:

Полный набор конструкторов

Matrix (n, m) //инициализирует нулями матрицу размера n*m

Matrix (n, m, const Vector*) // инициализация массивом векторов, если в векторе недостаточно элементов - расширяем нулями

Matrix (n, m, const double*) // инициализация от массива чисел размера n*m где строки лежат последовательно

Matrix (const Matrix&)

Matrix (n, m, const Matrix&) // Для расширения/усечения матрицы с использованием данных другой матрицы, недостающие элементы инициализировать нулями

Деструктор ~Matrix() //убедиться кто корректно вызываются деструкторы векторов-строк

Методы:

int nCols() const - количество столбцов

int nRows() const - количество строк

Vector column( int n) const - возвращает вектор -столбец (создает новый объект и копирует данные)

Matrix transpose() const // транспонирование матрицы - возвращает новый объект

double det() const //вычисление детерминанта

Операторы

operator = (const Matrix &)

const Vector& operator [] (int n) const

Vector& operator[] (int n)

Операторы ввода-вывода в поток, при этом оператор ввода должен принимать в виде { { 1.9, -5.0 } , { 6.0, 7.0 } }, можно (следует) использовать оператор для вектора

Реализовать умножение на константу, умножение матриц - по аналогии с вектором, меньшая матрица расширяется нулями

Умножение матрицы на вектор (результат — вектор)

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

Написать программу демонстрирующую работу вектора и матрицы.

33

Задание №5. Наследование. Использование исключений. 5а (15 баллов)

Требуется реализовать приложение Workflow Executor.

Workflow – вычислительная схема, состоящая из предопределенного набора вычислительных блоков и связей между ними. Программе подается workflow, описанный в файле.

В данной задаче рассматривается единственный тип workflow – линейный, т.е. конвейер.

Список блоков, используемых в схеме:

readfile <filename> – считывание текстового файла в память, целиком. Вход – отсутствует, выход – текст.

writefile <filename> – запись текста в файл.

Вход – текст, выход – отсуствует.

grep <word> – выбор из входного текста строк, разделенных символами переноса строки, содержащих заданное слово <word>.

Вход – текст, выход – текст.

sort – лексикогорафическая сортировка входного набора строк. Вход – текст, выход – текст.

replace <word1> <word2> – замена слова word1 словом word2 во входном тексте.

Вход – текст, выход – текст.

Формат входного файла:

desc # описание блоков схемы id1 = block1

id2 = block2

idN = blockN csed

idA -> idB -> idC -> … -> idZ # описание структуры схемы

Где:

desc, csed – ключевые слова, ограничивающие раздел описания блоков workflow.

id1 … idN – целые, неотрицательные, неповторяющиеся числа.

block1 … blockN – блоки из списка блоков, с обязательными параметрами.

idA, idB … idZ – числа, принадлежающие множеству id1…idN. Могут повторяться, длина конвейера – неограничена.

-> - ключевое слово, обозначающее связь вычислительных узлов.

Ограничения на вычислительную схему:

id1…idN – не повторяются.

Блоки должны содержать нужное количество параметров.

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

Узлы схемы должны корректно соединяться, то есть тип данных на входе узла должен совпадать с типом данных предыдущего узла. Это означает, что чтение/запись файлов не может быть в середине схемы.

Пример: workflow.txt

34

desc

1 = replace abracadabra cadabraabra

2 = grep braab

3 = sort

0 = readfile in.txt

5 = writefile out.txt csed

0 -> 1 -> 2 -> 3 -> 5

Запуск:

executor.exe workflow.txt

Методические указания по реализации задачи:

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

Для парсера схем и вычислителя/валидатора также выделить отдельные интерфейсы.

Для обработки ошибок и исключительных ситуаций использовать механизм исключений C++. Ознакомиться с классами исключений, определенных в STL.

Для работы с файлами использовать файловые потоки из STL.

При работе с потоками ввода-вывода, за состоянием потока наблюдать с помощью исключений. См. метод std::ios::exceptions

(http://cplusplus.com/reference/iostream/ios/exceptions).

При сдаче задания продемонстрировать пять рабочих и пять нерабочих workflow.

5б (5 баллов)

Добавить поддержку конвейеров, возможно не содержащих блока чтения файла и/или блока записи файла. В случае, если какой-либо из них не указан, ожидать соответствующих имен из командной строки под ключами –i и –o.

Пример: workflow.txt: desc

1 = grep some_word

2 = sort csed

1 -> 2

Запуск:

executor.exe workflow.txt –i input.txt –o output.txt

Задание №6. Шаблоны

6а (10 баллов)

Преобразовать классы Vector и Matrix из задачи №4 в шаблоны классов template<class T> class Vector;

template<class T> class Matrix;

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

35

Обеспечить возможность инициализации (конструирования) вектора и матрицы от вектора и матрицы совместимого типа, например:

Vector<double> vdouble; Vector<Complex> vcomplex (vdouble);

Убедиться, что шаблоны Vector и Matrix работают корректно, будучи инстанцироваными классом Complex, написать демонстрационную программу.

6б (10 баллов)

Реализовать шаблон умного указателя с подсчетом ссылок. template<class T> class counted_ptr {

};

Объект класса counted_ptr инициализируется указателем типа T* либо совместимым указателем Y* который может неявно приводиться к T*.

При копировании объекта counted_ptr происходит увеличение счетчика ссылок (для реализации следует использовать внутреннюю структуру содержащую исходный указатель и число объектов counted_ptr ссылающихся на данную структуру).

При удалении объекта counted_ptr в случае, если счетчик ссылок становится равным нулю, уничтожается исходный объект (на который изначально был взят указатель). counted_ptr должен реализовывать следующий минимальный набор конструкторов и членов:

template<class T> class counted_ptr { public:

counted_ptr(); //Создает пустой указатель

counted_ptr(const counted_ptr& r); //Копирует и увеличивает счетчик ссылок template<class Y> explicit counted_ptr( Y*); //Преобразует из Y* в T* и сохраняет указатель

counted_ptr& operator=(const counted_ptr& r); //Уменьшает исходный счетчик,

привязывается к //другому объекту и увеличивает его счетчик

~counted_ptr(); //Уменьшает счетчик, удаляет объект, если счетчик занулится

T& operator* () const; T* operator->() const; T* get() const;

int use_count() const;

};

template<class T, class Y> bool operator == (const counted_ptr<T> &r1, const counted_ptr<Y> &r2);

template<class T, class Y> bool operator != (const counted_ptr<T> &r1, const counted_ptr<Y> &r2);

Написать программу демонстрирующую работу counted_ptr, в том числе при хранении объектов counted_ptr в стандартных контейнерах, например std::vector

36

Задание №7. Эмулятор АЛУ

http://en.wikipedia.org/wiki/File:2-bit_ALU.png

Задача (30 баллов)

Написать программу которая прочтет файл JSON конфигурации АЛУ из приложения, построит в памяти объекты соответствующие элементам АЛУ с необходимыми связими между ними, затем построить таблицу значений выходов в зависимости от входов для каждой операции (для каждой комбинации Ор0, Ор1). Записать результат в 4 текстовых файла: xor.txt, and.txt, or.txt, sum.txt. Пример формата файлов:

A0 A1 B0 B1 CarryIn Out0 Out1 CarryOut

0 0 0 0 0 0 0 0

….......всего 32 строки со значениями....................

При реализации использовать где необходимо enum и иерархию классов для реализации различных логических элементов схемы. Пример возможной иерархии:

Item

37

InputItem

ConnectedItem

LogicItem (используем указатель на функцию для вычисления значения)

MultiplexerItem

OutputItem

JSON

Формат входных данных http://ru.wikipedia.org/wiki/JSON

JSON-C

Скачать http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz и скомпилировать статическую библиотеку json.lib В дальнейшем подключить и использовать данную библиотеку для чтения JSON файла. Для задачи достаточно использовать следующие функции:

json_object_from_file

json_object_object_get

json_object_array_length

json_object_array_get_idx

json_object_get_string

json_object_object_del

Подсказка: под Win32 можно создать проект в VS, переименовать config.h.win32 в config.h, исключить тесты из сборки.

Не допускается включать исходники библиотеки в свой проект.

Appendix

JSON описание схемы http://en.wikipedia.org/wiki/File:2-bit_ALU.png

{ "ALU": [ //Inputs

{"id" : "A0", "type": "in"}, {"id" : "A1", "type": "in"}, {"id" : "B0", "type": "in"}, {"id" : "B1", "type": "in"},

{"id" : "Op0", "type": "in"}, {"id" : "Op1", "type": "in"}, {"id" : "CarryIn", "type": "in"}, //Outputs

{"id" : "CarryOut", "type": "out", "inputs": ["ab1_l3"]}, {"id" : "Out0", "type": "out", "inputs": ["m0"]},

{"id" : "Out1", "type": "out", "inputs": ["m1"]}, //Gates

{"id" : "ab0_l1_0", "type": "xor", "inputs": ["A0","B0"]}, {"id" : "ab0_l1_1", "type": "and", "inputs": ["A0","B0"]}, {"id" : "ab0_l1_2", "type": "or", "inputs": ["A0","B0"]}, {"id" : "ab0_l1_3", "type": "xor", "inputs": ["A0","B0"]},

{"id" : "ab1_l1_0", "type": "xor", "inputs": ["A1","B1"]}, {"id" : "ab1_l1_1", "type": "and", "inputs": ["A1","B1"]},

38

{"id" : "ab1_l1_2", "type": "or", "inputs": ["A1","B1"]}, {"id" : "ab1_l1_3", "type": "xor", "inputs": ["A1","B1"]},

{"id" : "ab0_l2_0", "type": "xor", "inputs": ["CarryIn","ab0_l1_3"]}, {"id" : "ab0_l2_1", "type": "and", "inputs": ["CarryIn","ab0_l1_3"]}, {"id" : "ab0_l2_2", "type": "and", "inputs": ["A0","B0"]},

{"id" : "ab1_l2_0", "type": "xor", "inputs": ["ab0_l3","ab1_l1_3"]}, {"id" : "ab1_l2_1", "type": "and", "inputs": ["ab0_l3","ab1_l1_3"]}, {"id" : "ab1_l2_2", "type": "and", "inputs": ["A1","B1"]},

{"id" : "ab0_l3", "type": "or", "inputs": ["ab0_l2_1", "ab0_l2_2"]}, {"id" : "ab1_l3", "type": "or", "inputs": ["ab1_l2_1", "ab1_l2_2"]}, //Multiplexer

{"id" : "m0", "type": "multiplexer", "inputs": ["ab0_l1_0", "ab0_l1_1", "ab0_l1_2", "ab0_l2_0", "", "", "", "", "Op0","Op1", ""]}, {"id" : "m1", "type": "multiplexer", "inputs": ["ab1_l1_0", "ab1_l1_1", "ab1_l1_2", "ab1_l2_0", "", "", "", "", "Op0","Op1", ""]} ] }

3. Примерные нормы времени на выполнение заданий контрольных точек

Контрольная точка

Норма времени на выполнение

(в часах)

 

Раздельная компиляция и пространства имен

5

Перегрузка функций, указатели на функции,

4

перечисления

 

Классы. Реализация упрощенного григорианского

5

календаря

 

Классы. Перегрузка операций. Реализация матрицы и

4

вектора

 

Коллоквиум

1

Иерархии классов, наследование. Реализация

5

командного процессора

 

Шаблоны. Реализация шаблонов вектора и матрицы,

4

реализация шаблона «умного» указателя

 

Реализация эмулятора АЛУ

4

4. Рекомендуемая литература (основная и дополнительная)

а) основная литература:

1.Б. Страуструп Язык программирования C++, спец. изд., 3 изд. /Пер. с англ. — СПб.; М.: «Невский Диалект» — «Издательство БИНОМ», 2004 г., 2011 г. ISBN

978-5-7989-0425-9, 0-201-70073-5, 5-7940-0064-3, 5-7989-0223-4, 5-7940-0064-3

б) дополнительная литература:

2.Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Пер. с англ. — СПб.; М.: «Невский Диалект» — «Издательство БИНОМ», 1999 г. ISBN 0-8053-5340-2, 5-7989-0067-3, 5-7940-0017- 1

39

3.Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений. 3-е изд. /Пер. с англ. «Вильямс». 2010 г. ISBN 978-5-8459-1401-9, 0- 201-89551-X

4.Б. Страуструп Дизайн и эволюция языка C++, Пер. с англ. – ДМК Пресс, Питер, 2006г. ISBN 5-469-01217-4, 0-201-54330-3; 2006 г. ISBN 978-5-94074-738-3; 2011 г.

5.Скотт Мейерс, Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов, Пер. с англ. – ДМК, 2006. ISBN: 5-469-01213-1, 0- 201-92488-9

6.Скотт Мейерс, Эффективное использование С++. 55 верных советов улучшить структуру и код ваших программ. Книга по требованию. ISBN 9785940743040;

2006 г.

7.Скотт Мейерс, Наиболее эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. Пер. с англ. ДМК.

ISBN 5-94074-033-2; 2012 г

8.Скотт Мейерс, Эффективное использование STL. Питер. ISBN 5-94723-382-7; 2002 г.

в) учебно-методическая литература:

9.Рылов В.Ю. «Основы Объектно-ориентированного программирования». Электронный лекционный курс. Новосибирск 2012. (свободно доступно по адресу https://sites.google.com/site/nguoop/materialy-lekcij---s)

10.Мухортов В.В., Рылов В.Ю. Объектно-ориентированное программирование, анализ и дизайн. Методическое пособие. ИМ СО РАН, 2002 г. (свободно доступно по адресу https://sites.google.com/site/nguoop/materialy-lekcij---

s/OOP%26OOD.PDF?attredirects=0&d=1)

г) Интернет-ресурсы:

1)Основным учебно-образовательным ресурсом курса является WWW сайт http://sites.google.com/site/nguoop

2)Справочный сайт по языку C++ и стандартной библиотеке (на английском языке): http://www.cplusplus.com/

3)Справочный сайт Microsoft Developer Network, Visual C++ в Visual Studio 2013 (на русском языке) https://msdn.microsoft.com/ru-ru/library/60k1461a.aspx

4)http://www.omg.org – Object Management Group (Теория объектного подхода, UML)

5)https://code.google.com/p/googletest/ - Google C++ Testing Framework

5.Требования к представлению и оформлению результатов СРС

Программный код решений лабораторных работ должен быть опубликован в системе контроля версий SVN на сервере факультета.

Каждая задача должна быть представлена в виде отдельного проекта среды разработки (Visual Studio Express) и сопровождаться файлом ReadMe.txt описывающим основные компоненты и методику решения задания, а также параметры командной строки для запуска программы.

Код программ должен следовать одному из общепринятых соглашений, например:

40