Menu
Coddy logo textTech

Assemblage final

Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 25 sur 68.

challenge icon

Défi

Facile

Complé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 à :

  1. Utiliser la même structure Product des leçons précédentes avec les champs Price (float64) et Quantity (int)
  2. Analyser la première entrée et initialiser la map d'inventaire avec les données de produits existantes
  3. Afficher le message de démarrage du système :
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. Analyser la deuxième entrée pour obtenir la séquence d'opérations à effectuer
  5. Analyser la troisième entrée pour obtenir les paramètres de chaque opération
  6. 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
  7. Implémenter la fonction checkStock qui renvoie la quantité et l'erreur comme dans les leçons précédentes
  8. Implémenter la fonction addNewItem qui ajoute des produits et renvoie une erreur comme dans les leçons précédentes
  9. Implémenter la fonction updateStock qui met à jour les quantités et renvoie une erreur comme dans les leçons précédentes
  10. Implémenter la fonction generateReport qui crée des rapports comme dans les leçons précédentes
  11. 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"
  12. 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]"
  13. 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]"
  14. 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
  15. 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"
  16. 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