Menu
CoddyTech

Ô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.

challenge icon

Thử thách

Trung bình

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

  1. updateQuantity(quantity *int, change int) (int, bool)
    Thay đổi giá trị tại quantity bằng cách cộng thêm change (số âm khi bán hàng, số dương khi nhập thêm hàng).
    Nếu kết quả nhỏ hơn 0, hãy đặt *quantity thành 0.
    Trả về số lượng mới và một giá trị boolean là true nếu mặt hàng hiện đã hết hàng (*quantity == 0).
  2. calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
    Tính totalValue bằng float64(quantity) * price.
    Nếu totalValue lớn hơn *highestValue, hãy cập nhật *highestValue và dùng các con trỏ để đặt *mostValuableItem thành itemName.
    Trả về totalValue.
  3. 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ằng fmt.Printf.
    Định dạng: Apples: 10 (Value: $5.00): dùng %.2f cho 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

Tự luyện tập: Trình biên dịch Go online