Задание 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
.