Menu
CoddyTech

Memperbarui Jumlah Stok

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

challenge icon

Tantangan

Mudah

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

  1. Gunakan struct Product yang sama dari pelajaran sebelumnya, dengan field Price (float64) dan Quantity (int)
  2. Uraikan input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan setiap entri produk yang sudah ada
  3. Untuk setiap entri produk yang sudah ada, pisahkan berdasarkan titik dua untuk mendapatkan nama produk, harga, dan jumlah
  4. Ubah string harga menjadi float64 dan string jumlah menjadi int
  5. Buat dan isi map inventory dengan data produk yang sudah ada
  6. Buat fungsi bernama updateStock yang 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
  7. Uraikan input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan daftar permintaan pembaruan stok
  8. Untuk setiap permintaan pembaruan, pisahkan berdasarkan titik dua untuk mendapatkan nama produk dan perubahan jumlah
  9. Ubah string perubahan jumlah menjadi int
  10. Tampilkan header proses pembaruan: "Processing Stock Updates:"
  11. Untuk setiap permintaan pembaruan, panggil fungsi updateStock dan 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]"
  12. 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]"
  13. Tampilkan inventaris yang sudah diperbarui dalam urutan alfabet berdasarkan nama produk:
    • "Updated Inventory:"
    • Untuk setiap produk: "- [product_name]: $[price] (Stock: [quantity])"
  14. 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]"
  15. 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"

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

Latihan sendiri: Compiler Go online