Menu
Coddy logo textTech

Stok Miktarını Güncelleme

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

challenge icon

Görev

Kolay

Kapsamlı doğrulama ve hata yönetimi ile stok miktarı güncellemelerini uygulayarak envanter yönetim sisteminizi geliştirin. Bu zorluk, önceki işlevselliğin üzerine inşa edilmiştir ve negatif stok seviyelerine yol açabilecek geçersiz işlemleri önlerken mevcut ürün miktarlarını değiştirme 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")
  • Değişikliklerin pozitif veya negatif tam sayılar olabileceği "product1:change1,product2:change2,product3:change3" formatında stok güncelleme taleplerini içeren bir dize (örneğin, "Mouse:10,Tablet:-5,Keyboard:-3")

Göreviniz şunları yapmaktır:

  1. Önceki derslerdeki Price (float64) ve Quantity (int) alanlarına sahip aynı Product yapısını kullanın
  2. Bireysel mevcut ürün girişlerini elde etmek için ilk girdiyi virgüllere göre ayırarak ayrıştırın
  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 haritasını oluşturun ve doldurun
  6. Parametre olarak envanter haritasını, ürün adını ve miktar değişikliğini alan ve bir hata döndüren updateStock adlı bir fonksiyon oluşturun:
    • Ürün envanterde yoksa, "product not found: [product_name]" mesajıyla bir hata döndürün
    • Miktar değişikliği negatif bir stokla sonuçlanacaksa (mevcut miktar + değişiklik < 0), "insufficient stock: cannot reduce [product_name] by [absolute_change_value], only [current_quantity] available" mesajıyla bir hata döndürün
    • Güncelleme geçerliyse, envanterdeki ürünün miktarını değiştirin ve nil döndürün
  7. Stok güncelleme taleplerinin listesini almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
  8. Her güncelleme talebi için, ürün adını ve miktar değişikliğini elde etmek üzere iki nokta üst üste işaretine göre ayırın
  9. Miktar değişikliği dizesini int'e dönüştürün
  10. Güncelleme süreci başlığını görüntüleyin: "Processing Stock Updates:"
  11. Her güncelleme talebi için updateStock fonksiyonunu çağırın ve sonuçları görüntüleyin:
    • Hata yoksa ve değişiklik pozitifse: "[product_name]: Added [change] units - New stock: [new_quantity]"
    • Hata yoksa ve değişiklik negatifse: "[product_name]: Removed [absolute_change_value] units - New stock: [new_quantity]"
    • Hata yoksa ve değişiklik sıfırsa: "[product_name]: No change - Current stock: [current_quantity]"
    • Hata varsa: "[product_name]: Update failed - [error_message]"
  12. Güncelleme istatistiklerini sayın ve görüntüleyin:
    • "Update Summary:"
    • "Updates processed: [total_number_of_updates_processed]"
    • "Updates successful: [number_of_successful_updates]"
    • "Updates failed: [number_of_failed_updates]"
  13. Güncellenmiş envanteri ürün adına göre alfabetik sırayla görüntüleyin:
    • "Updated Inventory:"
    • Her ürün için: "- [product_name]: $[price] (Stock: [quantity])"
  14. Final envanter istatistiklerini hesaplayın ve görüntüleyin:
    • "Final Inventory Statistics:"
    • "Total Products: [total_number_of_products_in_inventory]"
    • "Total Items in Stock: [sum_of_all_quantities]"
    • "Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
  15. Başarısız olan güncellemeleri listeleyin:
    • Başarısız güncellemeler varsa: "Failed updates: [comma_separated_list_of_failed_product_names]"
    • Başarısız güncelleme yoksa: "All stock updates were processed successfully"

Girdi dizelerini ayırmak için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, hata mesajları oluşturmak için errors paketini, formatlı çıktı için fmt paketini ve ürün adlarını alfabetik olarak sıralamak için sort paketini kullanın. Tüm fiyatları ve toplam envanter değerini virgülden sonra 2 basamak olacak şekilde formatlayın. Bu zorluk, kapsamlı doğrulama ve hata yönetimi yoluyla geçersiz işlemleri önlerken mevcut verilerin nasıl güvenli bir şekilde değiştirileceğini gösterir.

Kendin dene

package main

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

type Product struct {
	Price    float64
	Quantity int
}

func addNewItem(inventory map[string]Product, productName string, price float64, quantity int) error {
	if _, exists := inventory[productName]; exists {
		return errors.New("product already exists: " + productName)
	}
	inventory[productName] = Product{Price: price, Quantity: quantity}
	return nil
}

func main() {
	var existingInventory string
	var newProducts string
	fmt.Scanln(&existingInventory)
	fmt.Scanln(&newProducts)

	inventory := make(map[string]Product)

	// Parse existing inventory
	existingItems := strings.Split(existingInventory, ",")
	for _, item := range existingItems {
		parts := strings.Split(item, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		inventory[name] = Product{Price: price, Quantity: quantity}
	}

	// Parse new products to add
	newItems := strings.Split(newProducts, ",")
	
	fmt.Println("Adding New Items:")
	
	itemsProcessed := 0
	itemsAdded := 0
	itemsRejected := 0
	var rejectedProducts []string

	for _, item := range newItems {
		parts := strings.Split(item, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		
		itemsProcessed++
		
		err := addNewItem(inventory, name, price, quantity)
		if err != nil {
			fmt.Printf("%s: Failed to add - %s\n", name, err.Error())
			itemsRejected++
			rejectedProducts = append(rejectedProducts, name)
		} else {
			fmt.Printf("%s: Successfully added - $%.2f (Stock: %d)\n", name, price, quantity)
			itemsAdded++
		}
	}

	// Addition summary
	fmt.Println("Addition Summary:")
	fmt.Printf("Items processed: %d\n", itemsProcessed)
	fmt.Printf("Items added: %d\n", itemsAdded)
	fmt.Printf("Items rejected: %d\n", itemsRejected)

	// Display updated inventory in alphabetical order
	fmt.Println("Updated Inventory:")
	var productNames []string
	for name := range inventory {
		productNames = append(productNames, name)
	}
	sort.Strings(productNames)

	totalProducts := 0
	totalItems := 0
	totalValue := 0.0

	for _, name := range productNames {
		product := inventory[name]
		fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
		totalProducts++
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}

	// Final inventory statistics
	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 rejected products
	if len(rejectedProducts) > 0 {
		fmt.Printf("Rejected products: %s\n", strings.Join(rejectedProducts, ","))
	} else {
		fmt.Println("All new products were added successfully")
	}
}

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