Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Date next_Sunday(const Date& d)

{

// ...

}

Date next_weekday(const Date& d)

{

// ...

}

} // Chrono

Функции, реализующие операции

>>
и
<<
для класса
Date
, будут подробно рассмотрены в разделах 10.7 и 10.8.

Задание

Это задание сводится к запуску последовательности версий класса

Date
.
Для каждой версии определите объект класса
Date
с именем
today
, инициализированный датой 25 июня 1978 года. Затем определите объект класса
Date
с именем tomorrow и присвойте ему значение, скопировав в него объект
today
и увеличив его день на единицу с помощью функции
add_day
. Выведите на печать объекты
today
и
tomorrow
, используя оператор
<<
, определенный так, как показано в разделе 9.8.

Проверка корректности даты может быть очень простой. В любом случае не допускайте, чтобы месяц выходил за пределы диапазона [1,12], а день месяца — за пределы диапазона [1,31]. Проверьте каждую версию хотя бы на одной некорректной дате, например (2009, 13, –5).

1. Версия из раздела 9.4.1.

2. Версия из раздела 9.4.2.

3. Версия из раздела 9.4.3.

4. Версия из раздела 9.7.1.

5. Версия из раздела 9.7.4.

Контрольные вопросы

1. Какие две части класса описаны в главе?

2. В чем заключается разница между интерфейсом и реализацией класса?

3. Какие ограничения и проблемы, связанные со структурой

Date
, описаны в этой главе?

4. Почему в классе

Date
используется конструктор, а не функция
init_day
?

5. Что такое инвариант? Приведите примеры.

6. Когда функции следует размещать в определении класса, а когда — за его пределами? Почему?

7. Когда следует применять перегрузку оператора? Перечислите операторы, которые вы хотели бы перегрузить (укажите причину).

8. Почему открытый интерфейс класса должен быть минимальным?

9. Что изменится, если к объявлению функции-члена добавить ключевое слово

const
?

10. Почему вспомогательные функции лучше всего размещать за пределами класса?

Термины

Упражнения

1. Перечислите разумные операторы для реальных объектов, указанных в разделе 9.1 (например, для тостера).

2. Разработайте и реализуйте класс

Name_pairs
, содержащий пару (имя,возраст), где имя — объект класса
string
, а возраст — переменная типа
double
. Представьте эти члены класса в виде объектов классов
vector<string>
(с именем name ) и
vector<double>
(с именем
age
). Предусмотрите операцию ввода
read_names
, считывающую ряд имен. Предусмотрите операцию
read_ages
, предлагающую пользователю ввести возраст для каждого имени. Предусмотрите операцию
print
, которая выводит на печать пары (
name[i]
,
age[i]
) (по одной на строке) в порядке, определенном вектором name. Предусмотрите операцию
sort
, упорядочивающую вектор
name
в алфавитном порядке и сортирующую вектор
age
соответствующим образом. Реализуйте все “операции” как функции-члены. Проверьте этот класс (конечно, проверять надо как можно раньше и чаще).

3. Замените функцию

Name_pair::print
(глобальным) оператором
operator<<
и определите операции
==
и
!=
для объектов класса
Name_pair
.

4. Посмотрите на головоломный пример из раздела 8.4. Вставьте его в программу и объясните смысл каждой конструкции. Обратите внимание на то, что этот код не делает никаких осмысленных операций; он используется только для усложнения примера.

5. Для выполнения этого и нескольких следующих упражнений необходимо разработать и реализовать класс

Book
, который является частью программного обеспечения
библиотеки. Класс
Book
должен иметь члены для хранения кода ISBN, названия, фамилии автора и даты регистрации авторских прав. Кроме того, он должен хранить данные о том, выдана книга на руки или нет. Создайте функции, возвращающие эти данные. Создайте функции, проверяющие, выдана ли книга на руки или нет. Предусмотрите простую проверку данных, которые вводятся в объект класса
Book;
например, код ISBN допускается только в форме
n-n-n-x
, где
n
— целое число;
x
— цифра или буква.

6. Добавьте операторы в класс

Book
. Пусть оператор
==
проверяет, совпадают ли коды ISBN у двух книг. Пусть также оператор
!=
сравнивает цифры ISBN, а оператор
<<
выводит на печать название, фамилию автора и код ISBN в отдельных строках.

