Menu
CoddyTech

Memeriksa Stok

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 46 dari 68.

challenge icon

Tantangan

Mudah

Buat fungsi pemeriksaan stok untuk sistem manajemen inventarismu yang mengambil jumlah produk dengan aman dan menangani kasus saat produk tidak ada. Tantangan ini mengembangkan fondasi inventaris dari pelajaran sebelumnya dan menambahkan penanganan error untuk kueri stok.

Kamu akan menerima dua input:

  • String yang berisi data inventaris yang tersedia dalam format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (misalnya, "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • String yang berisi permintaan pemeriksaan stok dalam format "product1,product2,product3" (misalnya, "Mouse,Tablet,Keyboard")

Tugasmu adalah:

  1. Gunakan struct Product yang sama dari pelajaran sebelumnya dengan field Price (float64) dan Quantity (int)
  2. Urai input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan setiap entri produk
  3. Untuk setiap entri produk, pisahkan berdasarkan titik dua untuk mendapatkan nama produk, harga, dan jumlah
  4. Konversikan string harga menjadi float64 dan string jumlah menjadi int
  5. Buat dan isi map inventory dengan data produk yang telah diurai
  6. Buat fungsi bernama checkStock yang menerima map inventaris dan nama produk sebagai parameter, lalu mengembalikan (int, error):
    • Jika produk ada di inventaris, kembalikan jumlahnya dan nil
    • Jika produk tidak ada, kembalikan 0 dan error dengan pesan "product not found: [product_name]"
  7. Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan daftar produk yang akan diperiksa
  8. Tampilkan header pemeriksaan stok: "Stock Check Results:"
  9. Untuk setiap produk dalam daftar pemeriksaan, panggil fungsi checkStock dan tampilkan hasilnya:
    • Jika tidak ada error: "[product_name]: [quantity] units in stock"
    • Jika terjadi error: "[product_name]: Error - [error_message]"
  10. Hitung dan tampilkan statistik ringkasan:
    • "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. Tampilkan total stok untuk produk yang ditemukan:
    • "Total stock for found products: [sum_of_quantities_for_existing_products] units"
  12. Daftarkan produk yang tidak ditemukan:
    • Jika ada produk yang tidak ditemukan: "Missing products: [comma_separated_list_of_missing_products]"
    • Jika tidak ada produk yang tidak ditemukan: "All requested products are available"

Gunakan package strings untuk memisahkan string input, package strconv untuk mengonversi string menjadi angka, package errors untuk membuat pesan error, dan package fmt untuk output berformat. Tantangan ini menunjukkan cara menerapkan pengambilan data yang aman dengan penanganan error yang tepat, sebuah pola dasar dalam sistem manajemen inventaris.

Coba sendiri

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")
}

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online