Menu
Coddy logo textTech

Hepsini Bir Araya Getirme

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

challenge icon

Görev

Kolay

Önceki derslerde oluşturduğunuz tüm işlevleri bir araya getiren kapsamlı bir ana program oluşturarak envanter yönetim sisteminizi tamamlayın. Bu son görev; envanter başlatma, stok kontrolü, ürün ekleme, stok güncellemeleri ve rapor oluşturmayı, menü tabanlı gezinmeye sahip eksiksiz bir komut satırı arayüzünde bir araya getirir.

Üç girdi alacaksınız:

  • "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" biçiminde başlangıç envanteri verilerini içeren bir dize (ör. "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • "operation1,operation2,operation3" biçiminde menü işlemleri dizisini içeren bir dize; işlemler "check", "add", "update", "report" veya "exit" olabilir (ör. "check,add,update,report,exit")
  • Her parametrenin aynı konumdaki işleme karşılık geldiği, "param1|param2|param3" biçiminde işlem parametrelerini içeren bir dize (ör. "Mouse|Monitor:299.99:10|Laptop:5|full,10")

Göreviniz:

  1. Önceki derslerdeki Product struct'ını, Price (float64) ve Quantity (int) alanlarıyla birlikte kullanmak
  2. İlk girdiyi ayrıştırmak ve mevcut ürün verileriyle envanter map'ini başlatmak
  3. Sistem başlangıç mesajını görüntülemek:
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. Gerçekleştirilecek işlemler dizisini elde etmek için ikinci girdiyi ayrıştırmak
  5. Her işlem için parametreleri elde etmek üzere üçüncü girdiyi ayrıştırmak
  6. Dizideki her işlem için işlem başlığını görüntülemek ve ilgili eylemi gerçekleştirmek:
    • "check" için: "--- STOCK CHECK ---" görüntülemek ve belirtilen ürünün stokunu kontrol etmek
    • "add" için: "--- ADD ITEM ---" görüntülemek ve belirtilen ürünü eklemek
    • "update" için: "--- UPDATE STOCK ---" görüntülemek ve belirtilen ürünün stokunu güncellemek
    • "report" için: "--- GENERATE REPORT ---" görüntülemek ve belirtilen raporu oluşturmak
    • "exit" için: "--- SYSTEM EXIT ---" görüntülemek ve çıkış bilgilerini göstermek
  7. Önceki derslerdeki gibi miktar ve hata döndüren checkStock işlevini uygulamak
  8. Önceki derslerdeki gibi ürün ekleyen ve hata döndüren addNewItem işlevini uygulamak
  9. Önceki derslerdeki gibi miktarları güncelleyen ve hata döndüren updateStock işlevini uygulamak
  10. Önceki derslerdeki gibi raporlar oluşturan generateReport işlevini uygulamak
  11. "check" işlemi için:
    • Parametreyi kontrol edilecek ürün adı olarak kullanmak
    • Şunu görüntülemek: "Checking stock for: [product_name]"
    • Bulunursa: "Stock level: [quantity] units"
    • Bulunamazsa: "Product not found in inventory"
  12. "add" işlemi için:
    • Parametreyi "product_name:price:quantity" biçiminde ayrıştırmak
    • Şunu görüntülemek: "Adding new product: [product_name]"
    • Başarılı olursa: "Product added successfully"
    • Başarısız olursa: "Failed to add product: [error_message]"
  13. "update" işlemi için:
    • Parametreyi "product_name:change" biçiminde ayrıştırmak
    • Şunu görüntülemek: "Updating stock for: [product_name]"
    • Başarılı olursa ve değişiklik pozitifse: "Added [change] units. New stock: [new_quantity]"
    • Başarılı olursa ve değişiklik negatifse: "Removed [absolute_change] units. New stock: [new_quantity]"
    • Başarısız olursa: "Update failed: [error_message]"
  14. "report" işlemi için:
    • Parametreyi "report_type,threshold" biçiminde ayrıştırmak
    • Şunu görüntülemek: "Generating [report_type] report with threshold [threshold]"
    • Önceki derslerdeki gibi raporu oluşturmak ve tamamını görüntülemek
  15. "exit" işlemi için:
    • Son envanter istatistiklerini görüntülemek:
      • "Final inventory status:"
      • "Total products: [total_products]"
      • "Total items: [total_items]"
      • "Total value: $[total_value]"
    • Şunu görüntülemek: "Session completed successfully"
    • Şunu görüntülemek: "Thank you for using the Inventory Management System"
  16. Çıkış işlemi dışındaki her işlemden sonra şunu görüntülemek: "Operation completed. Continuing to next operation..."

Girdi dizelerini bölmek için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, hata yönetimi için errors paketini, biçimlendirilmiş çıktı için fmt paketini ve alfabetik sıralama için sort paketini kullanın. Tüm fiyatları ve değerleri 2 ondalık basamakla biçimlendirin. Bu görev, birden çok işlevsel bileşeni uygun hata yönetimi ve durum yönetimiyle uyumlu bir kullanıcı deneyiminde birleştiren eksiksiz bir etkileşimli sistemin nasıl oluşturulacağını gösterir.

Kendin dene

package main

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

type Product struct {
	Price    float64
	Quantity int
}

func generateReport(inventory map[string]Product, reportType string, threshold float64) {
	// Display report header
	switch reportType {
	case "full":
		fmt.Println("=== FULL INVENTORY REPORT ===")
	case "low_stock":
		fmt.Println("=== LOW STOCK REPORT ===")
	case "high_value":
		fmt.Println("=== HIGH VALUE REPORT ===")
	}

	// Calculate general statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	averagePrice := totalValue / float64(totalItems)

	// Display general 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)
	fmt.Printf("Average Product Price: $%.2f\n", averagePrice)

	// Filter products based on report type
	var filteredProducts []string
	for name, product := range inventory {
		switch reportType {
		case "full":
			filteredProducts = append(filteredProducts, name)
		case "low_stock":
			if product.Quantity <= int(threshold) {
				filteredProducts = append(filteredProducts, name)
			}
		case "high_value":
			productValue := product.Price * float64(product.Quantity)
			if productValue >= threshold {
				filteredProducts = append(filteredProducts, name)
			}
		}
	}

	// Sort filtered products alphabetically
	sort.Strings(filteredProducts)

	// Display filtered products section header
	switch reportType {
	case "full":
		fmt.Println("All Products:")
	case "low_stock":
		fmt.Printf("Products with stock ≤ %.0f:\n", threshold)
	case "high_value":
		fmt.Printf("Products with value ≥ $%.2f:\n", threshold)
	}

	// Display filtered products
	filteredItems := 0
	filteredValue := 0.0
	for _, name := range filteredProducts {
		product := inventory[name]
		productValue := product.Price * float64(product.Quantity)
		fmt.Printf("- %s: $%.2f × %d = $%.2f\n", name, product.Price, product.Quantity, productValue)
		filteredItems += product.Quantity
		filteredValue += productValue
	}

	// Display filtered statistics
	fmt.Println("Filtered Results:")
	fmt.Printf("Products shown: %d\n", len(filteredProducts))
	fmt.Printf("Items in filtered products: %d\n", filteredItems)
	fmt.Printf("Value of filtered products: $%.2f\n", filteredValue)

	// Find most and least expensive products
	var mostExpensiveName, leastExpensiveName string
	var mostExpensivePrice, leastExpensivePrice float64
	first := true
	
	var sortedNames []string
	for name := range inventory {
		sortedNames = append(sortedNames, name)
	}
	sort.Strings(sortedNames)
	
	for _, name := range sortedNames {
		product := inventory[name]
		if first {
			mostExpensiveName = name
			mostExpensivePrice = product.Price
			leastExpensiveName = name
			leastExpensivePrice = product.Price
			first = false
		} else {
			if product.Price > mostExpensivePrice {
				mostExpensiveName = name
				mostExpensivePrice = product.Price
			}
			if product.Price < leastExpensivePrice {
				leastExpensiveName = name
				leastExpensivePrice = product.Price
			}
		}
	}

	fmt.Println("Price Analysis:")
	fmt.Printf("Most expensive: %s at $%.2f\n", mostExpensiveName, mostExpensivePrice)
	fmt.Printf("Least expensive: %s at $%.2f\n", leastExpensiveName, leastExpensivePrice)

	// Find highest and lowest stock products
	var highestStockName, lowestStockName string
	var highestStock, lowestStock int
	first = true
	
	for _, name := range sortedNames {
		product := inventory[name]
		if first {
			highestStockName = name
			highestStock = product.Quantity
			lowestStockName = name
			lowestStock = product.Quantity
			first = false
		} else {
			if product.Quantity > highestStock {
				highestStockName = name
				highestStock = product.Quantity
			}
			if product.Quantity < lowestStock {
				lowestStockName = name
				lowestStock = product.Quantity
			}
		}
	}

	fmt.Println("Stock Analysis:")
	fmt.Printf("Highest stock: %s with %d units\n", highestStockName, highestStock)
	fmt.Printf("Lowest stock: %s with %d units\n", lowestStockName, lowestStock)

	// Inventory health assessment
	lowStockCount := 0
	highStockCount := 0
	highValueCount := 0
	
	for _, product := range inventory {
		if product.Quantity <= 5 {
			lowStockCount++
		}
		if product.Quantity > 20 {
			highStockCount++
		}
		productValue := product.Price * float64(product.Quantity)
		if productValue >= 500.0 {
			highValueCount++
		}
	}

	fmt.Printf("Low stock items (≤5): %d\n", lowStockCount)
	fmt.Printf("High stock items (>20): %d\n", highStockCount)
	fmt.Printf("High value items (≥$500): %d\n", highValueCount)

	// Report completion
	fmt.Println("Report generated successfully")
	fmt.Printf("Threshold applied: %.2f\n", threshold)
}

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

	// Parse inventory data
	inventory := make(map[string]Product)
	if inventoryData != "" {
		products := strings.Split(inventoryData, ",")
		for _, productStr := range products {
			parts := strings.Split(productStr, ":")
			name := parts[0]
			price, _ := strconv.ParseFloat(parts[1], 64)
			quantity, _ := strconv.Atoi(parts[2])
			inventory[name] = Product{Price: price, Quantity: quantity}
		}
	}

	// Parse report configuration
	configParts := strings.Split(reportConfig, ",")
	reportType := configParts[0]
	threshold, _ := strconv.ParseFloat(configParts[1], 64)

	// Generate report
	generateReport(inventory, reportType, threshold)
}

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

Kendi başına pratik yap: Online Go derleyicisi