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 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:
- Önceki derslerdeki aynı
Productstruct'ını,Price(float64) veQuantity(int) alanlarıyla kullanın - Bireysel mevcut ürün kayıtlarını elde etmek için ilk girdiyi virgüllere göre bölerek ayrıştırın
- Her mevcut ürün kaydı için ürün adını, fiyatı ve miktarı elde etmek üzere iki noktaya göre bölün
- Fiyat dizesini float64'e, miktar dizesini int'e dönüştürün
- Mevcut ürün verileriyle
inventorymap'ini oluşturup doldurun - Envanter map'ini, ürün adını ve miktar değişikliğini parametre olarak alan ve bir hata döndüren
updateStockadlı 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
- Ürün envanterde yoksa
- Stok güncelleme isteklerinin listesini elde etmek için ikinci girdiyi virgüllere göre bölerek ayrıştırın
- 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
- Miktar değişikliği dizesini int'e dönüştürün
- Güncelleme işlemi başlığını görüntüleyin:
"Processing Stock Updates:" - Her güncelleme isteği için
updateStockiş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]"
- 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ırada görüntüleyin:
"Updated Inventory:"- Her ürün için:
"- [product_name]: $[price] (Stock: [quantity])"
- 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]"
- 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"
- Başarısız güncellemeler varsa:
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
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ışlarKendi başına pratik yap: Online Go derleyicisi