Menu
CoddyTech

Kiểm tra hàng tồn kho

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 46 trên 68.

challenge icon

Thử thách

Dễ

Triển khai một hàm kiểm tra hàng tồn kho cho hệ thống quản lý hàng tồn kho của bạn, giúp lấy số lượng sản phẩm an toàn và xử lý trường hợp sản phẩm không tồn tại. Thử thách này tiếp nối nền tảng về hàng tồn kho trong bài học trước và bổ sung cách xử lý lỗi khi truy vấn hàng tồn kho.

Bạn sẽ nhận được hai đầu vào:

  • Một chuỗi chứa dữ liệu hàng tồn kho hiện có theo định dạng "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (ví dụ: "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Một chuỗi chứa các yêu cầu kiểm tra hàng tồn kho theo định dạng "product1,product2,product3" (ví dụ: "Mouse,Tablet,Keyboard")

Nhiệm vụ của bạn là:

  1. Dùng lại struct Product từ bài học trước với các trường Price (float64) và Quantity (int)
  2. Phân tích đầu vào thứ nhất bằng cách tách chuỗi theo dấu phẩy để lấy từng mục sản phẩm
  3. Với mỗi mục sản phẩm, tách chuỗi theo dấu hai chấm để lấy tên sản phẩm, giá và số lượng
  4. Chuyển chuỗi giá thành float64 và chuỗi số lượng thành int
  5. Tạo và điền dữ liệu sản phẩm đã phân tích vào map inventory
  6. Tạo một hàm có tên checkStock, nhận map hàng tồn kho và tên sản phẩm làm tham số, rồi trả về (int, error):
    • Nếu sản phẩm có trong hàng tồn kho, trả về số lượng của sản phẩm và nil
    • Nếu sản phẩm không tồn tại, trả về 0 và một lỗi có thông báo "product not found: [product_name]"
  7. Phân tích đầu vào thứ hai bằng cách tách chuỗi theo dấu phẩy để lấy danh sách sản phẩm cần kiểm tra
  8. Hiển thị tiêu đề kiểm tra hàng tồn kho: "Stock Check Results:"
  9. Với mỗi sản phẩm trong danh sách cần kiểm tra, gọi hàm checkStock và hiển thị kết quả:
    • Nếu không có lỗi: "[product_name]: [quantity] units in stock"
    • Nếu có lỗi: "[product_name]: Error - [error_message]"
  10. Đếm và hiển thị các số liệu tổng kết:
    • "Check Summary:"
    • "Products checked: [total_number_of_products_checked]"
    • "Products found: [number_of_products_that_exist]"
    • "Products not found: [number_of_products_that_dont_exist]"
  11. Hiển thị tổng số lượng hàng tồn kho của các sản phẩm tìm thấy:
    • "Total stock for found products: [sum_of_quantities_for_existing_products] units"
  12. Liệt kê các sản phẩm còn thiếu:
    • Nếu có sản phẩm còn thiếu: "Missing products: [comma_separated_list_of_missing_products]"
    • Nếu không có sản phẩm nào còn thiếu: "All requested products are available"

Dùng package strings để tách các chuỗi đầu vào, package strconv để chuyển chuỗi thành số, package errors để tạo thông báo lỗi và package fmt để định dạng đầu ra. Thử thách này minh họa cách triển khai việc lấy dữ liệu an toàn cùng với xử lý lỗi phù hợp, một mẫu cơ bản trong các hệ thống quản lý hàng tồn kho.

Tự làm thử

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

// Define the Product struct
type Product struct {
	Price    float64
	Quantity int
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	storeInfo := scanner.Text()
	
	scanner.Scan()
	productData := scanner.Text()
	
	// 1. Parse store information (split by comma)
	storeInfoParts := strings.Split(storeInfo, ",")
	storeName := ""
	location := ""
	if len(storeInfoParts) >= 2 {
		storeName = storeInfoParts[0]
		location = storeInfoParts[1]
	}
	
	// 2. Parse product data (split by comma, then by colon for each product)
	productEntries := strings.Split(productData, ",")
	
	// 3. Create inventory map
	inventory := make(map[string]Product)
	
	// 4. Convert strings to appropriate types and populate inventory
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 3 {
			productName := parts[0]
			price, _ := strconv.ParseFloat(parts[1], 64)
			quantity, _ := strconv.Atoi(parts[2])
			
			inventory[productName] = Product{
				Price:    price,
				Quantity: quantity,
			}
		}
	}
	
	// 5. Display store information
	fmt.Printf("=== %s Inventory System ===\n", storeName)
	fmt.Printf("Location: %s\n", location)
	fmt.Printf("Inventory initialized with %d products\n", len(inventory))
	
	// 6. Display current inventory (sorted alphabetically)
	fmt.Println("Current Inventory:")
	var productNames []string
	for name := range inventory {
		productNames = append(productNames, name)
	}
	sort.Strings(productNames)
	
	for _, name := range productNames {
		product := inventory[name]
		fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
	}
	
	// 7. Calculate and display inventory statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	fmt.Println("Inventory Statistics:")
	fmt.Printf("Total Products: %d\n", totalProducts)
	fmt.Printf("Total Items in Stock: %d\n", totalItems)
	fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
	
	// 8. Display system status
	fmt.Println("System Status: Ready")
	fmt.Println("Inventory management system initialized successfully")
}

Tất cả bài học trong Logic và luồng điều khiển

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