Özet - İşaretçileri Anlamak
Coddy'nin GO Journey'sinin Temeller bölümünün bir parçası — ders 66 / 109.
Görev
OrtaBu meydan okumada, küçük bir mağaza için basit bir envanter yönetim sistemi oluşturacaksınız. Envanter miktarlarını güncellemek, değerleri hesaplamak ve değişiklikleri takip etmek için pointer'ları (işaretçileri) kullanacaksınız.
Aşağıdaki üç fonksiyonu tamamlayın:
-
updateQuantity(quantity *int, change int) (int, bool)
quantityadresindeki değerichangemiktarını ekleyerek değiştirin (satışlar için negatif, stok yenilemeleri için pozitif).
Eğer sonuç0'ın altına düşerse, bunun yerine*quantitydeğerini0olarak ayarlayın.
Yeni miktarı ve eğer ürün stokta kalmadıysa (*quantity == 0)trueolan bir boolean değeri döndürün. -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
totalValuedeğerinifloat64(quantity) * priceolarak hesaplayın.
EğertotalValue,*highestValuedeğerinden büyükse, pointer'ları kullanarak*highestValuedeğerini güncelleyin ve*mostValuableItemdeğeriniitemNameolarak ayarlayın.
totalValuedeğerini döndürün. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
fmt.Printfkullanarak her bir ürünün adını, miktarını (pointer'dan dereference edilerek) ve hesaplanan değerini yazdırın.
Format:Apples: 10 (Value: $5.00)— fiyatlar için%.2fkullanın.
Başlangıç envanteri için beklenen çıktı şöyledir:
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
İpucu: Bir pointer'ın işaret ettiği değeri okumak veya yazmak için *quantity kullanın. Örneğin, *quantity += change doğrudan orijinal değişkeni değiştirir.
Kendin dene
package main
import "fmt"
// updateQuantity bir öğenin miktarını günceller ve yeni miktarı döndürür
// ve öğenin stokta kalıp kalmadığını (miktar = 0) döndürür
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Miktar işaretçisini güncelleyin ve yeni değeri ve stokta kalmama durumunu döndürün
return 0, false
}
// calculateValue miktar ve fiyata göre bir öğenin toplam değerini hesaplar
// Ayrıca bu öğe daha değerliyse mostValuableItem'ı günceller
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Toplam değeri hesaplayın, gerekirse mostValuableItem'ı güncelleyin ve toplam değeri döndürün
return 0.0
}
// displayInventory envanter ayrıntılarını yazdırır
// Fonksiyonun gerçek zamanlı verileri göstermesini sağlamak için işaretçiler alır
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() {
// Envanteri başlat
apples := 10
oranges := 15
bananas := 8
// Fiyatlar
applePrice := 0.5 // her biri $0.50
orangePrice := 0.7 // her biri $0.70
bananaPrice := 0.3 // her biri $0.30
// En değerli öğeyi takip et
var mostValuableItem string
var highestValue float64
// Başlangıç envanterini görüntüle
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Başlangıç değerlerini hesapla ve en değerli öğeyi bul
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)
// Bazı satışları simüle et
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // 4 elma sat
_, orangesOutOfStock := updateQuantity(&oranges, -8) // 8 portakal sat
_, bananasOutOfStock := updateQuantity(&bananas, -10) // 10 muz satmaya çalış (elimizdekinden fazla)
// Herhangi bir öğenin stokta kalıp kalmadığını kontrol et
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!")
}
// Güncellenmiş envanteri görüntüle
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Yeniden hesaplama için en değerli takibini sıfırla
mostValuableItem = ""
highestValue = 0
// Değerleri yeniden hesapla
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)
// Öğeleri yeniden stokla
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // 5 elma ekle
updateQuantity(&oranges, 10) // 10 portakal ekle
updateQuantity(&bananas, 12) // 12 muz ekle
// Son envanteri görüntüle
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Son hesaplama için en değerli takibini sıfırla
mostValuableItem = ""
highestValue = 0
// Son değer hesaplaması
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)
}Temeller bölümündeki tüm dersler
4Karşılaştırma ve Mantıksal Operatörler
Karşılaştırma Operatörleri - Bölüm 1Karşılaştırma Operatörleri - Bölüm 2Mantıksal VE OperatörüMantıksal VEYA OperatörüMantıksal DEĞİL OperatörüOperatör Önceliği TemelleriÖzet - Karşılaştırma Yapma7Kontrol Akışı: Döngüler
`for` Döngüsü Nedir?`for` Döngüsü - Temel`for` Döngüsü - Sadece Koşul`break` Anahtar Kelimesi`continue` Anahtar Kelimesiİç İçe DöngülerÖzet - İşlemleri Tekrarlama2Değişkenler ve Temel Veri Tipleri
Değişken nedir?`:=` ile Tür ÇıkarımıTam Sayılar (int)Ondalıklı SayılarBooleanlarStringlerSıfır DeğerlerSabitlerİsimlendirme KurallarıÖzet - Değişkenler ve Türler5Temel Giriş/Çıkış
Biçimlendirilmiş ÇıktıBiçim BelirteçleriVeri Tiplerini YazdırmaTemel Kullanıcı Girdisi AlmaÖzet - Giriş ve Çıkış8Fonksiyonlar
Fonksiyonları AnlamakFonksiyon TanımlamaFonksiyonları ÇağırmaFonksiyon ParametreleriTek Bir Değer DöndürmeBirden Fazla Değer Döndürmeİsimlendirilmiş Dönüş DeğerleriFonksiyon Kapsamı TemelleriÖzet - Yeniden Kullanılabilir Kod Oluşturma3Temel Operatörler
Aritmetik OperatörlerBölme OperatörüModulo OperatörüAtama OperatörüBileşik Atama OperatörleriArtırma ve AzaltmaÖzet - Hesaplamalar6Kontrol Akışı: Koşullu İfadeler
`if` İfadesi`else` Anahtar Kelimesi`else if` Anahtar Kelimesi`if` İçinde Değişken GölgelemeDeğişkenleri Başlatma`switch` İfadesiİfadeli `switch`İfadesiz `switch``fallthrough` Anahtar KelimesiÖzet - Karar Verme9İşaretçiler
İşaretçi Nedir?İşaretçi Değişkenlerini TanımlamaAdres Operatörüİşaretçi Referansını ÇözmeFonksiyonlarda İşaretçi KullanımıNil İşaretçilerÖzet - İşaretçileri Anlamak