← Все проекты уровня 1
Уровень 1 · Простые консольные программыВариант B

Зарплата по сменам

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

Техническое задание

Задача

Напишите консольный калькулятор начисления за одну смену. Программа принимает обязательные аргументы --hours, --regular-limit, --regular-rate и --overtime-rate. Первые два значения — количество отработанных часов и предел обычной части смены; ставки задаются в рублях за час. Часы и ставки могут быть десятичными, но обязаны быть конечными числами. Порог относится к одной смене, считается обычным временем включительно: часы до порога оплачиваются по обычной ставке, только превышение — по ставке сверхурочных.

Программа должна вычислить обычные часы как меньшее из общего времени и лимита, сверхурочные — как превышение над лимитом, но не меньше нуля. Начисление равно сумме произведений часов каждой части на соответствующую ставку. Не вводите надбавку за ночное время, налоги, премии, округление по дням или перенос остатка часов между сменами: программа обрабатывает ровно одну смену и показывает только начисление до удержаний. Вывод должен содержать обычные часы, сверхурочные часы и итоговую сумму в рублях с двумя знаками после запятой. Денежный результат округляется до копейки один раз после сложения частей; для неотрицательной суммы ровно половина копейки округляется вверх.

Все четыре аргумента обязательны. Отклоняйте пропущенные флаги, некорректные числа, NaN и бесконечность, отрицательные часы, отрицательный лимит и отрицательные ставки. Ноль часов и нулевые ставки разрешены; нулевой лимит означает, что все отработанное время считается сверхурочным. При ошибке напечатайте краткое описание в stderr и завершитесь с ненулевым кодом, не показывая расчёт. Реализуйте вычисление отдельно от чтения аргументов, чтобы его можно было проверить обычными тестами Go.

Структура программы

Пусть main.go читает аргументы, вызывает расчёт смены и отвечает за вывод ошибки и результата. В другом файле package main реализуйте чистую функцию разбиения часов на обычные и сверхурочные и вычисления суммы; оформление строк отчёта вынесите отдельно. Тестируйте расчёт напрямую, без запуска main и os.Exit.

Критерии готовности

Ожидаемый результат

Результат — запускаемый Go-модуль с расчётной логикой, CLI, README и тестами без сетевых зависимостей. В документации объясните значения флагов, что лимит применяется отдельно к одной смене, и как округляется сумма. Формат отчёта должен позволять увидеть распределение часов, а не только конечную зарплату.

Критерии приёмки:

  • README описывает расчёт отдельно от CLI; арифметика смены тестируется напрямую.
  • 8 часов при лимите 8, ставке 300 ₽ и любой ставке сверхурочных дают 2400 ₽ обычной части и ноль сверхурочных;
  • 10 часов при лимите 8, ставках 300 ₽ и 450 ₽ дают 2400 ₽ плюс 900 ₽, итого 3300 ₽;
  • нулевой лимит относит все часы к сверхурочным;
  • нулевая длительность даёт нулевое начисление. Отрицательная ставка, отрицательные часы, бесконечное значение и отсутствие обязательного флага должны приводить к ошибке с ненулевым кодом и без частичного отчёта.

Для ориентира

Примеры входа и результата

Ввод: --hours 10 --regular-limit 8 --regular-rate 300 --overtime-rate 450. Вывод: обычные часы 8; сверхурочные 2; начислено 3300,00 ₽. Ввод: --hours 8 --regular-limit 8 --regular-rate 300 --overtime-rate 450. Вывод: обычные часы 8; сверхурочные 0; начислено 2400,00 ₽.