Aggiornare la quantità in magazzino
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 48 di 68.
Sfida
FacileMigliora il tuo sistema di gestione dell'inventario implementando aggiornamenti delle quantità di magazzino con convalida completa e gestione degli errori. Questa sfida si basa sulle funzionalità precedenti e aggiunge la possibilità di modificare le quantità dei prodotti esistenti, impedendo al contempo operazioni non valide che potrebbero comportare livelli di scorte negativi.
Riceverai due input:
- Una stringa contenente i dati dell'inventario esistente nel formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(ad esempio,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Una stringa contenente le richieste di aggiornamento delle scorte nel formato
"product1:change1,product2:change2,product3:change3", dove le variazioni possono essere numeri interi positivi o negativi (ad esempio,"Mouse:10,Tablet:-5,Keyboard:-3")
Il tuo compito è:
- Usare la stessa struct
Productdelle lezioni precedenti, con i campiPrice(float64) eQuantity(int) - Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere le singole voci dei prodotti esistenti
- Per ogni voce di prodotto esistente, dividerla in corrispondenza dei due punti per ottenere il nome del prodotto, il prezzo e la quantità
- Convertire la stringa del prezzo in float64 e la stringa della quantità in int
- Creare e popolare la mappa
inventorycon i dati dei prodotti esistenti - Creare una funzione chiamata
updateStockche accetta come parametri la mappa dell'inventario, il nome del prodotto e la variazione della quantità e restituisce un errore:- Se il prodotto non esiste nell'inventario, restituire un errore con il messaggio
"product not found: [product_name]" - Se la variazione della quantità comporterebbe scorte negative (quantità attuale + variazione < 0), restituire un errore con il messaggio
"insufficient stock: cannot reduce [product_name] by [absolute_change_value], only [current_quantity] available" - Se l'aggiornamento è valido, modificare la quantità del prodotto nell'inventario e restituire nil
- Se il prodotto non esiste nell'inventario, restituire un errore con il messaggio
- Analizzare il secondo input dividendolo in corrispondenza delle virgole per ottenere l'elenco delle richieste di aggiornamento delle scorte
- Per ogni richiesta di aggiornamento, dividerla in corrispondenza dei due punti per ottenere il nome del prodotto e la variazione della quantità
- Convertire la stringa della variazione della quantità in int
- Visualizzare l'intestazione del processo di aggiornamento:
"Processing Stock Updates:" - Per ogni richiesta di aggiornamento, chiamare la funzione
updateStocke visualizzare i risultati:- Se non si verifica alcun errore e la variazione è positiva:
"[product_name]: Added [change] units - New stock: [new_quantity]" - Se non si verifica alcun errore e la variazione è negativa:
"[product_name]: Removed [absolute_change_value] units - New stock: [new_quantity]" - Se non si verifica alcun errore e la variazione è zero:
"[product_name]: No change - Current stock: [current_quantity]" - Se si verifica un errore:
"[product_name]: Update failed - [error_message]"
- Se non si verifica alcun errore e la variazione è positiva:
- Contare e visualizzare le statistiche degli aggiornamenti:
"Update Summary:""Updates processed: [total_number_of_updates_processed]""Updates successful: [number_of_successful_updates]""Updates failed: [number_of_failed_updates]"
- Visualizzare l'inventario aggiornato in ordine alfabetico in base al nome del prodotto:
"Updated Inventory:"- Per ogni prodotto:
"- [product_name]: $[price] (Stock: [quantity])"
- Calcolare e visualizzare le statistiche finali dell'inventario:
"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]"
- Elencare gli eventuali aggiornamenti non riusciti:
- Se ci sono aggiornamenti non riusciti:
"Failed updates: [comma_separated_list_of_failed_product_names]" - Se non ci sono aggiornamenti non riusciti:
"All stock updates were processed successfully"
- Se ci sono aggiornamenti non riusciti:
Usa il pacchetto strings per dividere le stringhe di input, il pacchetto strconv per convertire le stringhe in numeri, il pacchetto errors per creare messaggi di errore, il pacchetto fmt per l'output formattato e il pacchetto sort per ordinare alfabeticamente i nomi dei prodotti. Formatta tutti i prezzi con 2 cifre decimali e il valore totale dell'inventario con 2 cifre decimali. Questa sfida mostra come modificare in sicurezza i dati esistenti impedendo operazioni non valide tramite una convalida completa e la gestione degli errori.
Provalo tu
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")
}
}Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole8Progetto: inventario semplice
Panoramica del progettoControllare le scorte3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online