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)
}

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go