Menu
Coddy logo textTech

Lagerbestand prüfen

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 46 von 68.

challenge icon

Aufgabe

Einfach

Implementiere eine Funktion zur Bestandsprüfung für dein Bestandsverwaltungssystem, die Produktmengen sicher abruft und Fälle behandelt, in denen Produkte nicht existieren. Diese Herausforderung baut auf der Bestandsgrundlage aus der vorherigen Lektion auf und fügt eine Fehlerbehandlung für Bestandsabfragen hinzu.

Du erhältst zwei Eingaben:

  • Eine Zeichenkette mit vorhandenen Bestandsdaten im Format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (z. B. "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Eine Zeichenkette mit Bestandsprüfanfragen im Format "product1,product2,product3" (z. B. "Mouse,Tablet,Keyboard")

Deine Aufgabe ist es:

  1. Dieselbe Struktur Product wie in der vorherigen Lektion mit den Feldern Price (float64) und Quantity (int) zu verwenden
  2. Die erste Eingabe durch Aufteilen an Kommas zu analysieren, um einzelne Produkteinträge zu erhalten
  3. Jeden Produkteintrag an Doppelpunkten aufzuteilen, um Produktname, Preis und Menge zu erhalten
  4. Die Preiszeichenkette in float64 und die Mengenzeichenkette in int umzuwandeln
  5. Die Map inventory mit den analysierten Produktdaten zu erstellen und zu füllen
  6. Eine Funktion namens checkStock zu erstellen, die die Bestands-Map und einen Produktnamen als Parameter übernimmt und (int, error) zurückgibt:
    • Wenn das Produkt im Bestand vorhanden ist, seine Menge und nil zurückzugeben
    • Wenn das Produkt nicht vorhanden ist, 0 und einen Fehler mit der Nachricht "product not found: [product_name]" zurückzugeben
  7. Die zweite Eingabe durch Aufteilen an Kommas zu analysieren, um die Liste der zu prüfenden Produkte zu erhalten
  8. Die Überschrift für die Bestandsprüfung anzuzeigen: "Stock Check Results:"
  9. Für jedes Produkt in der Prüfliste die Funktion checkStock aufzurufen und die Ergebnisse anzuzeigen:
    • Wenn kein Fehler auftritt: "[product_name]: [quantity] units in stock"
    • Bei einem Fehler: "[product_name]: Error - [error_message]"
  10. Zusammenfassungsstatistiken zu zählen und anzuzeigen:
    • "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. Den Gesamtbestand der gefundenen Produkte anzuzeigen:
    • "Total stock for found products: [sum_of_quantities_for_existing_products] units"
  12. Fehlende Produkte aufzulisten:
    • Wenn fehlende Produkte vorhanden sind: "Missing products: [comma_separated_list_of_missing_products]"
    • Wenn keine Produkte fehlen: "All requested products are available"

Verwende das Paket strings, um die Eingabezeichenketten aufzuteilen, das Paket strconv, um Zeichenketten in Zahlen umzuwandeln, das Paket errors, um Fehlermeldungen zu erstellen, und das Paket fmt für die formatierte Ausgabe. Diese Herausforderung zeigt, wie ein sicherer Datenabruf mit einer geeigneten Fehlerbehandlung implementiert wird – ein grundlegendes Muster in Bestandsverwaltungssystemen.

Probier es selbst

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

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-Go-Compiler