Menu
CoddyTech

Добавление новой позиции

Часть раздела Логика и управление потоком путешествия по 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