Menu
Coddy logo textTech

Powtórzenie — zrozumienie wskaźników

Część sekcji Podstawy ścieżki GO w Coddy. Lekcja 66 z 109.

challenge icon

Wyzwanie

Średni

W tym wyzwaniu zbudujesz prosty system zarządzania zapasami dla małego sklepu. Użyjesz wskaźników do aktualizowania ilości w magazynie, obliczania wartości i śledzenia zmian.

Uzupełnij poniższe trzy funkcje:

  1. updateQuantity(quantity *int, change int) (int, bool)
    Zmodyfikuj wartość wskazywaną przez quantity, dodając do niej change (wartość ujemna oznacza sprzedaż, a dodatnia — uzupełnienie zapasów).
    Jeśli wynik byłby mniejszy niż 0, zamiast tego ustaw *quantity na 0.
    Zwróć nową ilość oraz wartość logiczną równą true, jeśli produktu nie ma już w magazynie (*quantity == 0).
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    Oblicz totalValue jako float64(quantity) * price.
    Jeśli totalValue jest większe niż *highestValue, zaktualizuj *highestValue i ustaw *mostValuableItem na itemName, używając wskaźników.
    Zwróć totalValue.
  3. displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
    Wypisz nazwę każdego produktu, jego ilość (odczytaną przez dereferencję wskaźnika) oraz obliczoną wartość za pomocą fmt.Printf.
    Format: Apples: 10 (Value: $5.00): użyj %.2f dla cen.

Oczekiwany wynik dla początkowych zapasów:

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

Wskazówka: Użyj *quantity, aby odczytać lub zapisać wartość wskazywaną przez wskaźnik. Na przykład *quantity += change bezpośrednio modyfikuje oryginalną zmienną.

Spróbuj swoich sił

package main

import "fmt"

// updateQuantity aktualizuje liczbę sztuk produktu i zwraca jej nową wartość
// oraz informację, czy produkt jest niedostępny (quantity = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
    // TODO: Zaktualizuj wartość wskazywaną przez wskaźnik quantity i zwróć nową wartość oraz informację o braku produktu w magazynie
    return 0, false
}

// calculateValue oblicza łączną wartość produktu na podstawie liczby sztuk i ceny
// Aktualizuje również mostValuableItem, jeśli ten produkt ma większą wartość
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
    // TODO: Oblicz łączną wartość, w razie potrzeby zaktualizuj mostValuableItem i zwróć łączną wartość
    return 0.0
}

// displayInventory wyświetla szczegóły stanu magazynowego
// Przyjmuje wskaźniki, aby funkcja mogła wyświetlać aktualne dane
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() {
    // Zainicjalizuj stan magazynowy
    apples := 10
    oranges := 15
    bananas := 8
    
    // Ceny
    applePrice := 0.5  // $0.50 za sztukę
    orangePrice := 0.7 // $0.70 za sztukę
    bananaPrice := 0.3 // $0.30 za sztukę
    
    // Śledź najcenniejszy produkt
    var mostValuableItem string
    var highestValue float64
    
    // Wyświetl początkowy stan magazynu
    fmt.Println("Initial Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Oblicz początkowe wartości i znajdź najcenniejszy produkt
    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)
    
    // Zasymuluj kilka sprzedaży
    fmt.Println("Processing sales...")
    _, applesOutOfStock := updateQuantity(&apples, -4) // Sprzedaj 4 jabłka
    _, orangesOutOfStock := updateQuantity(&oranges, -8) // Sprzedaj 8 pomarańczy
    _, bananasOutOfStock := updateQuantity(&bananas, -10) // Spróbuj sprzedać 10 bananów (więcej, niż mamy)
    
    // Sprawdź, czy któryś produkt jest niedostępny
    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!")
    }
    
    // Wyświetl zaktualizowany stan magazynu
    fmt.Println("\nUpdated Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Zresetuj śledzenie najcenniejszego produktu przed ponownym obliczeniem
    mostValuableItem = ""
    highestValue = 0
    
    // Oblicz wartości ponownie
    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)
    
    // Uzupełnij zapasy produktów
    fmt.Println("Restocking...")
    updateQuantity(&apples, 5)  // Dodaj 5 jabłek
    updateQuantity(&oranges, 10) // Dodaj 10 pomarańczy
    updateQuantity(&bananas, 12) // Dodaj 12 bananów
    
    // Wyświetl końcowy stan zapasów
    fmt.Println("\nFinal Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Zresetuj śledzenie najcenniejszego produktu przed końcowym obliczeniem
    mostValuableItem = ""
    highestValue = 0
    
    // Końcowe obliczenie wartości
    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)
}

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Go online