Rückblick – Zeiger verstehen
Teil des Abschnitts Grundlagen der GO-Journey von Coddy. Lektion 66 von 109.
Aufgabe
MittelIn 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:
-
updateQuantity(quantity *int, change int) (int, bool)
Ändere den Wert beiquantity, indem duchangeaddierst (negativ für Verkäufe, positiv für Nachbestellungen).
Wenn das Ergebnis kleiner als0wäre, setze*quantitystattdessen auf0.
Gib die neue Menge und einen booleschen Wert zurück, dertrueist, wenn der Artikel jetzt nicht mehr vorrätig ist (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
BerechnetotalValuealsfloat64(quantity) * price.
WenntotalValuegrößer als*highestValueist, aktualisiere*highestValueund setze*mostValuableItemmithilfe der Zeiger aufitemName.
GibtotalValuezurück. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
Gib den Namen jedes Artikels, die Menge (dereferenziert von ihrem Zeiger) und den berechneten Wert mitfmt.Printfaus.
Format:Apples: 10 (Value: $5.00): Verwende%.2ffü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
4Vergleichs- und logische Operatoren
Vergleichsoperatoren – Teil 1Vergleichsoperatoren – Teil 2Logischer UND-OperatorLogischer ODER-OperatorLogischer NICHT-OperatorGrundlagen der OperatorrangfolgeZusammenfassung – Vergleiche durchführen7Kontrollfluss: Schleifen
Die `for`-Schleife erklärt`for`-Schleife – Grundlagen`for`-Schleife – nur BedingungDas Schlüsselwort `break`Das Schlüsselwort `continue`Verschachtelte SchleifenWiederholung – Aktionen wiederholen2Variablen und grundlegende Datentypen
Was ist eine VariableTypinferenz mit `:=`Ganzzahlen (int)GleitkommazahlenBoolesche WerteZeichenkettenNullwerteKonstantenNamenskonventionenRückblick – Variablen und Typen5Grundlegende Ein- und Ausgabe
Formatierte AusgabeFormatierungsverbenDatentypen ausgebenGrundlegende Benutzereingaben erhaltenRückblick – Ein- und Ausgabe8Funktionen
Funktionen verstehenEine Funktion deklarierenFunktionen aufrufenFunktionsparameterEinen einzelnen Wert zurückgebenMehrere Werte zurückgebenBenannte RückgabewerteGrundlagen des FunktionsumfangsRückblick – Wiederverwendbaren Code erstellen3Grundlegende Operatoren
Arithmetische OperatorenDivisionsoperatorDer Modulo-OperatorZuweisungsoperatorErweiterte ZuweisungsoperatorenInkrement und DekrementRückblick – Berechnungen6Kontrollfluss: Bedingungen
Die `if`-AnweisungDas `else`-SchlüsselwortDas `else if`-SchlüsselwortVariablen-Shadowing in `if`Variablen initialisierenDie `switch`-AnweisungSwitch mit AusdrückenSwitch ohne AusdruckDas `fallthrough`-SchlüsselwortZusammenfassung – Entscheidungen treffen9Zeiger
Was ist ein Zeiger?Zeigervariablen deklarierenDer AdressoperatorZeiger dereferenzierenZeiger in Funktionen verwendenNil-ZeigerRückblick – Zeiger verstehen12Zusammengesetzte Datentypen: Maps
Einführung in MapsMap-Literale deklarierenMaps mit `make` erstellenSchlüssel-Wert-Paare hinzufügen und aktualisierenAuf Map-Werte zugreifenDas Vorhandensein eines Schlüssels prüfenMap-Einträge löschenLänge von MapsMaps durchlaufenZusammenfassung – Schlüssel-Wert-SpeicherungÜbe selbstständig: Online-Go-Compiler