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 işleme uygulayarak stok miktarı güncellemeleri ekleyin ve envanter yönetim sisteminizi geliştirin. Bu görev, önceki işlevlerin üzerine kuruludur ve negatif stok seviyelerine yol açabilecek geçersiz işlemleri önlerken mevcut ürün miktarlarını değiştirme olanağı ekler.

İki girdi alacaksınız:

  • "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" biçiminde mevcut envanter verilerini içeren bir dize (ör. "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Değişikliklerin pozitif veya negatif tam sayılar olabildiği "product1:change1,product2:change2,product3:change3" biçiminde stok güncelleme isteklerini içeren bir dize (ör. "Mouse:10,Tablet:-5,Keyboard:-3")

Göreviniz:

  1. Önceki derslerdeki aynı Product struct'ını, Price (float64) ve Quantity (int) alanlarıyla kullanın
  2. Bireysel mevcut ürün kayıtlarını elde etmek için ilk girdiyi virgüllere göre bölerek ayrıştırın
  3. Her mevcut ürün kaydı için ürün adını, fiyatı ve miktarı elde etmek üzere iki noktaya göre bölün
  4. Fiyat dizesini float64'e, miktar dizesini int'e dönüştürün
  5. Mevcut ürün verileriyle inventory map'ini oluşturup doldurun
  6. Envanter map'ini, ürün adını ve miktar değişikliğini parametre olarak alan ve bir hata döndüren updateStock adlı bir işlev 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 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 ürünün envanterdeki miktarını değiştirin ve nil döndürün
  7. Stok güncelleme isteklerinin listesini elde etmek için ikinci girdiyi virgüllere göre bölerek ayrıştırın
  8. Her güncelleme isteği için ürün adını ve miktar değişikliğini elde etmek üzere iki noktaya göre bölün
  9. Miktar değişikliği dizesini int'e dönüştürün
  10. Güncelleme işlemi başlığını görüntüleyin: "Processing Stock Updates:"
  11. Her güncelleme isteği için updateStock işlevini ç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ırada görüntüleyin:
    • "Updated Inventory:"
    • Her ürün için: "- [product_name]: $[price] (Stock: [quantity])"
  14. Son 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 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 bölmek için strings paketini, dizeleri sayılara dönüştürmek için strconv paketini, hata mesajları oluşturmak için errors 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ı 2 ondalık basamakla ve toplam envanter değerini 2 ondalık basamakla biçimlendirin. Bu görev, kapsamlı doğrulama ve hata işleme yoluyla geçersiz işlemleri önlerken mevcut verilerin güvenli bir şekilde nasıl 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

Kendi başına pratik yap: Online Go derleyicisi