KnigkinDom.org» » »📕 Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

1 ... 101 102 103 104 105 106 107 108 109 ... 337
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
(m < Date::jan || Date::dec < m) return false;

    int days_in_month = 31; // большинство месяцев состоит из 31 дня

    switch (m) {

    case Date::feb: // продолжительность февраля варьирует

      days_in_month = (leapyear(y)) ? 29:28;

      break;

    case Date::apr: case Date::jun: case Date::sep: case

      Date::nov:

      days_in_month = 30; // остальные месяцы состоят из 30 дней

      break;

    }

    if (days_in_month<d) return false;

    return true;

  }

  bool leapyear(int y)

  {

    // см. упражнение 10

  }

  bool operator==(const Date& a, const Date& b)

  {

    return a.year()==b.year()

      && a.month()==b.month()

      && a.day()==b.day(); 

  }

  bool operator!=(const Date& a, const Date& b)

  {

    return !(a==b);

  }

  ostream& operator<<(ostream& os, const Date& d)

  {

    return os << '(' << d.year()

      << ',' << d.month()

      << ',' << d.day() << ')';

  }

  istream& operator>>(istream& is, Date& dd)

  {

    int y, m, d;

    char ch1, ch2, ch3, ch4;

    is >> ch1 >> y >> ch2 >> m >> ch3 >> d >> ch4;

    if (!is) return is;

    if (ch1!='(' || ch2!=',' || ch3!=',' || ch4!=')') { // ошибка формата

      is.clear(ios_base::failbit); // установлен неправильный бит

      return is;

    }

    dd = Date(y, Date::Month(m),d); // обновляем dd

    return is;

  }

  enum Day {

    sunday, monday, tuesday, wednesday, thursday, friday, saturday

  };

  Day day_of_week(const Date& d)

  {

    // ...

  }

  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. Предусмотрите типы для

1 ... 101 102 103 104 105 106 107 108 109 ... 337
Перейти на страницу:
Отзывы - 0

Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.


Партнер

Новые отзывы

  1. Гость Татьяна Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
  2. Римма Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
  3. Римма Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова
Все комметарии
Новое в блоге