Memperbarui Jumlah Stok
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 48 dari 68.
Tantangan
MudahTingkatkan sistem manajemen inventarismu dengan menerapkan pembaruan jumlah stok yang dilengkapi validasi menyeluruh dan penanganan error. Tantangan ini mengembangkan fungsionalitas sebelumnya dan menambahkan kemampuan untuk mengubah jumlah produk yang sudah ada, sekaligus mencegah operasi tidak valid yang dapat menyebabkan tingkat stok negatif.
Kamu akan menerima dua input:
- Sebuah string yang berisi data inventaris yang sudah ada dalam format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(misalnya,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Sebuah string yang berisi permintaan pembaruan stok dalam format
"product1:change1,product2:change2,product3:change3", dengan perubahan berupa bilangan bulat positif atau negatif (misalnya,"Mouse:10,Tablet:-5,Keyboard:-3")
Tugasmu:
- Gunakan struct
Productyang sama dari pelajaran sebelumnya, dengan fieldPrice(float64) danQuantity(int) - Uraikan input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan setiap entri produk yang sudah ada
- Untuk setiap entri produk yang sudah ada, pisahkan berdasarkan titik dua untuk mendapatkan nama produk, harga, dan jumlah
- Ubah string harga menjadi float64 dan string jumlah menjadi int
- Buat dan isi map
inventorydengan data produk yang sudah ada - Buat fungsi bernama
updateStockyang menerima map inventaris, nama produk, dan perubahan jumlah sebagai parameter, lalu mengembalikan error:- Jika produk tidak ada di inventaris, kembalikan error dengan pesan
"product not found: [product_name]" - Jika perubahan jumlah akan menyebabkan stok menjadi negatif (jumlah saat ini + perubahan < 0), kembalikan error dengan pesan
"insufficient stock: cannot reduce [product_name] by [absolute_change_value], only [current_quantity] available" - Jika pembaruan valid, ubah jumlah produk di inventaris dan kembalikan nil
- Jika produk tidak ada di inventaris, kembalikan error dengan pesan
- Uraikan input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan daftar permintaan pembaruan stok
- Untuk setiap permintaan pembaruan, pisahkan berdasarkan titik dua untuk mendapatkan nama produk dan perubahan jumlah
- Ubah string perubahan jumlah menjadi int
- Tampilkan header proses pembaruan:
"Processing Stock Updates:" - Untuk setiap permintaan pembaruan, panggil fungsi
updateStockdan tampilkan hasilnya:- Jika tidak ada error dan perubahannya positif:
"[product_name]: Added [change] units - New stock: [new_quantity]" - Jika tidak ada error dan perubahannya negatif:
"[product_name]: Removed [absolute_change_value] units - New stock: [new_quantity]" - Jika tidak ada error dan perubahannya nol:
"[product_name]: No change - Current stock: [current_quantity]" - Jika terjadi error:
"[product_name]: Update failed - [error_message]"
- Jika tidak ada error dan perubahannya positif:
- Hitung dan tampilkan statistik pembaruan:
"Update Summary:""Updates processed: [total_number_of_updates_processed]""Updates successful: [number_of_successful_updates]""Updates failed: [number_of_failed_updates]"
- Tampilkan inventaris yang sudah diperbarui dalam urutan alfabet berdasarkan nama produk:
"Updated Inventory:"- Untuk setiap produk:
"- [product_name]: $[price] (Stock: [quantity])"
- Hitung dan tampilkan statistik akhir inventaris:
"Final Inventory Statistics:""Total Products: [total_number_of_products_in_inventory]""Total Items in Stock: [sum_of_all_quantities]""Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
- Cantumkan setiap pembaruan yang gagal:
- Jika ada pembaruan yang gagal:
"Failed updates: [comma_separated_list_of_failed_product_names]" - Jika tidak ada pembaruan yang gagal:
"All stock updates were processed successfully"
- Jika ada pembaruan yang gagal:
Gunakan package strings untuk memisahkan string input, package strconv untuk mengubah string menjadi angka, package errors untuk membuat pesan error, package fmt untuk output berformat, dan package sort untuk mengurutkan nama produk berdasarkan abjad. Format semua harga hingga 2 angka desimal dan total nilai inventaris hingga 2 angka desimal. Tantangan ini menunjukkan cara mengubah data yang sudah ada dengan aman sekaligus mencegah operasi tidak valid melalui validasi menyeluruh dan penanganan error.
Coba sendiri
package main
import (
"errors"
"fmt"
"sort"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func addNewItem(inventory map[string]Product, productName string, price float64, quantity int) error {
if _, exists := inventory[productName]; exists {
return errors.New("product already exists: " + productName)
}
inventory[productName] = Product{Price: price, Quantity: quantity}
return nil
}
func main() {
var existingInventory string
var newProducts string
fmt.Scanln(&existingInventory)
fmt.Scanln(&newProducts)
inventory := make(map[string]Product)
// Parse existing inventory
existingItems := strings.Split(existingInventory, ",")
for _, item := range existingItems {
parts := strings.Split(item, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[name] = Product{Price: price, Quantity: quantity}
}
// Parse new products to add
newItems := strings.Split(newProducts, ",")
fmt.Println("Adding New Items:")
itemsProcessed := 0
itemsAdded := 0
itemsRejected := 0
var rejectedProducts []string
for _, item := range newItems {
parts := strings.Split(item, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
itemsProcessed++
err := addNewItem(inventory, name, price, quantity)
if err != nil {
fmt.Printf("%s: Failed to add - %s\n", name, err.Error())
itemsRejected++
rejectedProducts = append(rejectedProducts, name)
} else {
fmt.Printf("%s: Successfully added - $%.2f (Stock: %d)\n", name, price, quantity)
itemsAdded++
}
}
// Addition summary
fmt.Println("Addition Summary:")
fmt.Printf("Items processed: %d\n", itemsProcessed)
fmt.Printf("Items added: %d\n", itemsAdded)
fmt.Printf("Items rejected: %d\n", itemsRejected)
// Display updated inventory in alphabetical order
fmt.Println("Updated Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
totalProducts := 0
totalItems := 0
totalValue := 0.0
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
totalProducts++
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
// Final inventory statistics
fmt.Println("Final 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)
// List rejected products
if len(rejectedProducts) > 0 {
fmt.Printf("Rejected products: %s\n", strings.Join(rejectedProducts, ","))
} else {
fmt.Println("All new products were added 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