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 görev, önceki tüm işlevlerin üzerine kuruludur ve istatistikler, kategorilendirme 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" biçiminde 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" biçiminde 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:

  1. Önceki derslerdeki aynı Product struct'ını Price (float64) ve Quantity (int) alanlarıyla kullanın
  2. İlk girdiyi virgüllere göre bölerek mevcut ürün girişlerini elde edin
  3. Her mevcut ürün girişi için ürün adını, fiyatı ve miktarı elde etmek üzere iki nokta üst üste işaretlerine göre bölü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. Envanter map'ini, rapor türünü ve eşik değerini parametre olarak alan generateReport adlı bir işlev oluşturun
  7. İkinci girdiyi virgüllere göre bölerek 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österin
    • "low_stock" için: Yalnızca miktarı eşik değerine eşit veya bundan küçük olan ürünleri gösterin
    • "high_value" için: Yalnızca toplam değeri (fiyat × miktar) eşik değerine eşit veya bundan büyük olan ürünleri gösterin
  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 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. Stok miktarı en yüksek ve en düşük ü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ık 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. Raporun tamamlandığını görüntüleyin:
    • "Report generated successfully"
    • "Threshold applied: [threshold_value]"

Girdi dizelerini bölmek 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 basamakla biçimlendirin. En pahalı/en ucuz veya stok miktarı en yüksek/en düşük ürünleri bulurken eşitlik varsa alfabetik olarak ilk sıradaki ürün adını kullanın. Bu görev, 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

Kendi başına pratik yap: Online Go derleyicisi