Menu
Coddy logo textTech

Alles zusammenfügen

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 25 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 aufgebaut haben. Diese abschließende Herausforderung führt die Bestandsinitialisierung, Bestandsprü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 mit den initialen 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")
  • Einen String mit einer Sequenz von Menüoperationen im Format "operation1,operation2,operation3", wobei die Operationen "check", "add", "update", "report" oder "exit" sein können (z. B. "check,add,update,report,exit")
  • Einen String mit Operationsparametern im Format "param1|param2|param3", 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. Analysieren 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. Analysieren Sie die zweite Eingabe, um die Sequenz der auszuführenden Operationen zu erhalten
  5. Analysieren 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 Fehler wie in den vorherigen Lektionen zurückgibt
  9. Implementieren Sie die Funktion updateStock, die Mengen aktualisiert und 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":
    • Analysieren 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":
    • Analysieren 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":
    • Analysieren 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 abschließenden 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. Nach jeder Operation (außer exit), Anzeige: "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 (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

func removeTask(tasks []Task, index int) []Task {
	return append(tasks[:index], tasks[index+1:]...)
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskData := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskData, ",")
	var tasks []Task
	
	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks = append(tasks, Task{Name: name, Completed: status})
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Store the name of the task to be removed
	removedTaskName := tasks[index].Name
	
	// Remove the task
	tasks = removeTask(tasks, index)
	
	// Display remaining tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
			completedCount++
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' removed successfully!\n", removedTaskName)
	
	// Print summary
	totalCount := len(tasks)
	incompleteCount := totalCount - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", totalCount, completedCount, incompleteCount)
}

Alle Lektionen in Logik & Ablauf