Ulasan: Memahami Pointer
Termasuk bagian Dasar-Dasar dalam perjalanan GO di Coddy. Pelajaran 66 dari 109.
Tantangan
SedangDalam 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:
-
updateQuantity(quantity *int, change int) (int, bool)
Ubah nilai yang ditunjuk olehquantitydengan menambahkanchange(negatif untuk penjualan, positif untuk pengisian ulang).
Jika hasilnya kurang dari0, tetapkan*quantitymenjadi0.
Kembalikan jumlah baru dan boolean yang bernilaitruejika barang kini kehabisan stok (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
HitungtotalValuesebagaifloat64(quantity) * price.
JikatotalValuelebih besar daripada*highestValue, perbarui*highestValuedan tetapkan*mostValuableItemmenjadiitemNamemenggunakan pointer.
KembalikantotalValue. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
Cetak nama setiap barang, jumlahnya (diambil dengan dereferensi dari pointer-nya), dan nilai yang dihitung menggunakanfmt.Printf.
Format:Apples: 10 (Value: $5.00): gunakan%.2funtuk 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
4Operator Perbandingan dan Logika
Operator Perbandingan, Bagian 1Operator Perbandingan, Bagian 2Operator AND LogikaOperator OR LogikaOperator NOT LogikaDasar Prioritas OperatorRingkasan, Membuat Perbandingan7Alur Kontrol: Perulangan
Penjelasan tentang `for` loop`for` loop Dasar`for` loop dengan Kondisi SajaKata Kunci `break`Kata Kunci `continue`Perulangan BersarangRangkuman: Mengulang Tindakan2Variabel dan Tipe Data Dasar
Apa itu variabelInferensi Tipe dengan `:=`Bilangan Bulat (int)Bilangan Floating-PointBooleanstringNilai NolKonstantaKonvensi PenamaanRangkuman: Variabel dan Tipe5Input/Output Dasar
Output TerformatKata Kerja FormatMencetak Tipe DataMendapatkan Input Dasar dari PenggunaRangkuman: Input dan Output8Fungsi
Memahami FungsiMendeklarasikan FungsiMemanggil FungsiParameter FungsiMengembalikan Satu NilaiMengembalikan Beberapa NilaiNilai Kembalian BernamaDasar Cakupan FungsiRangkuman: Membuat Kodemu Dapat Digunakan Kembali3Operator Dasar
Operator AritmetikaOperator PembagianOperator ModuloOperator PenugasanOperator Penugasan GabunganInkrementasi dan DekrementasiRangkuman: Perhitungan6Alur Kontrol: Percabangan
Pernyataan `if`Kata Kunci `else`Kata Kunci `else if`Shadowing Variabel dalam `if`Menginisialisasi VariabelPernyataan `switch``switch` dengan Ekspresi`switch` tanpa EkspresiKata Kunci `fallthrough`Ringkasan: Membuat KeputusanLatihan sendiri: Compiler Go online