7. Создайте перечисление для класса

Book
с именем
Genre
. Предусмотрите типы для фантастики, прозы, периодических изданий, биографии и детской литературы. Отнесите каждую книгу к определенному жанру Genre и внесите соответствующие изменения в конструктор класса
Book
и его функции-члены.

8. Создайте класс

Patron
для библиотеки. Этот класс должен содержать имя пользователя, номер библиотечной карточки, а также размер членского взноса. Предусмотрите функции, имеющие доступ к этим членам, а также функцию, устанавливающую размер членского взноса. Предусмотрите вспомогательный метод, возвращающий булево значение (
bool
) в зависимости от того, заплатил пользователь членские взносы или нет.

9. Создайте класс

Library
. Включите в него векторы классов
Book
и
Patron
. Включите также структуру
Transaction
и предусмотрите в ней члены классов
Book
,
Patron
и
Date
. Создайте вектор объектов класса
Transaction
. Создайте функции, добавляющие записи о книгах и клиентах библиотеки, а также о состоянии книг. Если пользователь взял книгу, библиотека должна быть уверена, что пользователь является ее клиентом, а книга принадлежит ее фондам. Если эти условия не выполняются, выдайте сообщение об ошибке. Проверьте, есть ли у пользователя задолженность по уплате членских взносов. Если задолженность есть, выдайте сообщение об ошибке. Если нет, создайте объект класса
Transaction
и замените его в векторе объектов класса
Transaction
. Кроме того, создайте метод, возвращающий вектор, содержащий имена всех клиентов, имеющих задолженность.

10. Реализуйте функцию

leapyear
из раздела 9.8.

11. Разработайте и реализуйте набор полезных вспомогательных функций для класса

Date
, включая такие функции, как
next_workday
(в предположении, что любой день, кроме субботы и воскресенья, является рабочим) и
week_of_year
(в предположении, что первая неделя начинается 1 января, а первый день недели — воскресенье).

12. Измените представление класса

Date
и пронумеруйте дни, прошедшие с 1 января 1970 года (так называемый нулевой день), с помощью переменной типа
long
и переработайте функции из раздела 9.8. Предусмотрите идентификацию дат, выходящих за пределы допустимого диапазона (отбрасывайте все даты, предшествующие нулевому дню, т.е. не допускайте отрицательных дней).

13. Разработайте и реализуйте класс для представления рациональных чисел

Rational
. Рациональное число состоит из двух частей: числителя и знаменателя, например 5/6 (пять шестых, или .83333). При необходимости еще раз проверьте определение класса. Предусмотрите операторы присваивания, сложения, вычитания, умножения, деления и проверки равенства. Кроме того, предусмотрите преобразование в тип
double
. Зачем нужен класс
Rational
?

14. Разработайте и реализуйте класс

Money
для вычислений, связанных с долларами и центами, точность которых определяется по правилу округления 4/5 (0,5 цента округляется вверх, все, что меньше 0,5, округляется вниз). Денежные суммы должны представляться в центах с помощью переменной типа
long
, но ввод и вывод должны использовать доллары и центы, например $123.45. Не беспокойтесь о суммах, выходящих за пределы диапазона типа
long
.

Поделиться:
Популярные книги

Кодекс Крови. Книга Х

Борзых М.
10. РОС: Кодекс Крови
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга Х

Легат

Прокофьев Роман Юрьевич
6. Стеллар
Фантастика:
боевая фантастика
рпг
6.73
рейтинг книги
Легат

Защитник. Второй пояс

Игнатов Михаил Павлович
10. Путь
Фантастика:
фэнтези
5.25
рейтинг книги
Защитник. Второй пояс

Счастье быть нужным

Арниева Юлия
Любовные романы:
любовно-фантастические романы
5.25
рейтинг книги
Счастье быть нужным

Огненный князь 3

Машуков Тимур
3. Багряный восход
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Огненный князь 3

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Не грози Дубровскому! Том III

Панарин Антон
3. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том III

Не отпускаю

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
8.44
рейтинг книги
Не отпускаю

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Приручитель женщин-монстров. Том 4

Дорничев Дмитрий
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4

Кодекс Охотника. Книга XVIII

Винокуров Юрий
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVIII

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны