Menu
Coddy logo textTech

Alles zusammenfügen

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

challenge icon

Aufgabe

Einfach

Vervollständigen Sie Ihr Bestandsverwaltungssystem, indem Sie ein umfassendes Hauptprogramm erstellen, das alle Funktionen integriert, die Sie in den vorangegangenen Lektionen entwickelt haben. Diese abschließende Herausforderung führt die Bestandsinitialisierung, die Lagerprüfung, das Hinzufügen von Artikeln, Bestandsaktualisierungen und die Berichterstellung in einer vollständigen Befehlszeilenschnittstelle mit menügesteuerter Navigation zusammen.

Sie erhalten drei Eingaben:

  • Einen String, der die initialen Bestandsdaten im Format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" enthält (z. B. "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Einen String, der eine Sequenz von Menüoperationen im Format "operation1,operation2,operation3" enthält, wobei die Operationen "check", "add", "update", "report" oder "exit" sein können (z. B. "check,add,update,report,exit")
  • Einen String, der Operationsparameter im Format "param1|param2|param3" enthält, wobei jeder Parameter der Operation an der gleichen Position entspricht (z. B. "Mouse|Monitor:299.99:10|Laptop:5|full,10")

Ihre Aufgabe ist es:

  1. Verwenden Sie dieselbe Product-Struktur aus den vorherigen Lektionen mit den Feldern Price (float64) und Quantity (int)
  2. Verarbeiten Sie die erste Eingabe und initialisieren Sie die Bestands-Map mit den vorhandenen Produktdaten
  3. Zeigen Sie die Systemstartmeldung an:
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. Verarbeiten Sie die zweite Eingabe, um die Sequenz der auszuführenden Operationen zu erhalten
  5. Verarbeiten Sie die dritte Eingabe, um die Parameter für jede Operation zu erhalten
  6. Zeigen Sie für jede Operation in der Sequenz den Operations-Header an und führen Sie die entsprechende Aktion aus:
    • Für "check": Zeigen Sie "--- STOCK CHECK ---" an und prüfen Sie den Bestand für das angegebene Produkt
    • Für "add": Zeigen Sie "--- ADD ITEM ---" an und fügen Sie das angegebene Produkt hinzu
    • Für "update": Zeigen Sie "--- UPDATE STOCK ---" an und aktualisieren Sie den Bestand für das angegebene Produkt
    • Für "report": Zeigen Sie "--- GENERATE REPORT ---" an und erstellen Sie den angegebenen Bericht
    • Für "exit": Zeigen Sie "--- SYSTEM EXIT ---" an und geben Sie die Beendigungsinformationen aus
  7. Implementieren Sie die Funktion checkStock, die Menge und Fehler wie in den vorherigen Lektionen zurückgibt
  8. Implementieren Sie die Funktion addNewItem, die Produkte hinzufügt und einen Fehler wie in den vorherigen Lektionen zurückgibt
  9. Implementieren Sie die Funktion updateStock, die Mengen aktualisiert und einen Fehler wie in den vorherigen Lektionen zurückgibt
  10. Implementieren Sie die Funktion generateReport, die Berichte wie in den vorherigen Lektionen erstellt
  11. Für die Operation "check":
    • Verwenden Sie den Parameter als den zu prüfenden Produktnamen
    • Anzeige: "Checking stock for: [product_name]"
    • Falls gefunden: "Stock level: [quantity] units"
    • Falls nicht gefunden: "Product not found in inventory"
  12. Für die Operation "add":
    • Verarbeiten Sie den Parameter im Format "product_name:price:quantity"
    • Anzeige: "Adding new product: [product_name]"
    • Bei Erfolg: "Product added successfully"
    • Bei Fehler: "Failed to add product: [error_message]"
  13. Für die Operation "update":
    • Verarbeiten Sie den Parameter im Format "product_name:change"
    • Anzeige: "Updating stock for: [product_name]"
    • Bei Erfolg und positivem Change: "Added [change] units. New stock: [new_quantity]"
    • Bei Erfolg und negativem Change: "Removed [absolute_change] units. New stock: [new_quantity]"
    • Bei Fehler: "Update failed: [error_message]"
  14. Für die Operation "report":
    • Verarbeiten Sie den Parameter im Format "report_type,threshold"
    • Anzeige: "Generating [report_type] report with threshold [threshold]"
    • Erstellen und zeigen Sie den vollständigen Bericht wie in den vorherigen Lektionen an
  15. Für die Operation "exit":
    • Zeigen Sie die finalen Bestandsstatistiken an:
      • "Final inventory status:"
      • "Total products: [total_products]"
      • "Total items: [total_items]"
      • "Total value: $[total_value]"
    • Anzeige: "Session completed successfully"
    • Anzeige: "Thank you for using the Inventory Management System"
  16. Zeigen Sie nach jeder Operation (außer Exit) an: "Operation completed. Continuing to next operation..."

Verwenden Sie das Paket strings zum Aufteilen von Eingabestrings, das Paket strconv zum Konvertieren von Strings in Zahlen, das Paket errors für die Fehlerbehandlung, das Paket fmt für formatierte Ausgaben und das Paket sort für die alphabetische Sortierung. Formatieren Sie alle Preise und Werte auf 2 Dezimalstellen. Diese Herausforderung zeigt, wie man ein komplettes interaktives System erstellt, das mehrere funktionale Komponenten zu einer kohärenten Benutzererfahrung mit ordnungsgemäßer 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