Menu
Coddy logo textTech

Добавление нового товара

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 47 из 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:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (например, "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Ваша задача:

  1. Использовать ту же структуру Product из предыдущих уроков с полями Price (float64) и Quantity (int)
  2. Разобрать первый ввод, разделив его по запятым, чтобы получить отдельные записи о существующих продуктах
  3. Для каждой записи о существующем продукте разделить ее по двоеточиям, чтобы получить название продукта, цену и количество
  4. Преобразовать строку цены в float64, а строку количества в int
  5. Создать и заполнить карту inventory данными о существующих продуктах
  6. Создать функцию с названием addNewItem, которая принимает карту инвентаря, название продукта, цену и количество в качестве параметров и возвращает ошибку:
    • Если продукт уже существует в инвентаре, вернуть ошибку с сообщением "product already exists: [product_name]"
    • Если продукт не существует, добавить его в инвентарь и вернуть nil
  7. Разобрать второй ввод, разделив его по запятым, чтобы получить список новых продуктов для добавления
  8. Для каждой записи о новом продукте разделить ее по двоеточиям, чтобы получить название продукта, цену и количество
  9. Преобразовать строку цены в float64, а строку количества в int
  10. Вывести заголовок процесса добавления: "Adding New Items:"
  11. Для каждого нового продукта вызвать функцию addNewItem и вывести результаты:
    • Если нет ошибки: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Если есть ошибка: "[product_name]: Failed to add - [error_message]"
  12. Подсчитать и вывести статистику добавления:
    • "Addition Summary:"
    • "Items processed: [total_number_of_items_processed]"
    • "Items added: [number_of_items_successfully_added]"
    • "Items rejected: [number_of_items_that_failed_to_add]"
  13. Вывести обновленный инвентарь в алфавитном порядке по названию продукта:
    • "Updated Inventory:"
    • Для каждого продукта: "- [product_name]: $[price] (Stock: [quantity])"
  14. Рассчитать и вывести итоговую статистику инвентаря:
    • "Final Inventory Statistics:"
    • "Total Products: [total_number_of_products_in_inventory]"
    • "Total Items in Stock: [sum_of_all_quantities]"
    • "Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
  15. Вывести список всех отклоненных продуктов:
    • Если есть отклоненные продукты: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Если отклоненных продуктов нет: "All new products were added successfully"

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

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

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

type Product struct {
	Price    float64
	Quantity int
}

func checkStock(inventory map[string]Product, productName string) (int, error) {
	product, exists := inventory[productName]
	if !exists {
		return 0, errors.New("product not found: " + productName)
	}
	return product.Quantity, nil
}

func main() {
	var inventoryData string
	var checkRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&checkRequests)

	inventory := make(map[string]Product)

	// Parse inventory data
	productEntries := strings.Split(inventoryData, ",")
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		inventory[name] = Product{Price: price, Quantity: quantity}
	}

	// Parse check requests
	productsToCheck := strings.Split(checkRequests, ",")

	fmt.Println("Stock Check Results:")

	var productsFound int
	var productsNotFound int
	var totalStock int
	var missingProducts []string

	for _, productName := range productsToCheck {
		quantity, err := checkStock(inventory, productName)
		if err != nil {
			fmt.Printf("%s: Error - %s\n", productName, err.Error())
			productsNotFound++
			missingProducts = append(missingProducts, productName)
		} else {
			fmt.Printf("%s: %d units in stock\n", productName, quantity)
			productsFound++
			totalStock += quantity
		}
	}

	fmt.Println("Check Summary:")
	fmt.Printf("Products checked: %d\n", len(productsToCheck))
	fmt.Printf("Products found: %d\n", productsFound)
	fmt.Printf("Products not found: %d\n", productsNotFound)
	fmt.Printf("Total stock for found products: %d units\n", totalStock)

	if len(missingProducts) > 0 {
		fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
	} else {
		fmt.Println("All requested products are available")
	}
}

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