Yeni Öğe Ekleme
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 47 / 68.
Görev
KolayYeni ürünleri güvenli bir şekilde ekleme işlevini uygulayarak envanter yönetim sisteminizi genişletin. Bu görev, önceki stok kontrolü sistemini temel alır ve uygun hata işleme yoluyla yinelenen kayıtları önlerken envanterinizi genişletme 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")"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"biçiminde eklenecek yeni ürünleri içeren bir dize (ör."Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")
Göreviniz:
- Önceki derslerdeki aynı
Productyapısı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 nokta üst üste karakterlerine göre bölün
- Fiyat dizesini float64 türüne, miktar dizesini int türüne dönüştürün
- Mevcut ürün verileriyle
inventoryeşlemesini oluşturun ve doldurun - Envanter eşlemesini, ürün adını, fiyatı ve miktarı parametre olarak alan ve bir hata döndüren
addNewItemadlı bir işlev oluşturun:- Ürün envanterde zaten mevcutsa
"product already exists: [product_name]"mesajını içeren bir hata döndürün - Ürün mevcut değilse onu envantere ekleyin ve nil döndürün
- Ürün envanterde zaten mevcutsa
- Eklenecek yeni ürünlerin listesini elde etmek için ikinci girdiyi virgüllere göre bölerek ayrıştırın
- Her yeni ürün kaydı için ürün adını, fiyatı ve miktarı elde etmek üzere iki nokta üst üste karakterlerine göre bölün
- Fiyat dizesini float64 türüne, miktar dizesini int türüne dönüştürün
- Ekleme işlemi başlığını görüntüleyin:
"Adding New Items:" - Her yeni ürün için
addNewItemişlevini ç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]"
- Hata yoksa:
- 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]"
- 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])"
- 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]"
- 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"
- Reddedilen ürünler 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, toplam envanter değerini de 2 ondalık basamakla biçimlendirin. Bu görev, uygun hata işleme ve doğrulama yoluyla yinelenen kayıtları önlerken veri koleksiyonlarını güvenli bir şekilde genişletmeyi 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
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