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

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

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