Menu
Coddy logo textTech

Rückblick – Zeiger verstehen

Teil des Abschnitts Grundlagen der GO-Journey von Coddy. Lektion 66 von 109.

challenge icon

Aufgabe

Mittel

In dieser Herausforderung erstellst du ein einfaches Bestandsverwaltungssystem für ein kleines Geschäft. Du verwendest Zeiger, um Bestandsmengen zu aktualisieren, Werte zu berechnen und Änderungen zu verfolgen.

Vervollständige die drei folgenden Funktionen:

  1. updateQuantity(quantity *int, change int) (int, bool)
    Ändere den Wert bei quantity, indem du change addierst (negativ für Verkäufe, positiv für Nachbestellungen).
    Wenn das Ergebnis kleiner als 0 wäre, setze *quantity stattdessen auf 0.
    Gib die neue Menge und einen booleschen Wert zurück, der true ist, wenn der Artikel jetzt nicht mehr vorrätig ist (*quantity == 0).
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    Berechne totalValue als float64(quantity) * price.
    Wenn totalValue größer als *highestValue ist, aktualisiere *highestValue und setze *mostValuableItem mithilfe der Zeiger auf itemName.
    Gib totalValue zurück.
  3. displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
    Gib den Namen jedes Artikels, die Menge (dereferenziert von ihrem Zeiger) und den berechneten Wert mit fmt.Printf aus.
    Format: Apples: 10 (Value: $5.00): Verwende %.2f für Preise.

Die erwartete Ausgabe für den anfänglichen Bestand lautet:

Initial Inventory:
Apples: 10 (Value: $5.00)
Oranges: 15 (Value: $10.50)
Bananas: 8 (Value: $2.40)
Total inventory value: $17.90
Most valuable item: Oranges

Tipp: Verwende *quantity, um den Wert zu lesen oder zu schreiben, auf den ein Zeiger zeigt. Zum Beispiel ändert *quantity += change die ursprüngliche Variable direkt.

Probier es selbst

package main

import "fmt"

// updateQuantity aktualisiert die Menge eines Artikels und gibt die neue Menge zurück
// und ob der Artikel ausverkauft ist (quantity = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
    // TODO: Aktualisiere den quantity-Zeiger und gib den neuen Wert und den Ausverkauft-Status zurück
    return 0, false
}

// calculateValue berechnet den Gesamtwert eines Artikels basierend auf Menge und Preis
// It also updates the mostValuableItem if this item is more valuable
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
    // TODO: Calculate the total value, update mostValuableItem if needed, and return the total value
    return 0.0
}

// displayInventory gibt die Inventardetails aus
// Es nimmt Zeiger entgegen, damit die Funktion Echtzeitdaten anzeigen kann
func displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64) {
    fmt.Printf("Apples: %d (Value: $%.2f)\n", *apples, float64(*apples) * applePrice)
    fmt.Printf("Oranges: %d (Value: $%.2f)\n", *oranges, float64(*oranges) * orangePrice)
    fmt.Printf("Bananas: %d (Value: $%.2f)\n", *bananas, float64(*bananas) * bananaPrice)
}

func main() {
    // Inventar initialisieren
    apples := 10
    oranges := 15
    bananas := 8
    
    // Preise
    applePrice := 0.5  // $0.50 pro Stück
    orangePrice := 0.7 // $0.70 pro Stück
    bananaPrice := 0.3 // $0.30 pro Stück
    
    // Track the most valuable item
    var mostValuableItem string
    var highestValue float64
    
    // Display initial inventory
    fmt.Println("Initial Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Calculate initial values and find most valuable item
    appleValue := calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
    orangeValue := calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
    bananaValue := calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
    
    fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
    fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
    
    // Einige Verkäufe simulieren
    fmt.Println("Processing sales...")
    _, applesOutOfStock := updateQuantity(&apples, -4) // Verkaufe 4 Äpfel
    _, orangesOutOfStock := updateQuantity(&oranges, -8) // Verkaufe 8 Orangen
    _, bananasOutOfStock := updateQuantity(&bananas, -10) // Versuche, 10 Bananen zu verkaufen (mehr als wir haben)
    
    // Check if any items are out of stock
    if applesOutOfStock {
        fmt.Println("Apples are out of stock!")
    }
    if orangesOutOfStock {
        fmt.Println("Oranges are out of stock!")
    }
    if bananasOutOfStock {
        fmt.Println("Bananas are out of stock!")
    }
    
    // Display updated inventory
    fmt.Println("\nUpdated Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Reset most valuable tracking for recalculation
    mostValuableItem = ""
    highestValue = 0
    
    // Werte neu berechnen
    appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
    orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
    bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
    
    fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
    fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
    
    // Artikel nachfüllen
    fmt.Println("Restocking...")
    updateQuantity(&apples, 5)  // Füge 5 Äpfel hinzu
    updateQuantity(&oranges, 10) // Füge 10 Orangen hinzu
    updateQuantity(&bananas, 12) // Füge 12 Bananen hinzu
    
    // Display final inventory
    fmt.Println("\nFinal Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Reset most valuable tracking for final calculation
    mostValuableItem = ""
    highestValue = 0
    
    // Endgültige Wertberechnung
    appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
    orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
    bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
    
    fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
    fmt.Printf("Most valuable item: %s\n", mostValuableItem)
}

Alle Lektionen in Grundlagen

Übe selbstständig: Online-Go-Compiler