Menu
Coddy logo textTech

Yeni Öğe Ekleme

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

challenge icon

Görev

Kolay

Yeni ürünleri güvenli bir şekilde ekleme işlevini uygulayarak envanter yönetim sisteminizi genişletin. Bu zorluk, önceki stok kontrol sistemi üzerine inşa edilmiştir ve uygun hata yönetimi yoluyla mükerrer girişleri önlerken envanterinizi genişletme 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")
  • "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" formatında eklenecek yeni ürünleri içeren bir dize (örneğin, "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

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. 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 map'ini oluşturun ve doldurun
  6. Parametre olarak envanter map'ini, ürün adını, fiyatını ve miktarını alan ve bir hata döndüren addNewItem adlı bir fonksiyon oluşturun:
    • Ürün envanterde zaten mevcutsa, "product already exists: [product_name]" mesajıyla bir hata döndürün
    • Ürün mevcut değilse, envantere ekleyin ve nil döndürün
  7. Eklenecek yeni ürünlerin listesini elde etmek için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
  8. Her yeni ü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
  9. Fiyat dizesini float64'e ve miktar dizesini int'e dönüştürün
  10. Ekleme işlemi başlığını görüntüleyin: "Adding New Items:"
  11. Her yeni ürün için addNewItem fonksiyonunu çağırın ve sonuçları görüntüleyin:
    • Hata yoksa: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Hata varsa: "[product_name]: Failed to add - [error_message]"
  12. Ekleme istatistiklerini sayın ve görüntüleyin:
    • "Addition Summary:"
    • "Items processed: [total_number_of_items_processed]"
    • "Items added: [number_of_items_successfully_added]"
    • "Items rejected: [number_of_items_that_failed_to_add]"
  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. Nihai 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. Reddedilen ürünleri listeleyin:
    • Reddedilen ürünler varsa: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Reddedilen ürün yoksa: "All new products were added 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ı 2 ondalık basamağa ve toplam envanter değerini 2 ondalık basamağa göre formatlayın. Bu zorluk, uygun hata yönetimi ve doğrulama yoluyla mükerrer girişleri önlerken veri koleksiyonlarının nasıl güvenli bir şekilde genişletileceğini gösterir.

Kendin dene

package main

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

type Product struct {
	Price    float64
	Quantity int
}

func checkStock(inventory map[string]Product, productName string) (int, error) {
	product, exists := inventory[productName]
	if !exists {
		return 0, errors.New("product not found: " + productName)
	}
	return product.Quantity, nil
}

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

	inventory := make(map[string]Product)

	// Parse inventory data
	productEntries := strings.Split(inventoryData, ",")
	for _, entry := range productEntries {
		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 check requests
	productsToCheck := strings.Split(checkRequests, ",")

	fmt.Println("Stock Check Results:")

	var productsFound int
	var productsNotFound int
	var totalStock int
	var missingProducts []string

	for _, productName := range productsToCheck {
		quantity, err := checkStock(inventory, productName)
		if err != nil {
			fmt.Printf("%s: Error - %s\n", productName, err.Error())
			productsNotFound++
			missingProducts = append(missingProducts, productName)
		} else {
			fmt.Printf("%s: %d units in stock\n", productName, quantity)
			productsFound++
			totalStock += quantity
		}
	}

	fmt.Println("Check Summary:")
	fmt.Printf("Products checked: %d\n", len(productsToCheck))
	fmt.Printf("Products found: %d\n", productsFound)
	fmt.Printf("Products not found: %d\n", productsNotFound)
	fmt.Printf("Total stock for found products: %d units\n", totalStock)

	if len(missingProducts) > 0 {
		fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
	} else {
		fmt.Println("All requested products are available")
	}
}

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