Menu
Coddy logo textTech

Zusammenfassung – Zeiger verstehen

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

challenge icon

Aufgabe

Mittel

In dieser Herausforderung erstellen Sie ein einfaches Inventarverwaltungssystem für ein kleines Geschäft. Sie verwenden Pointer, um Inventarmengen zu aktualisieren, Werte zu berechnen und Änderungen zu verfolgen.

Vervollständigen Sie die drei folgenden Funktionen:

  1. updateQuantity(quantity *int, change int) (int, bool)
    Ändern Sie den Wert bei quantity, indem Sie change addieren (negativ für Verkäufe, positiv für Nachfüllungen).
    Wenn das Ergebnis unter 0 fallen würde, setzen Sie *quantity stattdessen auf 0.
    Geben Sie die neue Menge und einen booleschen Wert zurück, der true ist, wenn der Artikel nun nicht mehr vorrätig ist (*quantity == 0).
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    Berechnen Sie totalValue als float64(quantity) * price.
    Wenn totalValue größer als *highestValue ist, aktualisieren Sie *highestValue und setzen Sie *mostValuableItem mithilfe der Pointer auf itemName.
    Geben Sie totalValue zurück.
  3. displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
    Geben Sie den Namen jedes Artikels, die Menge (vom Pointer dereferenziert) und den berechneten Wert mit fmt.Printf aus.
    Format: Apples: 10 (Value: $5.00) — verwenden Sie %.2f für Preise.

Die erwartete Ausgabe für das Anfangsinventar ist:

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: Verwenden Sie *quantity, um den Wert zu lesen oder zu schreiben, auf den ein Pointer 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
// sowie die Information, ob der Artikel ausverkauft ist (Menge = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
    // TODO: Den Mengen-Pointer aktualisieren und den neuen Wert sowie den Ausverkauft-Status zurückgeben
    return 0, false
}

// calculateValue berechnet den Gesamtwert eines Artikels basierend auf Menge und Preis
// Zudem wird mostValuableItem aktualisiert, falls dieser Artikel wertvoller ist
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
    // TODO: Gesamtwert berechnen, bei Bedarf mostValuableItem aktualisieren und den Gesamtwert zurückgeben
    return 0.0
}

// displayInventory gibt die Details des Inventars aus
// Verwendet Pointer, 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
    
    // Den wertvollsten Artikel verfolgen
    var mostValuableItem string
    var highestValue float64
    
    // Anfängliches Inventar anzeigen
    fmt.Println("Initial Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Anfangswerte berechnen und den wertvollsten Artikel finden
    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) // 4 Äpfel verkaufen
    _, orangesOutOfStock := updateQuantity(&oranges, -8) // 8 Orangen verkaufen
    _, bananasOutOfStock := updateQuantity(&bananas, -10) // Versuchen, 10 Bananen zu verkaufen (mehr als vorhanden)
    
    // Prüfen, ob Artikel ausverkauft sind
    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!")
    }
    
    // Aktualisiertes Inventar anzeigen
    fmt.Println("\nUpdated Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Tracking des wertvollsten Artikels für Neuberechnung zurücksetzen
    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 aufstocken
    fmt.Println("Restocking...")
    updateQuantity(&apples, 5)  // 5 Äpfel hinzufügen
    updateQuantity(&oranges, 10) // 10 Orangen hinzufügen
    updateQuantity(&bananas, 12) // 12 Bananen hinzufügen
    
    // Finales Inventar anzeigen
    fmt.Println("\nFinal Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Tracking des wertvollsten Artikels für finale Berechnung zurücksetzen
    mostValuableItem = ""
    highestValue = 0
    
    // Finale 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