Assemblage final
Fait partie de la section Logique & Flux du Journey GO de Coddy. Leçon 50 sur 68.
Défi
FacileTerminez votre système de gestion des stocks en créant un programme principal complet qui intègre toutes les fonctionnalités que vous avez développées dans les leçons précédentes. Ce défi final rassemble l’initialisation du stock, la vérification des stocks, l’ajout d’articles, la mise à jour des stocks et la génération de rapports au sein d’une interface en ligne de commande complète avec une navigation par menus.
Vous recevrez trois entrées :
- Une chaîne contenant les données initiales du stock au format
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(par exemple,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Une chaîne contenant une séquence d’opérations de menu au format
"operation1,operation2,operation3", où les opérations peuvent être"check","add","update","report"ou"exit"(par exemple,"check,add,update,report,exit") - Une chaîne contenant les paramètres des opérations au format
"param1|param2|param3", où chaque paramètre correspond à l’opération située à la même position (par exemple,"Mouse|Monitor:299.99:10|Laptop:5|full,10")
Votre tâche consiste à :
- Utiliser la même structure
Productque dans les leçons précédentes, avec les champsPrice(float64) etQuantity(int) - Analyser la première entrée et initialiser la map du stock avec les données des produits existants
- Afficher le message de démarrage du système :
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- Analyser la deuxième entrée pour obtenir la séquence d’opérations à effectuer
- Analyser la troisième entrée pour obtenir les paramètres de chaque opération
- Pour chaque opération de la séquence, afficher l’en-tête de l’opération et effectuer l’action correspondante :
- Pour
"check": afficher"--- STOCK CHECK ---"et vérifier le stock du produit indiqué - Pour
"add": afficher"--- ADD ITEM ---"et ajouter le produit indiqué - Pour
"update": afficher"--- UPDATE STOCK ---"et mettre à jour le stock du produit indiqué - Pour
"report": afficher"--- GENERATE REPORT ---"et générer le rapport indiqué - Pour
"exit": afficher"--- SYSTEM EXIT ---"et montrer les informations de sortie
- Pour
- Implémenter la fonction
checkStock, qui renvoie la quantité et une erreur, comme dans les leçons précédentes - Implémenter la fonction
addNewItem, qui ajoute des produits et renvoie une erreur, comme dans les leçons précédentes - Implémenter la fonction
updateStock, qui met à jour les quantités et renvoie une erreur, comme dans les leçons précédentes - Implémenter la fonction
generateReport, qui affiche le rapport décrit ci-dessous pour l’opération"report" - Pour l’opération
"check":- Utiliser le paramètre comme nom du produit à vérifier
- Afficher :
"Checking stock for: [product_name]" - Si le produit est trouvé :
"Stock level: [quantity] units" - Si le produit n’est pas trouvé :
"Product not found in inventory"
- Pour l’opération
"add":- Analyser le paramètre au format
"product_name:price:quantity" - Afficher :
"Adding new product: [product_name]" - En cas de succès :
"Product added successfully" - En cas d’échec :
"Failed to add product: [error_message]", où l’erreur est"product already exists"
- Analyser le paramètre au format
- Pour l’opération
"update":- Analyser le paramètre au format
"product_name:change" - Afficher :
"Updating stock for: [product_name]" - En cas de succès et si la variation est nulle ou positive :
"Added [change] units. New stock: [new_quantity]" - En cas de succès et si la variation est négative :
"Removed [absolute_change] units. New stock: [new_quantity]" - En cas d’échec :
"Update failed: [error_message]", où l’erreur est"product not found", ou"insufficient stock"si la nouvelle quantité serait inférieure à 0
- Analyser le paramètre au format
- Pour l’opération
"report":- Analyser le paramètre au format
"report_type,threshold", où report_type est"low"ou"full", et threshold est un entier - Afficher :
"Generating [report_type] report with threshold [threshold]" - Afficher ensuite le rapport, avec les produits dans l’ordre alphabétique :
- Pour
"low":"=== LOW REPORT ===", puis"Products with stock below [threshold]:", puis"- [name]: [quantity] units (Price: $[price])"pour chaque produit dont la quantité est inférieure au seuil - Pour
"full":"=== FULL REPORT ===", puis"Complete inventory (minimum threshold: [threshold]):", puis"- [name]: [quantity] units @ $[price] each [OK]"pour chaque produit, avec[LOW STOCK]à la place de[OK]lorsque la quantité est inférieure au seuil
- Pour
- Analyser le paramètre au format
- Pour l’opération
"exit":- Afficher les statistiques finales du stock :
"Final inventory status:""Total products: [total_products]""Total items: [total_items]""Total value: $[total_value]"
- Afficher :
"Session completed successfully" - Afficher :
"Thank you for using the Inventory Management System"
- Afficher les statistiques finales du stock :
- Après chaque opération (sauf exit), afficher :
"Operation completed. Continuing to next operation..."
Utilisez le package strings pour découper les chaînes d’entrée, le package strconv pour convertir les chaînes en nombres, le package errors pour la gestion des erreurs, le package fmt pour afficher du texte formaté et le package sort pour le tri alphabétique. Formatez tous les prix et toutes les valeurs avec 2 décimales. Ce défi montre comment créer un système interactif complet qui intègre plusieurs composants fonctionnels dans une expérience utilisateur cohérente, avec une gestion appropriée des erreurs et de l’état.
Essayez vous-même
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
type Product struct {
Price float64
Quantity int
}
func generateReport(inventory map[string]Product, reportType string, threshold float64) {
// Display report header
switch reportType {
case "full":
fmt.Println("=== FULL INVENTORY REPORT ===")
case "low_stock":
fmt.Println("=== LOW STOCK REPORT ===")
case "high_value":
fmt.Println("=== HIGH VALUE REPORT ===")
}
// Calculate general statistics
totalProducts := len(inventory)
totalItems := 0
totalValue := 0.0
for _, product := range inventory {
totalItems += product.Quantity
totalValue += product.Price * float64(product.Quantity)
}
averagePrice := totalValue / float64(totalItems)
// Display general 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)
fmt.Printf("Average Product Price: $%.2f\n", averagePrice)
// Filter products based on report type
var filteredProducts []string
for name, product := range inventory {
switch reportType {
case "full":
filteredProducts = append(filteredProducts, name)
case "low_stock":
if product.Quantity <= int(threshold) {
filteredProducts = append(filteredProducts, name)
}
case "high_value":
productValue := product.Price * float64(product.Quantity)
if productValue >= threshold {
filteredProducts = append(filteredProducts, name)
}
}
}
// Sort filtered products alphabetically
sort.Strings(filteredProducts)
// Display filtered products section header
switch reportType {
case "full":
fmt.Println("All Products:")
case "low_stock":
fmt.Printf("Products with stock ≤ %.0f:\n", threshold)
case "high_value":
fmt.Printf("Products with value ≥ $%.2f:\n", threshold)
}
// Display filtered products
filteredItems := 0
filteredValue := 0.0
for _, name := range filteredProducts {
product := inventory[name]
productValue := product.Price * float64(product.Quantity)
fmt.Printf("- %s: $%.2f × %d = $%.2f\n", name, product.Price, product.Quantity, productValue)
filteredItems += product.Quantity
filteredValue += productValue
}
// Display filtered statistics
fmt.Println("Filtered Results:")
fmt.Printf("Products shown: %d\n", len(filteredProducts))
fmt.Printf("Items in filtered products: %d\n", filteredItems)
fmt.Printf("Value of filtered products: $%.2f\n", filteredValue)
// Find most and least expensive products
var mostExpensiveName, leastExpensiveName string
var mostExpensivePrice, leastExpensivePrice float64
first := true
var sortedNames []string
for name := range inventory {
sortedNames = append(sortedNames, name)
}
sort.Strings(sortedNames)
for _, name := range sortedNames {
product := inventory[name]
if first {
mostExpensiveName = name
mostExpensivePrice = product.Price
leastExpensiveName = name
leastExpensivePrice = product.Price
first = false
} else {
if product.Price > mostExpensivePrice {
mostExpensiveName = name
mostExpensivePrice = product.Price
}
if product.Price < leastExpensivePrice {
leastExpensiveName = name
leastExpensivePrice = product.Price
}
}
}
fmt.Println("Price Analysis:")
fmt.Printf("Most expensive: %s at $%.2f\n", mostExpensiveName, mostExpensivePrice)
fmt.Printf("Least expensive: %s at $%.2f\n", leastExpensiveName, leastExpensivePrice)
// Find highest and lowest stock products
var highestStockName, lowestStockName string
var highestStock, lowestStock int
first = true
for _, name := range sortedNames {
product := inventory[name]
if first {
highestStockName = name
highestStock = product.Quantity
lowestStockName = name
lowestStock = product.Quantity
first = false
} else {
if product.Quantity > highestStock {
highestStockName = name
highestStock = product.Quantity
}
if product.Quantity < lowestStock {
lowestStockName = name
lowestStock = product.Quantity
}
}
}
fmt.Println("Stock Analysis:")
fmt.Printf("Highest stock: %s with %d units\n", highestStockName, highestStock)
fmt.Printf("Lowest stock: %s with %d units\n", lowestStockName, lowestStock)
// Inventory health assessment
lowStockCount := 0
highStockCount := 0
highValueCount := 0
for _, product := range inventory {
if product.Quantity <= 5 {
lowStockCount++
}
if product.Quantity > 20 {
highStockCount++
}
productValue := product.Price * float64(product.Quantity)
if productValue >= 500.0 {
highValueCount++
}
}
fmt.Printf("Low stock items (≤5): %d\n", lowStockCount)
fmt.Printf("High stock items (>20): %d\n", highStockCount)
fmt.Printf("High value items (≥$500): %d\n", highValueCount)
// Report completion
fmt.Println("Report generated successfully")
fmt.Printf("Threshold applied: %.2f\n", threshold)
}
func main() {
var inventoryData string
var reportConfig string
fmt.Scanln(&inventoryData)
fmt.Scanln(&reportConfig)
// Parse inventory data
inventory := make(map[string]Product)
if inventoryData != "" {
products := strings.Split(inventoryData, ",")
for _, productStr := range products {
parts := strings.Split(productStr, ":")
name := parts[0]
price, _ := strconv.ParseFloat(parts[1], 64)
quantity, _ := strconv.Atoi(parts[2])
inventory[name] = Product{Price: price, Quantity: quantity}
}
}
// Parse report configuration
configParts := strings.Split(reportConfig, ",")
reportType := configParts[0]
threshold, _ := strconv.ParseFloat(configParts[1], 64)
// Generate report
generateReport(inventory, reportType, threshold)
}Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots8Projet : Inventaire simple
Aperçu du projetVérifier le stock3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportementsEntraînez-vous par vous-même : Compilateur Go en ligne