Задание 5 - дата 11 мая
Часть 1. Общие требования
Все
создаваемые классы, их поля и функции-члены должны сопровождаться
комментариями. Каждый фрагмент кода необходимо проверять в main как можно раньше. Проверки с помощью assert должны идти раньше любого ввода и вывода в main.
Проект «Книжный магазин»
Класс книги book [25 баллов]
Создать пустой проект BookShop и добавить в него файл main.cpp с функцией main. Создать заголовочный файл book.h (не забывая о стражах включения), описать в нём пустой класс book, включить этот файл в main.cpp, собрать (build) проект. Добавить в класс book члены, перечисленные ниже.
Напоминание. Все поля должны быть закрытыми — private,
причём писать это слово необязательно, так как по умолчанию все члены
класса попадают в эту секцию, пока не открыта другая секция. Все
функции-члены размещаются в секции public, тела функций-членов определять внутри описания класса, если явно не требуется обратное.
Предостережение. Обратите внимание на ; после } в определении класса (так же, как и структуры). Её пропуск приводит к очень непонятным ошибкам компилятора!
Повторим ещё раз, что после реализации каждого из ниже перечисленных членов класса, в функцию main следует добавлять какой-либо код и собирать (build) весь проект.
Поля класса
book:_title(название книги) типаstd::string,_author(автор) типаstd::string,_price(цена): неотрицательное число с плавающей точкой двойной точности,- целочисленное поле
_discount(скидка в процентах от 0 до 100).
Конструктор класса
bookс параметрами, задающими значения всех полей, причём скидка — параметр, равный по умолчанию нулю.Указание 1. Используйте списки инициализации.
Указание 2. Если скидка находится вне промежутка от 0 до 100, должно генерироваться стандартное исключение
invalid_argument, объявленное в заголовочном файлеstdexcept:throw invalid_argument("Incorrect discount");Это условие можно проверять только в теле конструктора, так что нет возможности разумно выставить значение
discountв списке инициализации, его следует опустить. То же касается и цены: следует проверять её неотрицательность перед инициализцией соответствующего поля.Константные функции-члены
title,author,priceиdiscount, возвращающие значения соответствующих полей.Напоминание. Константность функции-члена означает, что в теле этой функции не меняется состояние (значения полей) объекта. Константность обозначается спецификатором
constпосле списка параметров в заголовке функции.Константная функция-член
real_price, вычисляющая цену товара с учётом скидки. Вынесите определение этой функции в соответствующий заголовку cpp-файл (book.cpp).Перегруженная операция вывода книги в поток (реализация в
book.hсо спецификаторомinline):ostream & operator<<(ostream & os, book const & b);Замечание. В данном случае не требуется делать операцию вывода в поток другом класса, так как в классе имеются функции доступа ко всем полям.
Функции, устанавливающие новые значения цены и скидки с именами
priceиdiscount(реализация вbook.cpp). Помните, что благодаря механизму перегрузки имён функций в C++, допускается наличие двух и более функций с одинаковым именем, но разными списками параметров.Указание. Поддерживайте инвариант класса: цена не может быть отрицательной, а скидка может быть от 0 до 100. В случае нарушения генерируйте исключение. Чтобы код проверки и установки значения скидки не дублировался в констуркторе, используйте в теле конструктора вызов функций
priceиdiscount.В функции
mainдобавьте проверку функций-членов классаbook, а также операции вывода в поток, в помощьюassert.Указание: тестирование операций с потоками. Может показаться, что операции с потоками тестировать в автоматизированном режиме (с
assert) невозможно, так как они завязаны на взаимодействие с пользователем, однако это не верно. В C++ имеются строковые потоки, которые позволяют вместо клавиатуры и дисплея использовать обычные строки. Например:std::ostringstream oss; oss << "The answer: " << 42; assert(oss.str() == "The answer: 42");Класс
ostringstream(строковый поток вывода) определён в стандартном заголовочном файлеsstream. Его функция-членstrвозвращает строковое представление всего, что было выведено в данный поток (объектossв примере) с момента его создания.
Класс книжного магазина bookshop [25 баллов]
Создать заголовочный файл bookshop.h и описать в нём класс bookshop со следующими полями (закрытыми) и функциями-членами (открытыми).
Поля
_name(название магазина,std::string) и_books(вектор объектов классаbook, т.е vector<book>).Конструктор с одним параметром — названием магазина. (Не забываем про список инициализации.)
Константная функция чтения названия магазина.
Перегруженная операция
+=для добавления книги в магазин (в виде функции-члена):bookshop & operator+=(book const & new_book) { /*...*/ }Константная функция определения количества книг в магазине.
Продемонстрировать в основной программе использование класса bookshop, использовать assert.
Часть 2. 40 баллов
Для класса точка реализовать операции:
операции == !=;
операции ввода и вывода.
Описать класс вектор. Класс должен содержать:
закрытые поля х, у;
конструктор с параметрами (p1, р2), (x, y);
конструктор по умолчанию;
методы доступа к полям;
методы вычисления длины вектора;
метод нормализации вектора;
метод вычисления угла между векторами.
Для вектора реализовать следующие операции:
==, !=;
<, > (по длине);
ввод/вывод;
+, - ;
унарный -;
*, / на число;
скалярное произведение векторов.
Для класса точки реализовать операции::
+, - вектор.
Часть 3. 10 баллов
Используя полученные методы смоделировать задачу:
Автомобиль начинает движение из точки (x0, y0) в направлении точки (x1, y1) со скоростью V м/с и ускорением a м/с2. Считая что автомобиль движется равноускоренно и прямолинейно, вычислить за какое время он достигнет. цели. Вывести положение и скорость автомобиля через каждые 10 секунд секунд движения.
Дополнительные задачи*
Создать файл bookshop.cpp и реализовать в нём следующие функции и функции-члены класса bookshop:
Перегруженная операция вывода книжного магазина в поток
Указание 1. Объявить в .h-файле эту функцию дружественной.
Указание 2. В реализации воспользоваться операцией
<<для каждого экземпляра книги в магазине.Поиск самой дешевой книги в магазине (функция должна возвращать объект класса
book).Установка заданной скидки на все книги магазина.
Продемонстрировать в основной программе использование новых функций класса
bookshop.