Menu
Coddy logo textTech

Sprawdzanie stanu magazynowego

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

challenge icon

Wyzwanie

Łatwy

Zaimplementuj 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:

  1. Użyć tej samej struktury Product z poprzedniej lekcji, zawierającej pola Price (float64) i Quantity (int)
  2. Przeanalizować pierwsze wejście, dzieląc je po przecinkach, aby uzyskać poszczególne wpisy produktów
  3. Dla każdego wpisu produktu podzielić go po dwukropkach, aby uzyskać nazwę produktu, cenę i ilość
  4. Przekonwertować ciąg z ceną na float64, a ciąg z ilością na int
  5. Utworzyć i wypełnić mapę inventory przeanalizowanymi danymi produktów
  6. 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]"
  7. Przeanalizować drugie wejście, dzieląc je po przecinkach, aby uzyskać listę produktów do sprawdzenia
  8. Wyświetlić nagłówek sprawdzania stanu magazynowego: "Stock Check Results:"
  9. Dla każdego produktu z listy sprawdzanych produktów wywołać funkcję checkStock i 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]"
  10. 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]"
  11. Wyświetlić łączny stan magazynowy znalezionych produktów:
    • "Total stock for found products: [sum_of_quantities_for_existing_products] units"
  12. 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"

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

Poćwicz samodzielnie: Kompilator Go online