Sprawdzanie stanu magazynowego
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 46 z 68.
Wyzwanie
ŁatwyZaimplementuj funkcję sprawdzającą stan magazynowy w systemie zarządzania zapasami, która bezpiecznie pobiera ilości produktów i obsługuje przypadki, w których produkt nie istnieje. To wyzwanie rozwija podstawy zarządzania zapasami z poprzedniej lekcji i dodaje obsługę błędów podczas sprawdzania stanów magazynowych.
Otrzymasz dwa wejścia:
- Ciąg 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 zawierający żądania sprawdzenia stanu magazynowego w formacie
"product1,product2,product3"(np."Mouse,Tablet,Keyboard")
Twoim zadaniem jest:
- Użyć tej samej struktury
Productz poprzedniej lekcji, zawierającej polaPrice(float64) iQuantity(int) - Przeanalizować pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne wpisy produktów
- Dla każdego wpisu produktu podzielić go po dwukropkach, aby uzyskać nazwę produktu, cenę i ilość
- Przekonwertować ciąg z ceną na float64, a ciąg z ilością na int
- Utworzyć i wypełnić mapę
inventoryprzeanalizowanymi danymi produktów - Utworzyć funkcję o nazwie
checkStock, która przyjmuje mapę zapasów i nazwę produktu jako parametry oraz zwraca (int, error):- Jeśli produkt istnieje w zapasach, zwrócić jego ilość i nil
- Jeśli produkt nie istnieje, zwrócić 0 i błąd z komunikatem
"product not found: [product_name]"
- Przeanalizować drugie wejście, dzieląc je po przecinkach, aby uzyskać listę produktów do sprawdzenia
- Wyświetlić nagłówek sprawdzania stanu magazynowego:
"Stock Check Results:" - Dla każdego produktu z listy sprawdzanych produktów wywołać funkcję
checkStocki wyświetlić wyniki:- Jeśli nie wystąpi błąd:
"[product_name]: [quantity] units in stock" - Jeśli wystąpi błąd:
"[product_name]: Error - [error_message]"
- Jeśli nie wystąpi błąd:
- Zliczyć i wyświetlić statystyki podsumowujące:
"Check Summary:""Products checked: [total_number_of_products_checked]""Products found: [number_of_products_that_exist]""Products not found: [number_of_products_that_dont_exist]"
- Wyświetlić łączny stan magazynowy znalezionych produktów:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- Wypisać brakujące produkty:
- Jeśli brakuje produktów:
"Missing products: [comma_separated_list_of_missing_products]" - Jeśli nie brakuje żadnych produktów:
"All requested products are available"
- Jeśli brakuje produktów:
Użyj pakietu strings, aby dzielić ciągi wejściowe, pakietu strconv, aby konwertować ciągi na liczby, pakietu errors, aby tworzyć komunikaty o błędach, oraz pakietu fmt do formatowania danych wyjściowych. To wyzwanie pokazuje, jak zaimplementować bezpieczne pobieranie danych z prawidłową obsługą błędów — podstawowy wzorzec w systemach zarządzania zapasami.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
// Define the Product struct
type Product struct {
Price float64
Quantity int
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
storeInfo := scanner.Text()
scanner.Scan()
productData := scanner.Text()
// 1. Parse store information (split by comma)
storeInfoParts := strings.Split(storeInfo, ",")
storeName := ""
location := ""
if len(storeInfoParts) >= 2 {
storeName = storeInfoParts[0]
location = storeInfoParts[1]
}
// 2. Parse product data (split by comma, then by colon for each product)
productEntries := strings.Split(productData, ",")
// 3. Create inventory map
inventory := make(map[string]Product)
// 4. Convert strings to appropriate types and populate inventory
for _, entry := range productEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 3 {
productName := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[productName] = Product{
Price: price,
Quantity: quantity,
}
}
}
// 5. Display store information
fmt.Printf("=== %s Inventory System ===\n", storeName)
fmt.Printf("Location: %s\n", location)
fmt.Printf("Inventory initialized with %d products\n", len(inventory))
// 6. Display current inventory (sorted alphabetically)
fmt.Println("Current Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
}
// 7. Calculate and display inventory statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
fmt.Println("Inventory Statistics:")
fmt.Printf("Total Products: %d\n", totalProducts)
fmt.Printf("Total Items in Stock: %d\n", totalItems)
fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
// 8. Display system status
fmt.Println("System Status: Ready")
fmt.Println("Inventory management system initialized successfully")
}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