Menu
Coddy logo textTech

Einen Bericht erstellen

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

challenge icon

Aufgabe

Einfach

Vervollständigen Sie Ihr Bestandsverwaltungssystem, indem Sie eine umfassende Berichtsfunktion implementieren, die detaillierte Einblicke in Ihren aktuellen Bestand bietet. Diese Herausforderung baut auf allen vorherigen Funktionen auf und fügt die Möglichkeit hinzu, formatierte Berichte mit Statistiken, Kategorisierung und Analysen zu erstellen.

Sie erhalten zwei Eingaben:

  • Einen String, der bestehende 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 die Berichtskonfiguration im Format "report_type,threshold_value" enthält, wobei report_type "full", "low_stock" oder "high_value" sein kann und threshold_value eine Zahl ist (z. B. "low_stock,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, indem Sie sie an Kommas aufteilen, um die einzelnen vorhandenen Produkteinträge zu erhalten
  3. Teilen Sie jeden vorhandenen Produkteintrag an Doppelpunkten auf, um Produktname, Preis und Menge zu erhalten
  4. Konvertieren Sie den Preis-String in float64 und den Mengen-String in int
  5. Erstellen und befüllen Sie die inventory-Map mit den vorhandenen Produktdaten
  6. Erstellen Sie eine Funktion namens generateReport, die die inventory-Map, den Berichtstyp und den Schwellenwert als Parameter entgegennimmt
  7. Verarbeiten Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um Berichtstyp und Schwellenwert zu erhalten
  8. Konvertieren Sie den Schwellenwert-String in float64
  9. Zeigen Sie den Berichtskopf basierend auf dem Berichtstyp an:
    • Für "full": "=== FULL INVENTORY REPORT ==="
    • Für "low_stock": "=== LOW STOCK REPORT ==="
    • Für "high_value": "=== HIGH VALUE REPORT ==="
  10. Zeigen Sie allgemeine Bestandsstatistiken an:
    • "Total Products: [total_number_of_products]"
    • "Total Items in Stock: [sum_of_all_quantities]"
    • "Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
    • "Average Product Price: $[total_inventory_value_divided_by_total_items]"
  11. Filtern und zeigen Sie Produkte basierend auf dem Berichtstyp an:
    • Für "full": Alle Produkte anzeigen
    • Für "low_stock": Nur Produkte anzeigen, deren Menge kleiner oder gleich dem Schwellenwert ist
    • Für "high_value": Nur Produkte anzeigen, deren Gesamtwert (Preis × Menge) größer oder gleich dem Schwellenwert ist
  12. Zeigen Sie den Abschnitt für gefilterte Produkte an:
    • Für "full": "All Products:"
    • Für "low_stock": "Products with stock ≤ [threshold_value]:"
    • Für "high_value": "Products with value ≥ $[threshold_value]:"
  13. Für jedes gefilterte Produkt (in alphabetischer Reihenfolge nach Produktname):
    • "- [product_name]: $[price] × [quantity] = $[total_value]"
  14. Zeigen Sie gefilterte Statistiken an:
    • "Filtered Results:"
    • "Products shown: [number_of_products_in_filtered_results]"
    • "Items in filtered products: [sum_of_quantities_for_filtered_products]"
    • "Value of filtered products: $[sum_of_values_for_filtered_products]"
  15. Finden und zeigen Sie die teuersten und günstigsten Produkte an:
    • "Price Analysis:"
    • "Most expensive: [product_name] at $[price]"
    • "Least expensive: [product_name] at $[price]"
  16. Finden und zeigen Sie die Produkte mit dem höchsten und niedrigsten Lagerbestand an:
    • "Stock Analysis:"
    • "Highest stock: [product_name] with [quantity] units"
    • "Lowest stock: [product_name] with [quantity] units"
  17. Zeigen Sie eine Bewertung des Bestandszustands an:
    • Zählen Sie Produkte mit Menge ≤ 5: "Low stock items (≤5): [count]"
    • Zählen Sie Produkte mit Menge > 20: "High stock items (>20): [count]"
    • Zählen Sie Produkte mit Wert ≥ $500: "High value items (≥$500): [count]"
  18. Zeigen Sie den Abschluss des Berichts an:
    • "Report generated successfully"
    • "Threshold applied: [threshold_value]"

Verwenden Sie das strings-Paket, um die Eingabestrings aufzuteilen, das strconv-Paket, um Strings in Zahlen umzuwandeln, das fmt-Paket für die formatierte Ausgabe und das sort-Paket, um Produktnamen alphabetisch zu sortieren. Formatieren Sie alle Preise und Werte auf 2 Dezimalstellen. Wenn Sie die teuersten/günstigsten Produkte oder den höchsten/niedrigsten Lagerbestand ermitteln und Gleichstand herrscht, verwenden Sie den alphabetisch ersten Produktnamen. Diese Herausforderung zeigt, wie man umfassende Berichtssysteme erstellt, die durch Datenanalyse und formatierte Präsentation wertvolle Geschäftseinblicke liefern.

Probier es selbst

package main

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

type Product struct {
	Price    float64
	Quantity int
}

func updateStock(inventory map[string]Product, productName string, change int) error {
	product, exists := inventory[productName]
	if !exists {
		return errors.New("product not found: " + productName)
	}
	
	newQuantity := product.Quantity + change
	if newQuantity < 0 {
		return fmt.Errorf("insufficient stock: cannot reduce %s by %d, only %d available", productName, -change, product.Quantity)
	}
	
	product.Quantity = newQuantity
	inventory[productName] = product
	return nil
}

func main() {
	var inventoryData string
	var updateRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&updateRequests)
	
	// Parse existing inventory
	inventory := make(map[string]Product)
	inventoryEntries := strings.Split(inventoryData, ",")
	
	for _, entry := range inventoryEntries {
		parts := strings.Split(entry, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		
		inventory[name] = Product{
			Price:    price,
			Quantity: quantity,
		}
	}
	
	// Parse update requests
	updateEntries := strings.Split(updateRequests, ",")
	
	fmt.Println("Processing Stock Updates:")
	
	totalUpdates := len(updateEntries)
	successfulUpdates := 0
	failedUpdates := 0
	var failedProducts []string
	
	for _, update := range updateEntries {
		parts := strings.Split(update, ":")
		productName := parts[0]
		change, _ := strconv.Atoi(parts[1])
		
		err := updateStock(inventory, productName, change)
		if err != nil {
			fmt.Printf("%s: Update failed - %s\n", productName, err.Error())
			failedUpdates++
			failedProducts = append(failedProducts, productName)
		} else {
			newQuantity := inventory[productName].Quantity
			if change > 0 {
				fmt.Printf("%s: Added %d units - New stock: %d\n", productName, change, newQuantity)
			} else if change < 0 {
				fmt.Printf("%s: Removed %d units - New stock: %d\n", productName, -change, newQuantity)
			} else {
				fmt.Printf("%s: No change - Current stock: %d\n", productName, newQuantity)
			}
			successfulUpdates++
		}
	}
	
	// Update summary
	fmt.Println("Update Summary:")
	fmt.Printf("Updates processed: %d\n", totalUpdates)
	fmt.Printf("Updates successful: %d\n", successfulUpdates)
	fmt.Printf("Updates failed: %d\n", failedUpdates)
	
	// Display updated inventory in alphabetical order
	fmt.Println("Updated 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)
	}
	
	// Calculate final statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	fmt.Println("Final 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)
	
	// List failed updates
	if len(failedProducts) > 0 {
		fmt.Printf("Failed updates: %s\n", strings.Join(failedProducts, ","))
	} else {
		fmt.Println("All stock updates were processed successfully")
	}
}

Alle Lektionen in Logik & Ablauf