Menu
Coddy logo textTech

Проверка остатков

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

challenge icon

Задание

Легко

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

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

  • Строку, содержащую данные о существующем инвентаре в формате "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (например, "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Строку, содержащую запросы на проверку запасов в формате "product1,product2,product3" (например, "Mouse,Tablet,Keyboard")

Ваша задача:

  1. Использовать ту же структуру Product из предыдущего урока с полями Price (float64) и Quantity (int)
  2. Разобрать первый входной параметр, разделив его по запятым, чтобы получить записи об отдельных продуктах
  3. Для каждой записи о продукте разделить ее по двоеточиям, чтобы получить название продукта, цену и количество
  4. Преобразовать строку цены в float64, а строку количества в int
  5. Создать и заполнить карту (map) inventory полученными данными о продуктах
  6. Создать функцию с именем checkStock, которая принимает карту inventory и название продукта в качестве параметров и возвращает (int, error):
    • Если продукт существует в инвентаре, вернуть его количество и nil
    • Если продукт не существует, вернуть 0 и ошибку с сообщением "product not found: [product_name]"
  7. Разобрать второй входной параметр, разделив его по запятым, чтобы получить список продуктов для проверки
  8. Вывести заголовок проверки запасов: "Stock Check Results:"
  9. Для каждого продукта из списка проверки вызвать функцию checkStock и вывести результаты:
    • Если ошибки нет: "[product_name]: [quantity] units in stock"
    • Если есть ошибка: "[product_name]: Error - [error_message]"
  10. Подсчитать и вывести сводную статистику:
    • "Check Summary:"
    • "Products checked: [total_number_of_products_checked]"
    • "Products found: [number_of_products_that_exist]"
    • "Products not found: [number_of_products_that_dont_exist]"
  11. Вывести общий запас для найденных продуктов:
    • "Total stock for found products: [sum_of_quantities_for_existing_products] units"
  12. Перечислить все недостающие продукты:
    • Если есть недостающие продукты: "Missing products: [comma_separated_list_of_missing_products]"
    • Если недостающих продуктов нет: "All requested products are available"

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

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

package main

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

// Define the Product struct
type Product struct {
	Price    float64
	Quantity int
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	storeInfo := scanner.Text()
	
	scanner.Scan()
	productData := scanner.Text()
	
	// 1. Parse store information (split by comma)
	storeInfoParts := strings.Split(storeInfo, ",")
	storeName := ""
	location := ""
	if len(storeInfoParts) >= 2 {
		storeName = storeInfoParts[0]
		location = storeInfoParts[1]
	}
	
	// 2. Parse product data (split by comma, then by colon for each product)
	productEntries := strings.Split(productData, ",")
	
	// 3. Create inventory map
	inventory := make(map[string]Product)
	
	// 4. Convert strings to appropriate types and populate inventory
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 3 {
			productName := parts[0]
			price, _ := strconv.ParseFloat(parts[1], 64)
			quantity, _ := strconv.Atoi(parts[2])
			
			inventory[productName] = Product{
				Price:    price,
				Quantity: quantity,
			}
		}
	}
	
	// 5. Display store information
	fmt.Printf("=== %s Inventory System ===\n", storeName)
	fmt.Printf("Location: %s\n", location)
	fmt.Printf("Inventory initialized with %d products\n", len(inventory))
	
	// 6. Display current inventory (sorted alphabetically)
	fmt.Println("Current Inventory:")
	var productNames []string
	for name := range inventory {
		productNames = append(productNames, name)
	}
	sort.Strings(productNames)
	
	for _, name := range productNames {
		product := inventory[name]
		fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
	}
	
	// 7. Calculate and display inventory statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	fmt.Println("Inventory Statistics:")
	fmt.Printf("Total Products: %d\n", totalProducts)
	fmt.Printf("Total Items in Stock: %d\n", totalItems)
	fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
	
	// 8. Display system status
	fmt.Println("System Status: Ready")
	fmt.Println("Inventory management system initialized successfully")
}

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