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

Стоимость поездки

Посчитайте бюджет автомобильного путешествия и честно распределите его между участниками.

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

Задача

Создайте консольную программу для оценки общей стоимости поездки и суммы на одного участника. Входные данные задаются аргументами командной строки: расстояние в километрах, расход топлива в литрах на 100 км, цена литра топлива в рублях, число участников, число ночёвок, цена одной ночи проживания за номер, число дней питания и стоимость питания на одного человека в день. Обязательные флаги: --distance, --consumption, --fuel-price, --people, --nights, --lodging-per-night, --days, --meal-per-person-day. Все числовые значения вводятся десятичными числами, кроме количества людей, ночёвок и дней, которые должны быть целыми.

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

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

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

В main.go оставьте разбор флагов, вызовом расчёта и обработкой ошибки. В отдельном файле package main разместите функцию стоимости поездки: она принимает значения поездки и возвращает категории расходов и долю участника, не читая аргументы и не печатая результат. Форматирование отчёта тоже вынесите в отдельную функцию.

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

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

Поставьте в корне проекта запускаемый модуль Go с точкой входа и README на русском языке. В README должны быть перечислены флаги, единицы измерения, правила округления, команда запуска и объяснение того, что стоимость проживания указана за один номер. Добавьте автономные тесты расчётов и проверки аргументов, которые запускаются стандартной командой go test ./... без сети.

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

  • README описывает границу расчёта; тест проверяет стоимость без main.go.
  • поездка 100 км при расходе 8 л/100 км и цене 60 ₽/л даёт 480 ₽ топлива;
  • две ночи по 1500 ₽ дают ровно 3000 ₽ независимо от числа участников;
  • 3 участника, 2 дня питания по 500 ₽ дают 3000 ₽ питания;
  • общая сумма этих категорий равна 6480 ₽, доля на человека — 2160 ₽. Дополнительно нулевые ночи дают нулевое проживание, ноль участников и отрицательная цена завершаются ошибкой без отчёта, а дробные денежные значения округляются до копейки по документированному правилу.

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

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

Ввод: --distance 100 --consumption 8 --fuel-price 60 --people 3 --nights 2 --lodging-per-night 1500 --days 2 --meal-per-person-day 500. Вывод: топливо 480,00 ₽; проживание 3000,00 ₽; питание 3000,00 ₽; всего 6480,00 ₽; на человека 2160,00 ₽. Ввод с --people 0 завершается сообщением об ошибке и ненулевым кодом.