{ ostringstream s; // строковый поток // флаг-переключатель // формат dd.mm.yyyy int day = data.date%100; int year = data.date/10000; int month = data.date/100%100; switch(TDate::fmt) { case TDate::pointDate: s << setfiliee') // формат yyyymmdd << setw(2) << day << ' . ' << setw(2) << month <<<< setw(4) << year; break; case TDate::intDate: s << data.date; break; // формат dd-mmm-yyyy
case TDate::stringDate: s << setfiliee1) << setw(2) << day << '-' << TDate::m[month-l] << << setw(4) << year; break; } return os << s.str(); }
Операция ввода, естественно, должна быть «симметричной», то есть обеспечивать ввод любого из этих форматов. Очевидно, необходимо реализовать те же манипуляторы ввода как дружественные классу TDate функции:
friend istream& intdate (istream &is) { fmt = intDate; return is; } friend istream& pointdate (istream &is) { fmt = pointDate; return is; } friend istream& stringdate(istream &is) { fmt = stringDate; return is; }
Кроме того, при вводе необходимо контролировать правильность задания месяца и дня. Очевидно, это можно сделать, использовав входной строковый поток и ограничив размер поля ввода. Не особо задумываясь о производительности и оптимальности кода, реализуем функцию ввода самым простым способом (листинг 14.21). Так как функция служит только для ввода даты и «не знает» ничего о входном потоке, в случае любой ошибки будем устанавливать флаг ios::badbit. Таким образом, после первой же ошибки последующие операции ввода выполняться не будут. Кроме того, это даст нам возможность «повесить» на этот флаг прерывание ввода, вызвав метод extensions(), например, в конструкторе. Принимать решение о продолжении или завершении ввода будет вызывающая программа.
Если у вас есть телефон, тогда обязательно купите чехол для него тут - http://primuss.ru/cat/accessories_for_samsung_tablets/the_case_for_samsung_galaxy_pro_10_1_t520_t525_black_book/.
Упражнения
5. Создать класс Triangle для представления треугольника. Поля данных являются сторонами треугольника. Определить подходящие исключения. Должны быть реализованы операции получения и изменения полей данных, вычисления площади, вычисления периметра, вычисления высот, вычисления углов, определения вида треугольника (равносторонний, равнобедренный, прямоугольный). В случае возникновения ошибок методы должны генерировать исключения.
6. Модифицировать класс doubleArray (см. упражнение 1 в главе 5), обеспечив генерацию исключений в аварийных ситуациях. Задействовать подходящие стандартные исключения; в секциях-ловушках использовать метод what().
7. Реализовать динамический класс Rational (см. упражнение 10 в главе 2), обеспечив генерацию исключений в случае ошибок. Определить спецификации исключений во всех методах, где необходимо. Задействовать подходящие стандартные исключения; в секциях-ловушках использовать метод what().
8. Реализовать динамический класс Money (см. упражнение 4 в главе 4), обеспечив обработку исключений. Переопределить функцию завершения terminateO.
9. Написать функцию, выполняющую деление комплексных чисел А и В:
(а, Ь) / (с, d) = (ас + Ы be - ad) / (с2 + d2).
Комплексное число представлено структурой с двумя полями: firstnsecond. Определить в заголовке спецификацию исключения, использовав собственные исключения. В случае ошибки функция должна генерировать неперехваченное исключение. В контролируемом блоке определить секцию-ловушку, которая перехватывает все исключения.
Опубликовал Kest
May 23 2014 22:24:56 ·
0 Комментариев ·
3083 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.