Перейти к основному содержанию
EDU-MMCS
Вы используете гостевой доступ (Вход)

Новые возможности PascalABC.net и ООП в С++

  1. В начало
  2. Курсы
  3. Дополнительное образование
  4. Новые возможности Р
  5. 3 мая - 9 мая
  6. Задание 5 - дата 11 мая

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

Требуемые условия завершения
Открыто с: вторник, 11 апреля 2017, 17:20
Срок сдачи: четверг, 18 мая 2017, 00:00


Часть 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. Константные функции-члены title, author, price и 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)  со скоростью V м/с и ускорением a м/с2. Считая что автомобиль движется равноускоренно и прямолинейно, вычислить за какое время он достигнет. цели. Вывести положение и скорость автомобиля через каждые 10 секунд секунд движения.


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

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

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

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

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

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

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

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



◄ Задание 4. Классы.
Задание 6 - дата 15 мая ►
Пропустить Навигация
Навигация
  • В начало

    • Страницы сайта

      • Мои курсы

      • Теги

    • Мои курсы

    • Курсы

      • Дополнительное образование

        • матем-10 (онлайн)

        • Информатика НК

        • Информатика 0 курс

        • ДиПВеб

        • Новые возможности Р

          • Общее

          • 1 февраля - 7 февраля

          • 8 февраля - 14 февраля

          • 15 февраля - 21 февраля

          • 22 февраля - 28 февраля

          • 1 марта - 7 марта

          • 8 марта - 14 марта

          • 15 марта - 21 марта

          • 22 марта - 28 марта

          • 29 марта - 4 апреля

          • 5 апреля - 11 апреля

          • 12 апреля - 18 апреля

          • 19 апреля - 25 апреля

          • 26 апреля - 2 мая

          • 3 мая - 9 мая

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

          • 10 мая - 16 мая

          • 17 мая - 23 мая

        • СоврМОИ

        • Педагогическое образование: технологии реализации ...

      • Осенний семестр

        • Прикладная математика и информатика

        • Фундаментальная информатика и ИТ

        • Математика, механика

        • Педагогическое образование

        • Магистратура

          • Разработка мобильных приложений и компьютерных игр

        • Аспирантура

        • Вечернее отделение

        • Другое

      • Весенний семестр

        • Прикладная математика и информатика

        • Фундаментальная информатика и ИТ

        • Математика, механика

        • Педагогическое образование

        • Магистратура

          • Разработка мобильных приложений и компьютерных игр

        • Аспирантура

        • Вечернее отделение

        • Другое

      • Воскресная компьютерная школа

        • Пользователь компьютера плюс

        • Пользователь прикладных программ

        • Программирование I ступень

        • Программирование II ступень

        • Программирование III ступень

        • Архив

      • Воскресная математическая школа

        • Открытое тестирование РНОМЦ и мехмата ЮФУ - 2025

        • Олимпиадная математическая школа

        • Повышение квалификации

        • Доступная математика

        • Лаборатория математического онлайн-образования мех...

        • Осенняя универсиада

        • Научно-практическая конференция

        • ВМШ

          • ВМШ - 24

        • Летняя олимпиадная математическая школа РНОМЦ и ме...

      • Государственная итоговая аттестация

      • Олимпиады

      • Видеолекции

      • Разное

      • Архив курсов

      • Заочная школа мехмата ЮФУ

Служба поддержки сайта
Вы используете гостевой доступ (Вход)
Новые возможности Р
Сводка хранения данных
Скачать мобильное приложение Яндекс.Метрика