Powtórzenie — zrozumienie wskaźników
Część sekcji Podstawy ścieżki GO w Coddy. Lekcja 66 z 109.
Wyzwanie
ŚredniW 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:
-
updateQuantity(quantity *int, change int) (int, bool)
Zmodyfikuj wartość wskazywaną przezquantity, dodając do niejchange(wartość ujemna oznacza sprzedaż, a dodatnia — uzupełnienie zapasów).
Jeśli wynik byłby mniejszy niż0, zamiast tego ustaw*quantityna0.
Zwróć nową ilość oraz wartość logiczną równątrue, jeśli produktu nie ma już w magazynie (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
OblicztotalValuejakofloat64(quantity) * price.
JeślitotalValuejest większe niż*highestValue, zaktualizuj*highestValuei ustaw*mostValuableItemnaitemName, używając wskaźników.
ZwróćtotalValue. -
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%.2fdla 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
4Operatory porównania i logiczne
Operatory porównania – część 1Operatory porównania – część 2Logiczny operator ANDLogiczny operator ORLogiczny operator NOTPodstawy kolejności wykonywania operatorówPodsumowanie – porównywanie7Sterowanie przepływem: pętle
Jak działa pętla `for`Pętla `for` — podstawyPętla `for` — tylko warunekSłowo kluczowe `break`Słowo kluczowe `continue`Pętle zagnieżdżonePodsumowanie — powtarzanie działań2Zmienne i podstawowe typy danych
Czym jest zmiennaWnioskowanie o typie za pomocą `:=`Liczby całkowite (int)Liczby zmiennoprzecinkoweWartości logiczneCiągi znakówWartości zeroweStałeKonwencje nazewnictwaPodsumowanie – zmienne i typy5Podstawowe wejście/wyjście
Formatowane wyjścieSpecyfikatory formatuWyświetlanie typówPobieranie podstawowych danych od użytkownikaPodsumowanie — wejście i wyjście8Funkcje
Zrozumienie funkcjiDeklarowanie funkcjiWywoływanie funkcjiParametry funkcjiZwracanie jednej wartościZwracanie wielu wartościNazwane wartości zwracanePodstawy zakresu funkcjiPodsumowanie — tworzenie wielokrotnego użytku kodu11Typy złożone: wycinki
Wprowadzenie do wycinkówDeklarowanie literałów wycinkówTworzenie wycinków za pomocą `make`Długość a pojemność wycinkaDostęp do elementów wycinkaDodawanie elementówWycinanie z istniejących wycinków i tablicIterowanie po wycinkachKopiowanie wycinkówPodsumowanie — listy dynamiczne3Podstawowe operatory
Operatory arytmetyczneOperator dzieleniaOperator moduloOperator przypisaniaOperatory przypisania z działaniemZwiększanie i zmniejszaniePowtórka – obliczenia6Sterowanie przepływem: instrukcje warunkowe
Instrukcja `if`Słowo kluczowe `else`Słowo kluczowe `else if`Przesłanianie zmiennych w `if`Inicjalizacja zmiennychInstrukcja `switch``switch` z wyrażeniami`switch` bez wyrażeniaSłowo kluczowe `fallthrough`Podsumowanie — podejmowanie decyzji9Wskaźniki
Czym jest wskaźnik?Deklarowanie zmiennych wskaźnikowychOperator pobrania adresuDereferencja wskaźnikówUżywanie wskaźników w funkcjachWskaźniki nilPowtórzenie — zrozumienie wskaźnikówPoćwicz samodzielnie: Kompilator Go online