Membuat Laporan
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 49 dari 68.
Tantangan
MudahLengkapi 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:
- Gunakan struct
Productyang sama dari pelajaran sebelumnya dengan fieldPrice(float64) danQuantity(int) - Parse 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 kuantitas
- Ubah string harga menjadi float64 dan string kuantitas menjadi int
- Buat dan isi map
inventorydengan data produk yang sudah ada - Buat fungsi bernama
generateReportyang menerima map inventory, tipe laporan, dan nilai ambang batas sebagai parameter - Parse input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan tipe laporan dan nilai ambang batas
- Ubah string nilai ambang batas menjadi float64
- Tampilkan header laporan berdasarkan tipe laporan:
- Untuk
"full":"=== FULL INVENTORY REPORT ===" - Untuk
"low_stock":"=== LOW STOCK REPORT ===" - Untuk
"high_value":"=== HIGH VALUE REPORT ==="
- Untuk
- 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]"
- 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
- Untuk
- 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]:"
- Untuk
- Untuk setiap produk yang sudah difilter (berdasarkan urutan abjad nama produk):
"- [product_name]: $[price] × [quantity] = $[total_value]"
- 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]"
- Cari dan tampilkan produk paling mahal dan paling murah:
"Price Analysis:""Most expensive: [product_name] at $[price]""Least expensive: [product_name] at $[price]"
- 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"
- 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]"
- Hitung produk dengan kuantitas ≤ 5:
- 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
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