Menu
CoddyTech

Menambahkan Barang Baru

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

challenge icon

Tantangan

Mudah

Perluas sistem pengelolaan persediaanmu dengan menerapkan fungsi untuk menambahkan produk baru dengan aman. Tantangan ini melanjutkan sistem pemeriksaan stok sebelumnya dan menambahkan kemampuan untuk memperluas persediaanmu sekaligus mencegah entri duplikat melalui penanganan error yang tepat.

Kamu akan menerima dua input:

  • Sebuah string yang berisi data persediaan yang 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 produk baru untuk ditambahkan dalam format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (misalnya, "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Tugasmu adalah:

  1. Gunakan struct Product yang sama dari pelajaran sebelumnya dengan field Price (float64) dan Quantity (int)
  2. Parse 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 kuantitas
  4. Konversi string harga menjadi float64 dan string kuantitas menjadi int
  5. Buat dan isi map inventory dengan data produk yang sudah ada
  6. Buat fungsi bernama addNewItem yang menerima map inventory, nama produk, harga, dan kuantitas sebagai parameter, lalu mengembalikan error:
    • Jika produk sudah ada di inventory, kembalikan error dengan pesan "product already exists: [product_name]"
    • Jika produk belum ada, tambahkan produk itu ke inventory dan kembalikan nil
  7. Parse input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan list produk baru yang akan ditambahkan
  8. Untuk setiap entri produk baru, pisahkan berdasarkan titik dua untuk mendapatkan nama produk, harga, dan kuantitas
  9. Konversi string harga menjadi float64 dan string kuantitas menjadi int
  10. Tampilkan header proses penambahan: "Adding New Items:"
  11. Untuk setiap produk baru, panggil fungsi addNewItem dan tampilkan hasilnya:
    • Jika tidak ada error: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Jika terjadi error: "[product_name]: Failed to add - [error_message]"
  12. Hitung dan tampilkan statistik penambahan:
    • "Addition Summary:"
    • "Items processed: [total_number_of_items_processed]"
    • "Items added: [number_of_items_successfully_added]"
    • "Items rejected: [number_of_items_that_failed_to_add]"
  13. Tampilkan persediaan 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 persediaan:
    • "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 produk yang ditolak:
    • Jika ada produk yang ditolak: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Jika tidak ada produk yang ditolak: "All new products were added successfully"

Gunakan package strings untuk memisahkan string input, package strconv untuk mengonversi 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 persediaan hingga 2 angka desimal. Tantangan ini menunjukkan cara memperluas kumpulan data dengan aman sekaligus mencegah entri duplikat melalui penanganan error dan validasi yang tepat.

Coba sendiri

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

type Product struct {
	Price    float64
	Quantity int
}

func checkStock(inventory map[string]Product, productName string) (int, error) {
	product, exists := inventory[productName]
	if !exists {
		return 0, errors.New("product not found: " + productName)
	}
	return product.Quantity, nil
}

func main() {
	var inventoryData string
	var checkRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&checkRequests)

	inventory := make(map[string]Product)

	// Parse inventory data
	productEntries := strings.Split(inventoryData, ",")
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		inventory[name] = Product{Price: price, Quantity: quantity}
	}

	// Parse check requests
	productsToCheck := strings.Split(checkRequests, ",")

	fmt.Println("Stock Check Results:")

	var productsFound int
	var productsNotFound int
	var totalStock int
	var missingProducts []string

	for _, productName := range productsToCheck {
		quantity, err := checkStock(inventory, productName)
		if err != nil {
			fmt.Printf("%s: Error - %s\n", productName, err.Error())
			productsNotFound++
			missingProducts = append(missingProducts, productName)
		} else {
			fmt.Printf("%s: %d units in stock\n", productName, quantity)
			productsFound++
			totalStock += quantity
		}
	}

	fmt.Println("Check Summary:")
	fmt.Printf("Products checked: %d\n", len(productsToCheck))
	fmt.Printf("Products found: %d\n", productsFound)
	fmt.Printf("Products not found: %d\n", productsNotFound)
	fmt.Printf("Total stock for found products: %d units\n", totalStock)

	if len(missingProducts) > 0 {
		fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
	} else {
		fmt.Println("All requested products are available")
	}
}

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online