Memeriksa Stok
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 46 dari 68.
Tantangan
MudahBuat 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:
- Gunakan struct
Productyang sama dari pelajaran sebelumnya dengan fieldPrice(float64) danQuantity(int) - Urai input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan setiap entri produk
- Untuk setiap entri produk, pisahkan berdasarkan titik dua untuk mendapatkan nama produk, harga, dan jumlah
- Konversikan string harga menjadi float64 dan string jumlah menjadi int
- Buat dan isi map
inventorydengan data produk yang telah diurai - Buat fungsi bernama
checkStockyang 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]"
- Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan daftar produk yang akan diperiksa
- Tampilkan header pemeriksaan stok:
"Stock Check Results:" - Untuk setiap produk dalam daftar pemeriksaan, panggil fungsi
checkStockdan tampilkan hasilnya:- Jika tidak ada error:
"[product_name]: [quantity] units in stock" - Jika terjadi error:
"[product_name]: Error - [error_message]"
- Jika tidak ada error:
- 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]"
- Tampilkan total stok untuk produk yang ditemukan:
"Total stock for found products: [sum_of_quantities_for_existing_products] units"
- 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"
- Jika ada produk yang tidak ditemukan:
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
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online