diff --git a/tasks/05/README.md b/tasks/05/README.md index 14ff3a48..c31ba5f5 100644 --- a/tasks/05/README.md +++ b/tasks/05/README.md @@ -539,7 +539,7 @@ public: 4 - + - @@ -605,18 +605,425 @@ public: -Результат выполнения арифметических операций, в которых один из аргументов является невалидным значением, должен также давать невалидное значение времени (см. примечание). +Результат выполнения арифметических операций, в которых один из аргументов является невалидным значением, +должен также давать невалидное значение времени (см. примечание). -При выходе результата после выполнения операций за пределы диапазона 00:00:00 – 23:59:59 приводить результат к этому диапазону. Например: +При выходе результата после выполнения операций за пределы диапазона 00:00:00 – 23:59:59 приводить результат к этому диапазону. +Например: - 23:59:59 + 00:00:03 = 00:00:02 - 00:00:05 – 00:00:10 = 23:59:55 -**Подсказка**: данный класс будет проще реализовать, если вместо трех приватных переменных (часы, минуты и секунды) вы будете использовать только одну единственную переменную для хранения секунд после полуночи и все операции производить над нею. +**Подсказка**: данный класс будет проще реализовать, если вместо трех приватных переменных (часы, минуты и секунды) +вы будете использовать только одну единственную переменную для хранения секунд после полуночи и +все операции производить над нею. -**Примечание**: если проводить валидацию параметров в конструкторе и выбрасывать исключение в случае ошибки, то метод IsValid реализовывать не нужно. Автоматически решится проблема с выполнением арифметических операций, в которых участвуют невалидные значения времени. +**Примечание**: если проводить валидацию параметров в конструкторе и выбрасывать исключение в случае ошибки, +то метод IsValid реализовывать не нужно. Автоматически решится проблема с выполнением арифметических операций, +в которых участвуют невалидные значения времени. -В процессе разработки класса использование подхода TDD обязательно. Без автоматических тестов работа будет принята с коэффициентом 0.5. +В процессе разработки класса использование подхода TDD обязательно. +Без автоматических тестов работа будет принята с коэффициентом 0.5. + +Разработайте программу, использующую разработанный Вами класс `CTime`, +которая обрабатывает команды пользователя, вводимые им со стандартного потока ввода: + +Инкремент и декремент времени: + +- `++ HH:MM:SS`. Увеличивает время на 1 секунду. +- `-- HH:MM:SS`. Уменьшает время на 1 секунду. + +Арифметические операции над временем: + +- `+ HH:MM:SS HH:MM:SS`. Выполняет сложение двух времён. +- `- HH:MM:SS HH:MM:SS`. Вычитание одного времени из другого. +- `+= HH:MM:SS HH:MM:SS`. Добавление времени к текущему. +- `-= HH:MM:SS HH:MM:SS`. Вычитание времени из текущего. +- `* HH:MM:SS N`. Умножает время на целое число и наоборот. +- `divByNumber HH:MM:SS N`. Делит время на целое число. +- `divByTime HH:MM:SS HH:MM:SS`. Выполняет целочисленное деление одного времени на другое. +- `*= HH:MM:SS N`. Умножение текущего времени на целое число. +- `/= HH:MM:SS N`. Деление текущего времени на целое число. + +Ввод и вывод времени: + +- `fromSeconds SECONDS`. Устанавливает время как количество секунд от полуночи и выводит его в формате HH:MM:SS. + +Операторы сравнения времени: + +- `== HH:MM:SS HH:MM:SS`. Проверяет равенство двух временных значений. +- `!= HH:MM:SS HH:MM:SS`. Проверяет неравенство двух временных значений. +- `< HH:MM:SS HH:MM:SS`. Проверяет, является ли первое значение времени меньше второго. +- `> HH:MM:SS HH:MM:SS`. Проверяет, является ли первое значение времени больше второго. +- `<= HH:MM:SS HH:MM:SS`. Проверяет, является ли первое значение времени меньше или равно второму. +- `>= HH:MM:SS HH:MM:SS`. Проверяет, является ли первое значение времени больше или равно второму. + +##### Формат входных данных + +Входные данные представляют собой команды, вводимые пользователем через стандартный поток ввода (stdin). +Каждая строка ввода содержит одну команду и соответствующие параметры, разделенные пробелами. +Форматы для каждой команды приведены выше. + +##### Формат выходных данных + +Результаты выполнения команд выводятся в стандартный поток вывода (stdout). Формат зависит от команды: + +Инкремент и декремент времени: + +- Для команды `++ HH:MM:SS` выводится **4** значения: + 1. Значение, возвращённое префиксной операцией в формате `HH:MM:SS`. + 2. Значение объекта после префиксной операции в формате `HH:MM:SS`. + 3. Значение, возвращённое постфиксной операцией в формате `HH:MM:SS`. + 4. Значение объекта после постфиксной операции в формате `HH:MM:SS`. + +- Для команды `-- HH:MM:SS` выводится **4** значения: + 1. Значение, возвращённое префиксной операцией в формате `HH:MM:SS`. + 2. Значение объекта после префиксной операции в формате `HH:MM:SS`. + 3. Значение, возвращённое постфиксной операцией в формате `HH:MM:SS`. + 4. Значение объекта после постфиксной операции в формате `HH:MM:SS`. + +Арифметические операции над временем: + +- Для операций сложения и вычитания (`+ HH:MM:SS HH:MM:SS`, `- HH:MM:SS HH:MM:SS`), результат выводится в формате `HH:MM:SS`. +- Для операций добавления и вычитания времени из текущего значения (`+= HH:MM:SS HH:MM:SS`, `-= HH:MM:SS HH:MM:SS`), +результат выводится в формате `HH:MM:SS`. + +- Для умножения на целое число (`* HH:MM:SS N`) выводится **2** значения: + 1. Результат умножения числа на время (`N * HH:MM:SS`) в формате `HH:MM:SS`. + 2. Результат умножения времени на число (`HH:MM:SS * N`) в формате `HH:MM:SS`. + +- Для деления времени на целое число (`divByNumber HH:MM:SS N`), результат выводится в формате `HH:MM:SS`. +- Для целочисленного деления одного времени на другое (`divByTime HH:MM:SS HH:MM:SS`), +результат выводится в виде **целого числа**. +- Для операций умножения и деления текущего времени на число (`*= HH:MM:SS N`, `/= HH:MM:SS N`), результат +выводится в формате `HH:MM:SS`. + +Ввод и вывод времени: + +- Для команды `fromSeconds SECONDS` время выводится в формате `HH:MM:SS`. + +Операторы сравнения времени: + +- Для всех операций сравнения между двумя временами, результат выводится в виде одного из двух значений: `true` или `false`. + +Обработка ошибок: + +- Если входные данные некорректны (например, содержат нечисловые значения или неверный формат времени), +программа должна выводить в стандартный поток вывода «**INVALID**» и продолжать выполнение. + +##### Примеры входных и выходных данных + +###### Пример 1 + +Ввод: + +```txt +++ 23:59:59 +++ 25:00:00 +``` + +Вывод: + +```txt +00:00:00 +00:00:00 +00:00:00 +00:00:01 +INVALID +``` + +Объяснение: Время увеличивается на 1 секунду, переходя через полночь. Второй ввод некорректен, +так как часы не могут быть больше 24. + +###### Пример 2 + +Ввод: + +```txt +-- 00:00:00 +-- 00:60:00 +``` + +Вывод: + +```txt +23:59:59 +23:59:59 +23:59:59 +23:59:58 +INVALID +``` + +Объяснение: Время уменьшается на 1 секунду, переходя через полночь. Второй ввод некорректен, +так как минуты не могут быть больше 59. + +###### Пример 3 + +Ввод: + +```txt ++ 14:30:25 03:18:44 ++ 14:30:25 invalid_time +``` + +Вывод: + +```txt +17:49:09 +INVALID +``` + +Объяснение: Время складывается, получая новый результат. Второй ввод некорректен, +так как одно из времён имеет неправильный формат. + +###### Пример 4 + +Ввод: + +```txt +- 14:30:25 03:18:44 +``` + +Вывод: + +```txt +11:11:41 +``` + +Объяснение: Одно время вычитается из другого. + +###### Пример 5 + +Ввод: + +```txt ++= 14:30:25 03:18:44 +``` + +Вывод: + +```txt +17:49:09 +``` + +Объяснение: К текущему времени добавляется указанное. + +###### Пример 6 + +Ввод: + +```txt +-= 14:30:25 03:18:44 +``` + +Вывод: + +```txt +11:11:41 +``` + +Объяснение: Из текущего времени вычитается указанное. + +###### Пример 7 + +Ввод: + +```txt +* 03:05:15 3 +``` + +Вывод: + +```txt +09:15:45 +09:15:45 +``` + +Объяснение: Время умножается на число в обеих формах. + +###### Пример 8 + +Ввод: + +```txt +divByNumber 09:15:40 3 +divByNumber 10:00:00 0 +``` + +Вывод: + +```txt +03:05:13 +INVALID +``` + +Объяснение: Время делится на число. Второй ввод некорректен, так как деление на ноль невозможно. + +###### Пример 9 + +Ввод: + +```txt +divByTime 09:15:40 03:05:13 +``` + +Вывод: + +```txt +3 +``` + +Объяснение: Выполняется целочисленное деление времени на время. + +###### Пример 10 + +Ввод: + +```txt +*= 03:05:15 3 +``` + +Вывод: + +```txt +09:15:45 +``` + +Объяснение: Текущее время умножается на число. + +###### Пример 11 + +Ввод: + +```txt +/= 09:15:45 3 +``` + +Вывод: + +```txt +03:05:15 +``` + +Объяснение: Текущее время делится на число. + +###### Пример 12 + +Ввод: + +```txt +fromSeconds 3661 +fromSeconds -100 +``` + +Вывод: + +```txt +01:01:01 +INVALID +``` + +Объяснение: Время задается количеством секунд от полуночи. Второй ввод некорректен, +так как количество секунд не может быть отрицательным. + +###### Пример 13 + +Ввод: + +```txt +== 14:30:25 14:30:25 +== 14:30:25 14:30:60 +``` + +Вывод: + +```txt +true +INVALID +``` + +Объяснение: Время одинаковое, поэтому результат - true. Второй ввод некорректен, +так как 60 секунд в минуте - недопустимое значение. + +###### Пример 14 + +Ввод: + +```txt +!= 14:30:25 15:30:25 +``` + +Вывод: + +```txt +true +``` + +Объяснение: Время не одинаковое , поэтому результат - true. + +###### Пример 15 + +Ввод: + +```txt +< 14:30:25 15:30:25 +``` + +Вывод: + +```txt +true +``` + +Объяснение: Первое время меньше второго, поэтому результат - true. + +###### Пример 16 + +Ввод: + +```txt +> 14:30:25 15:30:25 +``` + +Вывод: + +```txt +false +``` + +Объяснение: Первое время меньше второго, поэтому результат - false. + +###### Пример 17 + +Ввод: + +```txt +<= 14:30:25 15:30:25 +``` + +Вывод: + +```txt +true +``` + +Объяснение: Первое время меньше или равно второму, результат - true. + +###### Пример 18 + +Ввод: + +```txt +>= 15:30:25 15:30:25 +``` + +Вывод: + +```txt +true +``` + +Объяснение: Первое время больше или равно второму, результат - true. #### Вариант 5. До 220 баллов