Menu
Coddy logo textTech

Собираем всё вместе

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 25 из 68.

challenge icon

Задание

Легко

Завершите создание вашей системы управления запасами, разработав комплексную основную программу, которая объединяет все функциональные возможности, созданные в предыдущих уроках. Эта финальная задача объединяет инициализацию инвентаря, проверку остатков, добавление товаров, обновление запасов и генерацию отчетов в полноценный интерфейс командной строки с навигацией через меню.

Вы получите три входных параметра:

  • Строку, содержащую начальные данные инвентаря в формате "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (например, "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Строку, содержащую последовательность операций меню в формате "operation1,operation2,operation3", где операциями могут быть "check", "add", "update", "report" или "exit" (например, "check,add,update,report,exit")
  • Строку, содержащую параметры операций в формате "param1|param2|param3", где каждый параметр соответствует операции на той же позиции (например, "Mouse|Monitor:299.99:10|Laptop:5|full,10")

Ваша задача:

  1. Использовать ту же структуру Product из предыдущих уроков с полями Price (float64) и Quantity (int)
  2. Разобрать первый входной параметр и инициализировать карту (map) инвентаря существующими данными о продуктах
  3. Вывести сообщение о запуске системы:
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. Разобрать второй входной параметр, чтобы получить последовательность выполняемых операций
  5. Разобрать третий входной параметр, чтобы получить параметры для каждой операции
  6. Для каждой операции в последовательности вывести заголовок операции и выполнить соответствующее действие:
    • Для "check": Вывести "--- STOCK CHECK ---" и проверить наличие указанного продукта
    • Для "add": Вывести "--- ADD ITEM ---" и добавить указанный продукт
    • Для "update": Вывести "--- UPDATE STOCK ---" и обновить количество указанного продукта
    • Для "report": Вывести "--- GENERATE REPORT ---" и создать указанный отчет
    • Для "exit": Вывести "--- SYSTEM EXIT ---" и показать информацию о выходе
  7. Реализовать функцию checkStock, которая возвращает количество и ошибку, как в предыдущих уроках
  8. Реализовать функцию addNewItem, которая добавляет продукты и возвращает ошибку, как в предыдущих уроках
  9. Реализовать функцию updateStock, которая обновляет количество и возвращает ошибку, как в предыдущих уроках
  10. Реализовать функцию generateReport, которая создает отчеты, как в предыдущих уроках
  11. Для операции "check":
    • Использовать параметр как название продукта для проверки
    • Вывести: "Checking stock for: [product_name]"
    • Если найден: "Stock level: [quantity] units"
    • Если не найден: "Product not found in inventory"
  12. Для операции "add":
    • Разобрать параметр в формате "product_name:price:quantity"
    • Вывести: "Adding new product: [product_name]"
    • В случае успеха: "Product added successfully"
    • В случае ошибки: "Failed to add product: [error_message]"
  13. Для операции "update":
    • Разобрать параметр в формате "product_name:change"
    • Вывести: "Updating stock for: [product_name]"
    • Если успешно и изменение положительное: "Added [change] units. New stock: [new_quantity]"
    • Если успешно и изменение отрицательное: "Removed [absolute_change] units. New stock: [new_quantity]"
    • В случае ошибки: "Update failed: [error_message]"
  14. Для операции "report":
    • Разобрать параметр в формате "report_type,threshold"
    • Вывести: "Generating [report_type] report with threshold [threshold]"
    • Сгенерировать и вывести полный отчет, как в предыдущих уроках
  15. Для операции "exit":
    • Вывести итоговую статистику инвентаря:
      • "Final inventory status:"
      • "Total products: [total_products]"
      • "Total items: [total_items]"
      • "Total value: $[total_value]"
    • Вывести: "Session completed successfully"
    • Вывести: "Thank you for using the Inventory Management System"
  16. После каждой операции (кроме exit) выводить: "Operation completed. Continuing to next operation..."

Используйте пакет strings для разделения входных строк, пакет strconv для преобразования строк в числа, пакет errors для обработки ошибок, пакет fmt для форматированного вывода и пакет sort для сортировки по алфавиту. Форматируйте все цены и значения до 2 знаков после запятой. Эта задача демонстрирует, как создать полноценную интерактивную систему, объединяющую несколько функциональных компонентов в единый пользовательский интерфейс с правильной обработкой ошибок и управлением состоянием.

Попробуйте сами

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

func removeTask(tasks []Task, index int) []Task {
	return append(tasks[:index], tasks[index+1:]...)
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskData := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskData, ",")
	var tasks []Task
	
	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks = append(tasks, Task{Name: name, Completed: status})
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Store the name of the task to be removed
	removedTaskName := tasks[index].Name
	
	// Remove the task
	tasks = removeTask(tasks, index)
	
	// Display remaining tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
			completedCount++
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' removed successfully!\n", removedTaskName)
	
	// Print summary
	totalCount := len(tasks)
	incompleteCount := totalCount - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", totalCount, completedCount, incompleteCount)
}

Все уроки раздела Логика и управление потоком