Menu
Coddy logo textTech

Rapor Oluşturma

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 49 / 68.

challenge icon

Görev

Kolay

Mevcut envanteriniz hakkında ayrıntılı bilgiler sağlayan kapsamlı bir raporlama işlevi uygulayarak envanter yönetim sisteminizi tamamlayın. Bu zorluk, önceki tüm işlevlerin üzerine inşa edilir ve istatistikler, kategorizasyon ve analiz içeren biçimlendirilmiş raporlar oluşturma yeteneği ekler.

İki girdi alacaksınız:

  • "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" formatında mevcut envanter verilerini içeren bir dize (örneğin, "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • "report_type,threshold_value" formatında rapor yapılandırmasını içeren bir dize; burada report_type "full", "low_stock" veya "high_value" olabilir ve threshold_value bir sayıdır (örneğin, "low_stock,10")

Göreviniz şunları yapmaktır:

  1. Önceki derslerdeki Price (float64) ve Quantity (int) alanlarına sahip aynı Product struct yapısını kullanın
  2. İlk girdiyi virgüllere göre ayırarak tek tek mevcut ürün girişlerini elde edin
  3. Her bir mevcut ürün girişi için, ürün adını, fiyatını ve miktarını elde etmek üzere iki nokta üst üste işaretine göre ayırın
  4. Fiyat dizesini float64'e ve miktar dizesini int'e dönüştürün
  5. Mevcut ürün verileriyle inventory map'ini oluşturun ve doldurun
  6. Parametre olarak inventory map'ini, rapor türünü ve eşik değerini alan generateReport adlı bir fonksiyon oluşturun
  7. İkinci girdiyi virgüllere göre ayırarak rapor türünü ve eşik değerini elde edin
  8. Eşik değeri dizesini float64'e dönüştürün
  9. Rapor türüne göre rapor başlığını görüntüleyin:
    • "full" için: "=== FULL INVENTORY REPORT ==="
    • "low_stock" için: "=== LOW STOCK REPORT ==="
    • "high_value" için: "=== HIGH VALUE REPORT ==="
  10. Genel envanter istatistiklerini görüntüleyin:
    • "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. Rapor türüne göre ürünleri filtreleyin ve görüntüleyin:
    • "full" için: Tüm ürünleri göster
    • "low_stock" için: Sadece miktarı eşik değerine eşit veya daha az olan ürünleri göster
    • "high_value" için: Sadece toplam değeri (fiyat × miktar) eşik değerine eşit veya daha büyük olan ürünleri göster
  12. Filtrelenmiş ürünler bölümünü görüntüleyin:
    • "full" için: "All Products:"
    • "low_stock" için: "Products with stock ≤ [threshold_value]:"
    • "high_value" için: "Products with value ≥ $[threshold_value]:"
  13. Her bir filtrelenmiş ürün için (ürün adına göre alfabetik sırayla):
    • "- [product_name]: $[price] × [quantity] = $[total_value]"
  14. Filtrelenmiş istatistikleri görüntüleyin:
    • "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. En pahalı ve en ucuz ürünleri bulun ve görüntüleyin:
    • "Price Analysis:"
    • "Most expensive: [product_name] at $[price]"
    • "Least expensive: [product_name] at $[price]"
  16. En yüksek ve en düşük stoklu ürünleri bulun ve görüntüleyin:
    • "Stock Analysis:"
    • "Highest stock: [product_name] with [quantity] units"
    • "Lowest stock: [product_name] with [quantity] units"
  17. Envanter sağlığı değerlendirmesini görüntüleyin:
    • Miktarı ≤ 5 olan ürünleri sayın: "Low stock items (≤5): [count]"
    • Miktarı > 20 olan ürünleri sayın: "High stock items (>20): [count]"
    • Değeri ≥ $500 olan ürünleri sayın: "High value items (≥$500): [count]"
  18. Rapor tamamlanmasını görüntüleyin:
    • "Report generated successfully"
    • "Threshold applied: [threshold_value]"

Girdi dizelerini ayırmak için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, biçimlendirilmiş çıktı için fmt paketini ve ürün adlarını alfabetik olarak sıralamak için sort paketini kullanın. Tüm fiyatları ve değerleri 2 ondalık basamak olacak şekilde biçimlendirin. En pahalı/en ucuz veya en yüksek/en düşük stoğu bulurken, eşitlik durumunda alfabetik olarak ilk gelen ürün adını kullanın. Bu zorluk, veri analizi ve biçimlendirilmiş sunum yoluyla değerli iş içgörüleri sağlayan kapsamlı raporlama sistemlerinin nasıl oluşturulacağını gösterir.

Kendin dene

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")
	}
}

Mantık ve Akış bölümündeki tüm dersler