Задание 5 - дата 11 мая


Часть 1. Общие требования

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

Проект «Книжный магазин»

Класс книги book [25 баллов]

Создать пустой проект BookShop и добавить в него файл main.cpp с функцией main. Создать заголовочный файл book.h (не забывая о стражах включения), описать в нём пустой класс book, включить этот файл в main.cpp, собрать (build) проект. Добавить в класс book члены, перечисленные ниже.

Напоминание. Все поля должны быть закрытыми — private, причём писать это слово необязательно, так как по умолчанию все члены класса попадают в эту секцию, пока не открыта другая секция. Все функции-члены размещаются в секции public, тела функций-членов определять внутри описания класса, если явно не требуется обратное.

Предостережение. Обратите внимание на ; после }  в определении класса (так же, как и структуры). Её пропуск приводит к очень непонятным ошибкам компилятора!

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

  1. Поля класса book:

    • _title (название книги) типа std::string,
    • _author (автор) типа std::string,
    • _price (цена): неотрицательное число с плавающей точкой двойной точности,
    • целочисленное поле _discount (скидка в процентах от 0 до 100).
  2. Конструктор класса book с параметрами, задающими значения всех полей, причём скидка ­— параметр, равный по умолчанию нулю.

    Указание 1. Используйте списки инициализации.

    Указание 2. Если скидка находится вне промежутка от 0 до 100, должно генерироваться стандартное исключение invalid_argument, объявленное в заголовочном файле stdexcept:

    throw invalid_argument("Incorrect discount");

    Это условие можно проверять только в теле конструктора, так что нет возможности разумно выставить значение discount в списке инициализации, его следует опустить. То же касается и цены: следует проверять её неотрицательность перед инициализцией соответствующего поля.

  3. Константные функции-члены titleauthorprice и discount, возвращающие значения соответствующих полей.

    Напоминание. Константность функции-члена означает, что в теле этой функции не меняется состояние (значения полей) объекта. Константность обозначается спецификатором const после списка параметров в заголовке функции.

  4. Константная функция-член real_price, вычисляющая цену товара с учётом скидки. Вынесите определение этой функции в соответствующий заголовку cpp-файл (book.cpp).

  5.  Перегруженная операция вывода книги в поток (реализация в book.h со спецификатором inline):

    ostream & operator<<(ostream & os, book const & b);

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

  6. Функции, устанавливающие новые значения цены и скидки с именами price и discount (реализация в book.cpp). Помните, что благодаря механизму перегрузки имён функций в C++, допускается наличие двух и более функций с одинаковым именем, но разными списками параметров.

    Указание. Поддерживайте инвариант класса: цена не может быть отрицательной, а скидка может быть от 0 до 100. В случае нарушения генерируйте исключение. Чтобы код проверки и установки значения скидки не дублировался в констуркторе, используйте в теле конструктора вызов функций price и discount.

  7. В функции 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 со следующими полями (закрытыми) и функциями-членами (открытыми).

  1. Поля _name (название магазина, std::string) и _books  (вектор объектов класса book, т.е vector<book>).

  2. Конструктор с одним параметром — названием магазина. (Не забываем про список инициализации.)

  3. Константная функция чтения названия магазина.

  4. Перегруженная операция += для добавления книги в магазин (в виде функции-члена):

    bookshop & operator+=(book const & new_book) { /*...*/ }
  5. Константная функция определения количества книг в магазине.

 Продемонстрировать в основной программе использование класса bookshop, использовать assert.


Часть 2. 40 баллов

Для класса точка реализовать операции:

  • операции == !=;

  • операции ввода и вывода.

Описать класс вектор. Класс должен содержать:

  • закрытые поля х, у;

  • конструктор с параметрами (p1, р2),  (x, y);

  • конструктор по умолчанию;

  • методы доступа к полям;

  • методы вычисления длины вектора;

  • метод нормализации вектора;

  • метод вычисления угла между векторами.

Для вектора реализовать следующие операции:

  • ==, !=;

  • <, > (по длине);

  • ввод/вывод;

  • +, - ;

  • унарный -;

  • *, / на число;

  • скалярное произведение векторов.

Для класса точки  реализовать операции::

  • +, - вектор.

Часть 3. 10 баллов

Используя полученные методы смоделировать задачу:

Автомобиль начинает движение из точки (x0, y0) в направлении точки (x1, y1)  со скоростью м/с и ускорением м/с2. Считая что автомобиль движется равноускоренно и прямолинейно, вычислить за какое время он достигнет. цели. Вывести положение и скорость автомобиля через каждые 10 секунд секунд движения.


Дополнительные задачи*

Создать файл bookshop.cpp и реализовать в нём следующие функции и функции-члены класса bookshop:

  1. Перегруженная операция вывода книжного магазина в поток

    Указание 1. Объявить в .h-файле эту функцию дружественной.

    Указание 2. В реализации воспользоваться операцией << для каждого экземпляра книги в магазине.

  2. Поиск самой дешевой книги в магазине (функция должна возвращать объект класса book).

  3. Установка заданной скидки на все книги магазина.

  4. Продемонстрировать в основной программе использование новых функций класса bookshop.