7. Создайте перечисление для класса Book
Genre
. Предусмотрите типы для фантастики, прозы, периодических изданий, биографии и детской литературы. Отнесите каждую книгу к определенному жанру Genre и внесите соответствующие изменения в конструктор класса Book
и его функции-члены.8. Создайте класс Patron
bool
) в зависимости от того, заплатил пользователь членские взносы или нет.9. Создайте класс Library
Book
и Patron
. Включите также структуру Transaction
и предусмотрите в ней члены классов Book
, Patron
и Date
. Создайте вектор объектов класса Transaction
. Создайте функции, добавляющие записи о книгах и клиентах библиотеки, а также о состоянии книг. Если пользователь взял книгу, библиотека должна быть уверена, что пользователь является ее клиентом, а книга принадлежит ее фондам. Если эти условия не выполняются, выдайте сообщение об ошибке. Проверьте, есть ли у пользователя задолженность по уплате членских взносов. Если задолженность есть, выдайте сообщение об ошибке. Если нет, создайте объект класса Transaction
и замените его в векторе объектов класса Transaction
. Кроме того, создайте метод, возвращающий вектор, содержащий имена всех клиентов, имеющих задолженность.10. Реализуйте функцию leapyear
11. Разработайте и реализуйте набор полезных вспомогательных функций для класса Date
next_workday
(в предположении, что любой день, кроме субботы и воскресенья, является рабочим) и week_of_year
(в предположении, что первая неделя начинается 1 января, а первый день недели — воскресенье).12. Измените представление класса Date
long
и переработайте функции из раздела 9.8. Предусмотрите идентификацию дат, выходящих за пределы допустимого диапазона (отбрасывайте все даты, предшествующие нулевому дню, т.е. не допускайте отрицательных дней).13. Разработайте и реализуйте класс для представления рациональных чисел Rational
double
. Зачем нужен класс Rational
?14. Разработайте и реализуйте класс Money
long
, но ввод и вывод должны использовать доллары и центы, например $123.45. Не беспокойтесь о суммах, выходящих за пределы диапазона типа long
.15. Уточните класс Money
long
. Не допускайте некорректных операций. Например, выражение Money*Money
не имеет смысла, а USD1.23+DKK5.00
имеет смысл, только если существует таблица преобразования, определяющая обменный курс между американскими долларами (USD) и датскими кронами (DKK).16. Приведите пример вычислений, в котором класс Rational
Money
.17. Приведите пример вычислений, в котором класс Rational
double
.Послесловие
Существует много типов, определенных пользователем. Их гораздо больше, чем представлено здесь. Типы, определенные пользователем, особенно классы, образуют ядро языка С++ и являются ключом ко многим эффективным методам проектирования. Большая часть оставшихся глав посвящена проектированию и использованию классов. Класс — или набор классов — это механизм, позволяющий выразить наши концепции в виде кода. В этой главе мы изложили в основном языковые аспекты классов, в последующих главах мы сосредоточимся на том, как элегантно выразить полезные идеи в виде классов.
Часть II
Ввод и вывод
Глава 10
Потоки ввода и вывода
“Наука — это знания о том, как не дать себя одурачить”.
Ричард Фейнман (Richard P. Feynman)