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

Калькулятор рецепта

Пересчитайте список ингредиентов на другое число порций, не теряя исходные единицы.

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

Задача

Создайте небольшую CLI-программу, которая масштабирует рецепт. Она получает путь к JSON-файлу с полями portions и ingredients, а также обязательный флаг --target с целым количеством желаемых порций. Каждый ингредиент содержит непустые name и unit и положительное quantity — конечное десятичное число. Пример структуры: объект с portions: 4 и массивом ингредиентов, где каждый элемент задаёт название, количество и единицу измерения. Порядок ингредиентов в исходном файле должен сохраниться.

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

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

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

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

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

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

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

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

  • README описывает границу пересчёта; количества тестируются без файла и main.go.
  • 200 г муки в рецепте на 4 порции превращаются в 300 г для 6 порций;
  • 2 яйца превращаются в 1 яйцо для 2 порций;
  • ингредиенты печатаются в исходном порядке;
  • значение 0,5 сохраняется как дробное количество с понятным форматированием. Нечитаемый файл, некорректный JSON, нулевая исходная порционность, пустая единица и целевое число 0 должны давать ошибку и не менять исходный файл. Тесты выполняются локально через go test ./... без подключения к Интернету.

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

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

Ввод: рецепт на 4 порции содержит 200 г муки и 2 яйца; --target 6. Вывод: мука 300 г; яйца 3 шт. Ввод: тот же рецепт; --target 2. Вывод: мука 100 г; яйца 1 шт.