Ôn tập: Tìm hiểu về con trỏ
Thuộc phần Kiến thức nền tảng trong hành trình GO của Coddy. Bài học 66 trên 109.
Thử thách
Trung bìnhTrong thử thách này, bạn sẽ xây dựng một hệ thống quản lý hàng tồn kho đơn giản cho một cửa hàng nhỏ. Bạn sẽ dùng con trỏ để cập nhật số lượng hàng tồn kho, tính giá trị và theo dõi các thay đổi.
Hoàn thành ba hàm dưới đây:
-
updateQuantity(quantity *int, change int) (int, bool)
Thay đổi giá trị tạiquantitybằng cách cộng thêmchange(số âm khi bán hàng, số dương khi nhập thêm hàng).
Nếu kết quả nhỏ hơn0, hãy đặt*quantitythành0.
Trả về số lượng mới và một giá trị boolean làtruenếu mặt hàng hiện đã hết hàng (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
TínhtotalValuebằngfloat64(quantity) * price.
NếutotalValuelớn hơn*highestValue, hãy cập nhật*highestValuevà dùng các con trỏ để đặt*mostValuableItemthànhitemName.
Trả vềtotalValue. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
In tên, số lượng (lấy giá trị bằng cách giải tham chiếu con trỏ) và giá trị đã tính của từng mặt hàng bằngfmt.Printf.
Định dạng:Apples: 10 (Value: $5.00): dùng%.2fcho giá.
Kết quả đầu ra dự kiến cho hàng tồn kho ban đầu là:
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
Gợi ý: Dùng *quantity để đọc hoặc ghi giá trị mà con trỏ trỏ đến. Ví dụ, *quantity += change sẽ sửa đổi trực tiếp biến ban đầu.
Tự làm thử
package main
import "fmt"
// updateQuantity cập nhật số lượng của một mặt hàng và trả về số lượng mới
// cùng trạng thái hết hàng (quantity = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Cập nhật con trỏ quantity, rồi trả về giá trị mới và trạng thái hết hàng
return 0, false
}
// calculateValue tính tổng giá trị của một mặt hàng dựa trên số lượng và giá
// Hàm cũng cập nhật mostValuableItem nếu mặt hàng này có giá trị cao hơn
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Tính tổng giá trị, cập nhật mostValuableItem nếu cần, rồi trả về tổng giá trị
return 0.0
}
// displayInventory in ra thông tin chi tiết về hàng tồn kho
// Hàm nhận các con trỏ để hiển thị dữ liệu theo thời gian thực
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() {
// Khởi tạo hàng tồn kho
apples := 10
oranges := 15
bananas := 8
// Giá
applePrice := 0.5 // $0.50 mỗi quả
orangePrice := 0.7 // $0.70 mỗi quả
bananaPrice := 0.3 // $0.30 mỗi quả
// Theo dõi mặt hàng có giá trị cao nhất
var mostValuableItem string
var highestValue float64
// Hiển thị hàng tồn kho ban đầu
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Tính các giá trị ban đầu và tìm mặt hàng có giá trị cao nhất
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)
// Mô phỏng một số lượt bán hàng
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // Bán 4 quả táo
_, orangesOutOfStock := updateQuantity(&oranges, -8) // Bán 8 quả cam
_, bananasOutOfStock := updateQuantity(&bananas, -10) // Thử bán 10 quả chuối (nhiều hơn số lượng hiện có)
// Kiểm tra xem có mặt hàng nào hết hàng không
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!")
}
// Hiển thị hàng tồn kho sau khi cập nhật
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Đặt lại dữ liệu theo dõi mặt hàng có giá trị cao nhất để tính lại
mostValuableItem = ""
highestValue = 0
// Tính lại các giá trị
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)
// Bổ sung hàng vào kho
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // Thêm 5 quả táo
updateQuantity(&oranges, 10) // Thêm 10 quả cam
updateQuantity(&bananas, 12) // Thêm 12 quả chuối
// Hiển thị tồn kho cuối cùng
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Đặt lại thông tin theo dõi mặt hàng có giá trị cao nhất để tính toán lần cuối
mostValuableItem = ""
highestValue = 0
// Tính giá trị lần cuối
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)
}Tất cả bài học trong Kiến thức nền tảng
4Toán tử so sánh và logic
Toán tử so sánh, phần 1Toán tử so sánh, phần 2Toán tử AND logicToán tử OR logicToán tử NOT logicCơ bản về thứ tự ưu tiên của toán tửÔn tập: thực hiện phép so sánh7Luồng điều khiển: vòng lặp
Giải thích vòng lặp `for`Vòng lặp `for` cơ bảnVòng lặp `for` chỉ có điều kiệnTừ khóa `break`Từ khóa `continue`Vòng lặp lồng nhauÔn tập: lặp lại hành động2Biến và các kiểu dữ liệu cơ bản
Biến là gìSuy luận kiểu với `:=`Số nguyên (int)Số dấu phẩy độngGiá trị BooleanChuỗiGiá trị 0Hằng sốQuy ước đặt tênÔn tập: biến và kiểu dữ liệu5Đầu vào/đầu ra cơ bản
Đầu ra có định dạngĐộng từ định dạngIn các kiểu dữ liệuNhận đầu vào cơ bản từ người dùngÔn tập: đầu vào và đầu ra8Hàm
Tìm hiểu về hàmKhai báo hàmGọi hàmTham số của hàmTrả về một giá trịTrả về nhiều giá trịGiá trị trả về có tênNhững điều cơ bản về phạm vi của hàmÔn tập: Tạo code có thể tái sử dụng3Toán tử cơ bản
Toán tử số họcToán tử chiaToán tử moduloToán tử gánToán tử gán kết hợpTăng và giảmÔn tập: Tính toán6Luồng điều khiển: câu lệnh điều kiện
Câu lệnh `if`Từ khóa `else`Từ khóa `else if`Biến bị che khuất trong `if`Khởi tạo biếnCâu lệnh `switch``switch` có biểu thức`switch` không có biểu thứcTừ khóa `fallthrough`Ôn tập: đưa ra quyết định9Con trỏ
Con trỏ là gì?Khai báo biến con trỏToán tử lấy địa chỉGiải tham chiếu con trỏDùng con trỏ trong hàmCon trỏ nilÔn tập: Tìm hiểu về con trỏTự luyện tập: Trình biên dịch Go online