Menu
Coddy logo textTech

Dodawanie nowego produktu

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 47 z 68.

challenge icon

Wyzwanie

Łatwy

Rozszerz swój system zarządzania zapasami, implementując funkcjonalność bezpiecznego dodawania nowych produktów. To wyzwanie rozwija poprzedni system sprawdzania stanów magazynowych i dodaje możliwość powiększania zapasów przy jednoczesnym zapobieganiu duplikatom dzięki prawidłowej obsłudze błędów.

Otrzymasz dwa wejścia:

  • Ciąg znaków zawierający dane o istniejących zapasach w formacie "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (np. "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Ciąg znaków zawierający nowe produkty do dodania w formacie "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (np. "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Twoje zadanie:

  1. Użyj tej samej struktury Product co w poprzednich lekcjach, z polami Price (float64) i Quantity (int)
  2. Podziel pierwsze wejście po przecinkach, aby uzyskać poszczególne wpisy dotyczące istniejących produktów
  3. Dla każdego wpisu dotyczącego istniejącego produktu podziel go po dwukropkach, aby uzyskać nazwę produktu, cenę i ilość
  4. Przekonwertuj ciąg znaków z ceną na float64, a ciąg znaków z ilością na int
  5. Utwórz i wypełnij mapę inventory danymi istniejących produktów
  6. Utwórz funkcję o nazwie addNewItem, która przyjmuje jako parametry mapę zapasów, nazwę produktu, cenę i ilość, a zwraca błąd:
    • Jeśli produkt już istnieje w zapasach, zwróć błąd z komunikatem "product already exists: [product_name]"
    • Jeśli produkt nie istnieje, dodaj go do zapasów i zwróć nil
  7. Podziel drugie wejście po przecinkach, aby uzyskać listę nowych produktów do dodania
  8. Dla każdego wpisu dotyczącego nowego produktu podziel go po dwukropkach, aby uzyskać nazwę produktu, cenę i ilość
  9. Przekonwertuj ciąg znaków z ceną na float64, a ciąg znaków z ilością na int
  10. Wyświetl nagłówek procesu dodawania: "Adding New Items:"
  11. Dla każdego nowego produktu wywołaj funkcję addNewItem i wyświetl wyniki:
    • Jeśli nie wystąpi błąd: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Jeśli wystąpi błąd: "[product_name]: Failed to add - [error_message]"
  12. Zlicz i wyświetl statystyki dodawania:
    • "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. Wyświetl zaktualizowane zapasy w kolejności alfabetycznej według nazw produktów:
    • "Updated Inventory:"
    • Dla każdego produktu: "- [product_name]: $[price] (Stock: [quantity])"
  14. Oblicz i wyświetl końcowe statystyki zapasów:
    • "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. Wymień odrzucone produkty:
    • Jeśli są odrzucone produkty: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Jeśli nie ma odrzuconych produktów: "All new products were added successfully"

Użyj pakietu strings do dzielenia ciągów wejściowych, pakietu strconv do konwertowania ciągów na liczby, pakietu errors do tworzenia komunikatów o błędach, pakietu fmt do formatowanego wyjścia oraz pakietu sort do sortowania nazw produktów w kolejności alfabetycznej. Formatuj wszystkie ceny do 2 miejsc po przecinku, a łączną wartość zapasów również do 2 miejsc po przecinku. To wyzwanie pokazuje, jak bezpiecznie rozszerzać kolekcje danych, zapobiegając duplikatom dzięki prawidłowej obsłudze błędów i walidacji.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online