Alles zusammenfügen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 50 von 68.
Aufgabe
EinfachVervollstä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:
- Dieselbe
Product-Struktur wie in den vorherigen Lektionen mit den FeldernPrice(float64) undQuantity(int) zu verwenden - Die erste Eingabe zu analysieren und die Bestands-Map mit den vorhandenen Produktdaten zu initialisieren
- Die Systemstartmeldung anzuzeigen:
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- Die zweite Eingabe zu analysieren, um die auszuführende Abfolge von Aktionen zu erhalten
- Die dritte Eingabe zu analysieren, um die Parameter für jede Aktion zu erhalten
- 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
- Für
- Die Funktion
checkStockimplementieren, die wie in den vorherigen Lektionen die Menge und einen Fehler zurückgibt - Die Funktion
addNewItemimplementieren, die Produkte hinzufügt und wie in den vorherigen Lektionen einen Fehler zurückgibt - Die Funktion
updateStockimplementieren, die Mengen aktualisiert und wie in den vorherigen Lektionen einen Fehler zurückgibt - Die Funktion
generateReportimplementieren, die den unten für die Aktion"report"beschriebenen Bericht ausgibt - 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"
- 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
- Den Parameter im Format
- 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
- Den Parameter im Format
- 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
- Für
- Den Parameter im Format
- 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"
- Die abschließende Bestandsstatistik anzeigen:
- 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
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und VerhaltenÜbe selbstständig: Online-Go-Compiler