Rapor Oluşturma
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 49 / 68.
Görev
KolayMevcut envanteriniz hakkında ayrıntılı bilgiler sağlayan kapsamlı bir raporlama işlevi uygulayarak envanter yönetim sisteminizi tamamlayın. Bu zorluk, önceki tüm işlevlerin üzerine inşa edilir ve istatistikler, kategorizasyon ve analiz içeren biçimlendirilmiş raporlar oluşturma 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")"report_type,threshold_value"formatında rapor yapılandırmasını içeren bir dize; burada report_type"full","low_stock"veya"high_value"olabilir ve threshold_value bir sayıdır (örneğin,"low_stock,10")
Göreviniz şunları yapmaktır:
- Önceki derslerdeki
Price(float64) veQuantity(int) alanlarına sahip aynıProductstruct yapısını kullanın - İlk girdiyi virgüllere göre ayırarak tek tek mevcut ürün girişlerini elde edin
- 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
inventorymap'ini oluşturun ve doldurun - Parametre olarak inventory map'ini, rapor türünü ve eşik değerini alan
generateReportadlı bir fonksiyon oluşturun - İkinci girdiyi virgüllere göre ayırarak rapor türünü ve eşik değerini elde edin
- Eşik değeri dizesini float64'e dönüştürün
- Rapor türüne göre rapor başlığını görüntüleyin:
"full"için:"=== FULL INVENTORY REPORT ===""low_stock"için:"=== LOW STOCK REPORT ===""high_value"için:"=== HIGH VALUE REPORT ==="
- Genel envanter istatistiklerini görüntüleyin:
"Total Products: [total_number_of_products]""Total Items in Stock: [sum_of_all_quantities]""Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]""Average Product Price: $[total_inventory_value_divided_by_total_items]"
- Rapor türüne göre ürünleri filtreleyin ve görüntüleyin:
"full"için: Tüm ürünleri göster"low_stock"için: Sadece miktarı eşik değerine eşit veya daha az olan ürünleri göster"high_value"için: Sadece toplam değeri (fiyat × miktar) eşik değerine eşit veya daha büyük olan ürünleri göster
- Filtrelenmiş ürünler bölümünü görüntüleyin:
"full"için:"All Products:""low_stock"için:"Products with stock ≤ [threshold_value]:""high_value"için:"Products with value ≥ $[threshold_value]:"
- Her bir filtrelenmiş ürün için (ürün adına göre alfabetik sırayla):
"- [product_name]: $[price] × [quantity] = $[total_value]"
- Filtrelenmiş istatistikleri görüntüleyin:
"Filtered Results:""Products shown: [number_of_products_in_filtered_results]""Items in filtered products: [sum_of_quantities_for_filtered_products]""Value of filtered products: $[sum_of_values_for_filtered_products]"
- En pahalı ve en ucuz ürünleri bulun ve görüntüleyin:
"Price Analysis:""Most expensive: [product_name] at $[price]""Least expensive: [product_name] at $[price]"
- En yüksek ve en düşük stoklu ürünleri bulun ve görüntüleyin:
"Stock Analysis:""Highest stock: [product_name] with [quantity] units""Lowest stock: [product_name] with [quantity] units"
- Envanter sağlığı değerlendirmesini görüntüleyin:
- Miktarı ≤ 5 olan ürünleri sayın:
"Low stock items (≤5): [count]" - Miktarı > 20 olan ürünleri sayın:
"High stock items (>20): [count]" - Değeri ≥ $500 olan ürünleri sayın:
"High value items (≥$500): [count]"
- Miktarı ≤ 5 olan ürünleri sayın:
- Rapor tamamlanmasını görüntüleyin:
"Report generated successfully""Threshold applied: [threshold_value]"
Girdi dizelerini ayırmak için strings paketini, dizeleri sayılara dönüştürmek için strconv 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ı ve değerleri 2 ondalık basamak olacak şekilde biçimlendirin. En pahalı/en ucuz veya en yüksek/en düşük stoğu bulurken, eşitlik durumunda alfabetik olarak ilk gelen ürün adını kullanın. Bu zorluk, veri analizi ve biçimlendirilmiş sunum yoluyla değerli iş içgörüleri sağlayan kapsamlı raporlama sistemlerinin nasıl oluşturulacağını gösterir.
Kendin dene
package main
import (
"errors"
"fmt"
"sort"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func updateStock(inventory map[string]Product, productName string, change int) error {
product, exists := inventory[productName]
if !exists {
return errors.New("product not found: " + productName)
}
newQuantity := product.Quantity + change
if newQuantity < 0 {
return fmt.Errorf("insufficient stock: cannot reduce %s by %d, only %d available", productName, -change, product.Quantity)
}
product.Quantity = newQuantity
inventory[productName] = product
return nil
}
func main() {
var inventoryData string
var updateRequests string
fmt.Scanln(&inventoryData)
fmt.Scanln(&updateRequests)
// Parse existing inventory
inventory := make(map[string]Product)
inventoryEntries := strings.Split(inventoryData, ",")
for _, entry := range inventoryEntries {
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 update requests
updateEntries := strings.Split(updateRequests, ",")
fmt.Println("Processing Stock Updates:")
totalUpdates := len(updateEntries)
successfulUpdates := 0
failedUpdates := 0
var failedProducts []string
for _, update := range updateEntries {
parts := strings.Split(update, ":")
productName := parts[0]
change, _ := strconv.Atoi(parts[1])
err := updateStock(inventory, productName, change)
if err != nil {
fmt.Printf("%s: Update failed - %s\n", productName, err.Error())
failedUpdates++
failedProducts = append(failedProducts, productName)
} else {
newQuantity := inventory[productName].Quantity
if change > 0 {
fmt.Printf("%s: Added %d units - New stock: %d\n", productName, change, newQuantity)
} else if change < 0 {
fmt.Printf("%s: Removed %d units - New stock: %d\n", productName, -change, newQuantity)
} else {
fmt.Printf("%s: No change - Current stock: %d\n", productName, newQuantity)
}
successfulUpdates++
}
}
// Update summary
fmt.Println("Update Summary:")
fmt.Printf("Updates processed: %d\n", totalUpdates)
fmt.Printf("Updates successful: %d\n", successfulUpdates)
fmt.Printf("Updates failed: %d\n", failedUpdates)
// Display updated inventory in alphabetical order
fmt.Println("Updated Inventory:")
var productNames []string
for name := range inventory {
productNames = append(productNames, name)
}
sort.Strings(productNames)
for _, name := range productNames {
product := inventory[name]
fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
}
// Calculate final statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
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 failed updates
if len(failedProducts) > 0 {
fmt.Printf("Failed updates: %s\n", strings.Join(failedProducts, ","))
} else {
fmt.Println("All stock updates were processed 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