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.
Görev
KolayKapsamlı 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:
- Önceki derslerdeki
Price(float64) veQuantity(int) alanlarına sahip aynıProductyapısını kullanın - Bireysel mevcut ürün girişlerini elde etmek için ilk girdiyi virgüllere göre ayırarak ayrıştırın
- 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
- Fiyat dizesini float64'e ve miktar dizesini int'e dönüştürün
- Mevcut ürün verileriyle
inventoryharitasını oluşturun ve doldurun - Parametre olarak envanter haritasını, ürün adını ve miktar değişikliğini alan ve bir hata döndüren
updateStockadlı 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
- Ürün envanterde yoksa,
- Stok güncelleme taleplerinin listesini almak için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
- 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
- Miktar değişikliği dizesini int'e dönüştürün
- Güncelleme süreci başlığını görüntüleyin:
"Processing Stock Updates:" - Her güncelleme talebi için
updateStockfonksiyonunu ç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]"
- Hata yoksa ve değişiklik pozitifse:
- 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]"
- 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])"
- 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]"
- 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"
- Başarısız güncellemeler varsa:
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
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı8Proje: Basit Envanter
Projeye Genel BakışStok Kontrolü3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar