Menu
CoddyTech

Ulasan: Memahami Pointer

Termasuk bagian Dasar-Dasar dalam perjalanan GO di Coddy. Pelajaran 66 dari 109.

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan membuat sistem pengelolaan inventaris sederhana untuk toko kecil. Kamu akan menggunakan pointer untuk memperbarui jumlah inventaris, menghitung nilai, dan melacak perubahan.

Selesaikan tiga fungsi berikut:

  1. updateQuantity(quantity *int, change int) (int, bool)
    Ubah nilai yang ditunjuk oleh quantity dengan menambahkan change (negatif untuk penjualan, positif untuk pengisian ulang).
    Jika hasilnya kurang dari 0, tetapkan *quantity menjadi 0.
    Kembalikan jumlah baru dan boolean yang bernilai true jika barang kini kehabisan stok (*quantity == 0).
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    Hitung totalValue sebagai float64(quantity) * price.
    Jika totalValue lebih besar daripada *highestValue, perbarui *highestValue dan tetapkan *mostValuableItem menjadi itemName menggunakan pointer.
    Kembalikan totalValue.
  3. displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
    Cetak nama setiap barang, jumlahnya (diambil dengan dereferensi dari pointer-nya), dan nilai yang dihitung menggunakan fmt.Printf.
    Format: Apples: 10 (Value: $5.00): gunakan %.2f untuk harga.

Output yang diharapkan untuk inventaris awal adalah:

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

Petunjuk: Gunakan *quantity untuk membaca atau menulis nilai yang ditunjuk oleh pointer. Contohnya, *quantity += change mengubah variabel asli secara langsung.

Coba sendiri

package main

import "fmt"

// updateQuantity memperbarui jumlah barang dan mengembalikan jumlah barunya
// serta menunjukkan apakah barang tersebut habis (quantity = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
    // TODO: Perbarui pointer quantity, lalu kembalikan nilai baru dan status stok habis
    return 0, false
}

// calculateValue menghitung nilai total barang berdasarkan jumlah dan harga
// Fungsi ini juga memperbarui mostValuableItem jika barang ini lebih bernilai
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
    // TODO: Hitung nilai total, perbarui mostValuableItem jika perlu, lalu kembalikan nilai total
    return 0.0
}

// displayInventory menampilkan detail inventaris
// Fungsi ini menerima pointer agar dapat menampilkan data terkini
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() {
    // Inisialisasi inventaris
    apples := 10
    oranges := 15
    bananas := 8
    
    // Harga
    applePrice := 0.5  // $0.50 per buah
    orangePrice := 0.7 // $0.70 per buah
    bananaPrice := 0.3 // $0.30 per buah
    
    // Lacak barang dengan nilai tertinggi
    var mostValuableItem string
    var highestValue float64
    
    // Tampilkan stok awal
    fmt.Println("Initial Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Hitung nilai awal dan temukan barang dengan nilai tertinggi
    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)
    
    // Simulasikan beberapa penjualan
    fmt.Println("Processing sales...")
    _, applesOutOfStock := updateQuantity(&apples, -4) // Jual 4 apel
    _, orangesOutOfStock := updateQuantity(&oranges, -8) // Jual 8 jeruk
    _, bananasOutOfStock := updateQuantity(&bananas, -10) // Coba jual 10 pisang (lebih banyak dari stok yang tersedia)
    
    // Periksa apakah ada barang yang kehabisan stok
    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!")
    }
    
    // Tampilkan stok terbaru
    fmt.Println("\nUpdated Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Atur ulang pelacakan barang dengan nilai tertinggi sebelum menghitung ulang
    mostValuableItem = ""
    highestValue = 0
    
    // Hitung ulang nilainya
    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)
    
    // Isi ulang stok barang
    fmt.Println("Restocking...")
    updateQuantity(&apples, 5)  // Tambahkan 5 apel
    updateQuantity(&oranges, 10) // Tambahkan 10 jeruk
    updateQuantity(&bananas, 12) // Tambahkan 12 pisang
    
    // Tampilkan inventaris akhir
    fmt.Println("\nFinal Inventory:")
    displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
    
    // Atur ulang pelacakan barang paling bernilai untuk perhitungan akhir
    mostValuableItem = ""
    highestValue = 0
    
    // Perhitungan nilai akhir
    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)
}

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Compiler Go online