Menu
CoddyTech

Membuat Laporan

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

challenge icon

Tantangan

Mudah

Lengkapi sistem manajemen inventarismu dengan menerapkan fungsi pelaporan komprehensif yang memberikan wawasan terperinci tentang inventarismu saat ini. Tantangan ini mengembangkan semua fungsionalitas sebelumnya dan menambahkan kemampuan untuk membuat laporan berformat dengan statistik, kategorisasi, dan analisis.

Kamu akan menerima dua input:

  • 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")
  • String yang berisi konfigurasi laporan dalam format "report_type,threshold_value", dengan report_type dapat berupa "full", "low_stock", atau "high_value", dan threshold_value adalah angka (misalnya, "low_stock,10")

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. Ubah 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 generateReport yang menerima map inventory, tipe laporan, dan nilai ambang batas sebagai parameter
  7. Parse input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan tipe laporan dan nilai ambang batas
  8. Ubah string nilai ambang batas menjadi float64
  9. Tampilkan header laporan berdasarkan tipe laporan:
    • Untuk "full": "=== FULL INVENTORY REPORT ==="
    • Untuk "low_stock": "=== LOW STOCK REPORT ==="
    • Untuk "high_value": "=== HIGH VALUE REPORT ==="
  10. Tampilkan statistik umum inventaris:
    • "Total Products: [total_number_of_products]"
    • "Total Items in Stock: [sum_of_all_quantities]"
    • "Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
    • "Average Product Price: $[total_inventory_value_divided_by_total_items]"
  11. Filter dan tampilkan produk berdasarkan tipe laporan:
    • Untuk "full": Tampilkan semua produk
    • Untuk "low_stock": Tampilkan hanya produk dengan kuantitas kurang dari atau sama dengan nilai ambang batas
    • Untuk "high_value": Tampilkan hanya produk dengan nilai total (harga × kuantitas) lebih dari atau sama dengan nilai ambang batas
  12. Tampilkan bagian produk yang sudah difilter:
    • Untuk "full": "All Products:"
    • Untuk "low_stock": "Products with stock ≤ [threshold_value]:"
    • Untuk "high_value": "Products with value ≥ $[threshold_value]:"
  13. Untuk setiap produk yang sudah difilter (berdasarkan urutan abjad nama produk):
    • "- [product_name]: $[price] × [quantity] = $[total_value]"
  14. Tampilkan statistik hasil filter:
    • "Filtered Results:"
    • "Products shown: [number_of_products_in_filtered_results]"
    • "Items in filtered products: [sum_of_quantities_for_filtered_products]"
    • "Value of filtered products: $[sum_of_values_for_filtered_products]"
  15. Cari dan tampilkan produk paling mahal dan paling murah:
    • "Price Analysis:"
    • "Most expensive: [product_name] at $[price]"
    • "Least expensive: [product_name] at $[price]"
  16. Cari dan tampilkan produk dengan stok tertinggi dan terendah:
    • "Stock Analysis:"
    • "Highest stock: [product_name] with [quantity] units"
    • "Lowest stock: [product_name] with [quantity] units"
  17. Tampilkan penilaian kondisi inventaris:
    • Hitung produk dengan kuantitas ≤ 5: "Low stock items (≤5): [count]"
    • Hitung produk dengan kuantitas > 20: "High stock items (>20): [count]"
    • Hitung produk dengan nilai ≥ $500: "High value items (≥$500): [count]"
  18. Tampilkan penyelesaian laporan:
    • "Report generated successfully"
    • "Threshold applied: [threshold_value]"

Gunakan package strings untuk memisahkan string input, package strconv untuk mengubah string menjadi angka, package fmt untuk output berformat, dan package sort untuk mengurutkan nama produk berdasarkan abjad. Format semua harga dan nilai hingga 2 angka desimal. Saat mencari produk paling mahal atau paling murah, serta produk dengan stok tertinggi atau terendah, jika ada nilai yang sama, gunakan nama produk yang lebih dahulu secara alfabetis. Tantangan ini menunjukkan cara membuat sistem pelaporan komprehensif yang memberikan wawasan bisnis berharga melalui analisis data dan penyajian berformat.

Coba sendiri

package main

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

type Product struct {
	Price    float64
	Quantity int
}

func updateStock(inventory map[string]Product, productName string, change int) error {
	product, exists := inventory[productName]
	if !exists {
		return errors.New("product not found: " + productName)
	}
	
	newQuantity := product.Quantity + change
	if newQuantity < 0 {
		return fmt.Errorf("insufficient stock: cannot reduce %s by %d, only %d available", productName, -change, product.Quantity)
	}
	
	product.Quantity = newQuantity
	inventory[productName] = product
	return nil
}

func main() {
	var inventoryData string
	var updateRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&updateRequests)
	
	// Parse existing inventory
	inventory := make(map[string]Product)
	inventoryEntries := strings.Split(inventoryData, ",")
	
	for _, entry := range inventoryEntries {
		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 update requests
	updateEntries := strings.Split(updateRequests, ",")
	
	fmt.Println("Processing Stock Updates:")
	
	totalUpdates := len(updateEntries)
	successfulUpdates := 0
	failedUpdates := 0
	var failedProducts []string
	
	for _, update := range updateEntries {
		parts := strings.Split(update, ":")
		productName := parts[0]
		change, _ := strconv.Atoi(parts[1])
		
		err := updateStock(inventory, productName, change)
		if err != nil {
			fmt.Printf("%s: Update failed - %s\n", productName, err.Error())
			failedUpdates++
			failedProducts = append(failedProducts, productName)
		} else {
			newQuantity := inventory[productName].Quantity
			if change > 0 {
				fmt.Printf("%s: Added %d units - New stock: %d\n", productName, change, newQuantity)
			} else if change < 0 {
				fmt.Printf("%s: Removed %d units - New stock: %d\n", productName, -change, newQuantity)
			} else {
				fmt.Printf("%s: No change - Current stock: %d\n", productName, newQuantity)
			}
			successfulUpdates++
		}
	}
	
	// Update summary
	fmt.Println("Update Summary:")
	fmt.Printf("Updates processed: %d\n", totalUpdates)
	fmt.Printf("Updates successful: %d\n", successfulUpdates)
	fmt.Printf("Updates failed: %d\n", failedUpdates)
	
	// Display updated inventory in alphabetical order
	fmt.Println("Updated 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)
	}
	
	// Calculate final statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	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 failed updates
	if len(failedProducts) > 0 {
		fmt.Printf("Failed updates: %s\n", strings.Join(failedProducts, ","))
	} else {
		fmt.Println("All stock updates were processed successfully")
	}
}

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online