Menu
CoddyTech

Alles zusammenfügen

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

challenge icon

Aufgabe

Einfach

Vervollständige dein Bestandsverwaltungssystem, indem du ein umfassendes Hauptprogramm erstellst, das alle Funktionen integriert, die du in den vorherigen Lektionen entwickelt hast. Diese abschließende Herausforderung führt die Initialisierung des Bestands, die Bestandsprüfung, das Hinzufügen von Artikeln, Bestandsaktualisierungen und die Berichtserstellung zu einer vollständigen Befehlszeilenschnittstelle mit menügesteuerter Navigation zusammen.

Du erhältst drei Eingaben:

  • Eine Zeichenfolge mit den anfänglichen 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 Zeichenfolge mit einer Abfolge von Menüaktionen im Format "operation1,operation2,operation3", wobei die Aktionen "check", "add", "update", "report" oder "exit" sein können (z. B. "check,add,update,report,exit")
  • Eine Zeichenfolge mit Aktionsparametern im Format "param1|param2|param3", wobei jeder Parameter der Aktion an derselben Position entspricht (z. B. "Mouse|Monitor:299.99:10|Laptop:5|full,10")

Deine Aufgabe ist es:

  1. Dieselbe Product-Struktur wie in den vorherigen Lektionen mit den Feldern Price (float64) und Quantity (int) zu verwenden
  2. Die erste Eingabe zu analysieren und die Bestands-Map mit den vorhandenen Produktdaten zu initialisieren
  3. Die Systemstartmeldung anzuzeigen:
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. Die zweite Eingabe zu analysieren, um die auszuführende Abfolge von Aktionen zu erhalten
  5. Die dritte Eingabe zu analysieren, um die Parameter für jede Aktion zu erhalten
  6. Für jede Aktion in der Abfolge die Aktionsüberschrift anzuzeigen und die entsprechende Aktion auszuführen:
    • Für "check": "--- STOCK CHECK ---" anzeigen und den Bestand des angegebenen Produkts prüfen
    • Für "add": "--- ADD ITEM ---" anzeigen und das angegebene Produkt hinzufügen
    • Für "update": "--- UPDATE STOCK ---" anzeigen und den Bestand des angegebenen Produkts aktualisieren
    • Für "report": "--- GENERATE REPORT ---" anzeigen und den angegebenen Bericht erstellen
    • Für "exit": "--- SYSTEM EXIT ---" anzeigen und die Informationen zum Beenden ausgeben
  7. Die Funktion checkStock implementieren, die wie in den vorherigen Lektionen die Menge und einen Fehler zurückgibt
  8. Die Funktion addNewItem implementieren, die Produkte hinzufügt und wie in den vorherigen Lektionen einen Fehler zurückgibt
  9. Die Funktion updateStock implementieren, die Mengen aktualisiert und wie in den vorherigen Lektionen einen Fehler zurückgibt
  10. Die Funktion generateReport implementieren, die den unten für die Aktion "report" beschriebenen Bericht ausgibt
  11. Für die Aktion "check":
    • Den Parameter als zu prüfenden Produktnamen verwenden
    • Anzeigen: "Checking stock for: [product_name]"
    • Wenn das Produkt gefunden wird: "Stock level: [quantity] units"
    • Wenn das Produkt nicht gefunden wird: "Product not found in inventory"
  12. Für die Aktion "add":
    • Den Parameter im Format "product_name:price:quantity" analysieren
    • Anzeigen: "Adding new product: [product_name]"
    • Bei Erfolg: "Product added successfully"
    • Bei einem Fehler: "Failed to add product: [error_message]", wobei der Fehler "product already exists" lautet
  13. Für die Aktion "update":
    • Den Parameter im Format "product_name:change" analysieren
    • Anzeigen: "Updating stock for: [product_name]"
    • Bei Erfolg und wenn die Änderung null oder positiv ist: "Added [change] units. New stock: [new_quantity]"
    • Bei Erfolg und wenn die Änderung negativ ist: "Removed [absolute_change] units. New stock: [new_quantity]"
    • Bei einem Fehler: "Update failed: [error_message]", wobei der Fehler "product not found" lautet oder "insufficient stock", wenn die neue Menge kleiner als 0 wäre
  14. Für die Aktion "report":
    • Den Parameter im Format "report_type,threshold" analysieren, wobei report_type "low" oder "full" und threshold eine Ganzzahl ist
    • Anzeigen: "Generating [report_type] report with threshold [threshold]"
    • Anschließend den Bericht ausgeben, wobei die Produkte alphabetisch sortiert sind:
      • Für "low": "=== LOW REPORT ===", dann "Products with stock below [threshold]:", dann für jedes Produkt, dessen Menge unter dem Schwellenwert liegt: "- [name]: [quantity] units (Price: $[price])"
      • Für "full": "=== FULL REPORT ===", dann "Complete inventory (minimum threshold: [threshold]):", dann für jedes Produkt "- [name]: [quantity] units @ $[price] each [OK]", wobei [LOW STOCK] anstelle von [OK] ausgegeben wird, wenn die Menge unter dem Schwellenwert liegt
  15. Für die Aktion "exit":
    • Die abschließende Bestandsstatistik anzeigen:
      • "Final inventory status:"
      • "Total products: [total_products]"
      • "Total items: [total_items]"
      • "Total value: $[total_value]"
    • Anzeigen: "Session completed successfully"
    • Anzeigen: "Thank you for using the Inventory Management System"
  16. Nach jeder Aktion (außer exit) anzeigen: "Operation completed. Continuing to next operation..."

