Menu
Coddy logo textTech

Özet - İşaretçileri Anlamak

Coddy'nin GO Journey'sinin Temeller bölümünün bir parçası — ders 66 / 109.

challenge icon

Görev

Orta

Bu 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:

  1. updateQuantity(quantity *int, change int) (int, bool)
    quantity adresindeki değeri change miktarı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 *quantity değerini 0 olarak ayarlayın.
    Yeni miktarı ve eğer ürün stokta kalmadıysa (*quantity == 0) true olan bir boolean değeri döndürün.
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    totalValue değerini float64(quantity) * price olarak hesaplayın.
    Eğer totalValue, *highestValue değerinden büyükse, pointer'ları kullanarak *highestValue değerini güncelleyin ve *mostValuableItem değerini itemName olarak ayarlayın.
    totalValue değerini döndürün.
  3. displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
    fmt.Printf kullanarak 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 %.2f kullanı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