Dodawanie nowego produktu
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 47 z 68.
Wyzwanie
ŁatwyRozszerz 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:
- Użyj tej samej struktury
Productco w poprzednich lekcjach, z polamiPrice(float64) iQuantity(int) - Podziel pierwsze wejście po przecinkach, aby uzyskać poszczególne wpisy dotyczące istniejących produktów
- Dla każdego wpisu dotyczącego istniejącego produktu podziel go po dwukropkach, aby uzyskać nazwę produktu, cenę i ilość
- Przekonwertuj ciąg znaków z ceną na float64, a ciąg znaków z ilością na int
- Utwórz i wypełnij mapę
inventorydanymi istniejących produktów - 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
- Jeśli produkt już istnieje w zapasach, zwróć błąd z komunikatem
- Podziel drugie wejście po przecinkach, aby uzyskać listę nowych produktów do dodania
- Dla każdego wpisu dotyczącego nowego produktu podziel go po dwukropkach, aby uzyskać nazwę produktu, cenę i ilość
- Przekonwertuj ciąg znaków z ceną na float64, a ciąg znaków z ilością na int
- Wyświetl nagłówek procesu dodawania:
"Adding New Items:" - Dla każdego nowego produktu wywołaj funkcję
addNewItemi 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]"
- Jeśli nie wystąpi błąd:
- 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]"
- Wyświetl zaktualizowane zapasy w kolejności alfabetycznej według nazw produktów:
"Updated Inventory:"- Dla każdego produktu:
"- [product_name]: $[price] (Stock: [quantity])"
- 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]"
- 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"
- Jeśli są odrzucone produkty:
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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów8Projekt: Prosty system magazynowy
Przegląd projektuSprawdzanie stanu magazynowego3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online