Verwende das Paket strings, um Eingabezeichenfolgen aufzuteilen, das Paket strconv, um Zeichenfolgen in Zahlen umzuwandeln, das Paket errors zur Fehlerbehandlung, das Paket fmt für formatierte Ausgaben und das Paket sort für die alphabetische Sortierung. Formatiere alle Preise und Werte mit 2 Nachkommastellen. Diese Herausforderung zeigt, wie du ein vollständiges interaktives System erstellen kannst, das mehrere funktionale Komponenten zu einer zusammenhängenden Benutzererfahrung mit angemessener Fehlerbehandlung und Zustandsverwaltung integriert.

Probier es selbst

package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

type Product struct {
	Price    float64
	Quantity int
}

func generateReport(inventory map[string]Product, reportType string, threshold float64) {
	// Display report header
	switch reportType {
	case "full":
		fmt.Println("=== FULL INVENTORY REPORT ===")
	case "low_stock":
		fmt.Println("=== LOW STOCK REPORT ===")
	case "high_value":
		fmt.Println("=== HIGH VALUE REPORT ===")
	}

	// Calculate general statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	averagePrice := totalValue / float64(totalItems)

	// Display general 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)
	fmt.Printf("Average Product Price: $%.2f\n", averagePrice)

	// Filter products based on report type
	var filteredProducts []string
	for name, product := range inventory {
		switch reportType {
		case "full":
			filteredProducts = append(filteredProducts, name)
		case "low_stock":
			if product.Quantity <= int(threshold) {
				filteredProducts = append(filteredProducts, name)
			}
		case "high_value":
			productValue := product.Price * float64(product.Quantity)
			if productValue >= threshold {
				filteredProducts = append(filteredProducts, name)
			}
		}
	}

	// Sort filtered products alphabetically
	sort.Strings(filteredProducts)

	// Display filtered products section header
	switch reportType {
	case "full":
		fmt.Println("All Products:")
	case "low_stock":
		fmt.Printf("Products with stock ≤ %.0f:\n", threshold)
	case "high_value":
		fmt.Printf("Products with value ≥ $%.2f:\n", threshold)
	}

	// Display filtered products
	filteredItems := 0
	filteredValue := 0.0
	for _, name := range filteredProducts {
		product := inventory[name]
		productValue := product.Price * float64(product.Quantity)
		fmt.Printf("- %s: $%.2f × %d = $%.2f\n", name, product.Price, product.Quantity, productValue)
		filteredItems += product.Quantity
		filteredValue += productValue
	}

	// Display filtered statistics
	fmt.Println("Filtered Results:")
	fmt.Printf("Products shown: %d\n", len(filteredProducts))
	fmt.Printf("Items in filtered products: %d\n", filteredItems)
	fmt.Printf("Value of filtered products: $%.2f\n", filteredValue)

	// Find most and least expensive products
	var mostExpensiveName, leastExpensiveName string
	var mostExpensivePrice, leastExpensivePrice float64
	first := true
	
	var sortedNames []string
	for name := range inventory {
		sortedNames = append(sortedNames, name)
	}
	sort.Strings(sortedNames)
	
	for _, name := range sortedNames {
		product := inventory[name]
		if first {
			mostExpensiveName = name
			mostExpensivePrice = product.Price
			leastExpensiveName = name
			leastExpensivePrice = product.Price
			first = false
		} else {
			if product.Price > mostExpensivePrice {
				mostExpensiveName = name
				mostExpensivePrice = product.Price
			}
			if product.Price < leastExpensivePrice {
				leastExpensiveName = name
				leastExpensivePrice = product.Price
			}
		}
	}

	fmt.Println("Price Analysis:")
	fmt.Printf("Most expensive: %s at $%.2f\n", mostExpensiveName, mostExpensivePrice)
	fmt.Printf("Least expensive: %s at $%.2f\n", leastExpensiveName, leastExpensivePrice)

	// Find highest and lowest stock products
	var highestStockName, lowestStockName string
	var highestStock, lowestStock int
	first = true
	
	for _, name := range sortedNames {
		product := inventory[name]
		if first {
			highestStockName = name
			highestStock = product.Quantity
			lowestStockName = name
			lowestStock = product.Quantity
			first = false
		} else {
			if product.Quantity > highestStock {
				highestStockName = name
				highestStock = product.Quantity
			}
			if product.Quantity < lowestStock {
				lowestStockName = name
				lowestStock = product.Quantity
			}
		}
	}

	fmt.Println("Stock Analysis:")
	fmt.Printf("Highest stock: %s with %d units\n", highestStockName, highestStock)
	fmt.Printf("Lowest stock: %s with %d units\n", lowestStockName, lowestStock)

	// Inventory health assessment
	lowStockCount := 0
	highStockCount := 0
	highValueCount := 0
	
	for _, product := range inventory {
		if product.Quantity <= 5 {
			lowStockCount++
		}
		if product.Quantity > 20 {
			highStockCount++
		}
		productValue := product.Price * float64(product.Quantity)
		if productValue >= 500.0 {
			highValueCount++
		}
	}

	fmt.Printf("Low stock items (≤5): %d\n", lowStockCount)
	fmt.Printf("High stock items (>20): %d\n", highStockCount)
	fmt.Printf("High value items (≥$500): %d\n", highValueCount)

	// Report completion
	fmt.Println("Report generated successfully")
	fmt.Printf("Threshold applied: %.2f\n", threshold)
}

func main() {
	var inventoryData string
	var reportConfig string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&reportConfig)

	// Parse inventory data
	inventory := make(map[string]Product)
	if inventoryData != "" {
		products := strings.Split(inventoryData, ",")
		for _, productStr := range products {
			parts := strings.Split(productStr, ":")
			name := parts[0]
			price, _ := strconv.ParseFloat(parts[1], 64)
			quantity, _ := strconv.Atoi(parts[2])
			inventory[name] = Product{Price: price, Quantity: quantity}
		}
	}

	// Parse report configuration
	configParts := strings.Split(reportConfig, ",")
	reportType := configParts[0]
	threshold, _ := strconv.ParseFloat(configParts[1], 64)

	// Generate report
	generateReport(inventory, reportType, threshold)
}

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-Go-Compiler