Assemblage final
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 25 sur 68.
Défi
FacileComplétez votre système de gestion d'inventaire 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 de l'inventaire, la vérification des stocks, l'ajout d'articles, les mises à jour de stock et la génération de rapports dans une interface en ligne de commande complète avec une navigation par menu.
Vous recevrez trois entrées :
- Une chaîne contenant les données d'inventaire initiales 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 d'opération au format
"param1|param2|param3"où chaque paramètre correspond à l'opération à la même position (par exemple,"Mouse|Monitor:299.99:10|Laptop:5|full,10")
Votre tâche consiste à :
- Utiliser la même structure
Productdes leçons précédentes avec les champsPrice(float64) etQuantity(int) - Analyser la première entrée et initialiser la map d'inventaire avec les données de produits existantes
- 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 pour le produit spécifié - Pour
"add": Afficher"--- ADD ITEM ---"et ajouter le produit spécifié - Pour
"update": Afficher"--- UPDATE STOCK ---"et mettre à jour le stock pour le produit spécifié - Pour
"report": Afficher"--- GENERATE REPORT ---"et générer le rapport spécifié - Pour
"exit": Afficher"--- SYSTEM EXIT ---"et montrer les informations de sortie
- Pour
- Implémenter la fonction
checkStockqui renvoie la quantité et l'erreur comme dans les leçons précédentes - Implémenter la fonction
addNewItemqui ajoute des produits et renvoie une erreur comme dans les leçons précédentes - Implémenter la fonction
updateStockqui met à jour les quantités et renvoie une erreur comme dans les leçons précédentes - Implémenter la fonction
generateReportqui crée des rapports comme dans les leçons précédentes - Pour l'opération
"check":- Utiliser le paramètre comme nom de produit à vérifier
- Afficher :
"Checking stock for: [product_name]" - Si trouvé :
"Stock level: [quantity] units" - Si non 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]"
- 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 le changement est positif :
"Added [change] units. New stock: [new_quantity]" - En cas de succès et si le changement est négatif :
"Removed [absolute_change] units. New stock: [new_quantity]" - En cas d'échec :
"Update failed: [error_message]"
- Analyser le paramètre au format
- Pour l'opération
"report":- Analyser le paramètre au format
"report_type,threshold" - Afficher :
"Generating [report_type] report with threshold [threshold]" - Générer et afficher le rapport complet comme dans les leçons précédentes
- Analyser le paramètre au format
- Pour l'opération
"exit":- Afficher les statistiques finales de l'inventaire :
"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 de l'inventaire :
- Après chaque opération (sauf exit), afficher :
"Operation completed. Continuing to next operation..."
Utilisez le package strings pour diviser 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 la sortie formatée et le package sort pour le tri alphabétique. Formatez tous les prix et valeurs avec 2 décimales. Ce défi dé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 (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func removeTask(tasks []Task, index int) []Task {
return append(tasks[:index], tasks[index+1:]...)
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskData := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskData, ",")
var tasks []Task
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks = append(tasks, Task{Name: name, Completed: status})
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Store the name of the task to be removed
removedTaskName := tasks[index].Name
// Remove the task
tasks = removeTask(tasks, index)
// Display remaining tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
completedCount++
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' removed successfully!\n", removedTaskName)
// Print summary
totalCount := len(tasks)
incompleteCount := totalCount - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", totalCount, completedCount, incompleteCount)
}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 mots3Interfaces (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 comportements