Menu
Coddy logo textTech

Ajouter un nouvel article

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

challenge icon

Défi

Facile

Étendez votre système de gestion d'inventaire en implémentant une fonctionnalité pour ajouter de nouveaux produits en toute sécurité. Ce défi s'appuie sur le système de vérification des stocks précédent et ajoute la capacité d'élargir votre inventaire tout en empêchant les entrées en double grâce à une gestion appropriée des erreurs.

Vous recevrez deux entrées :

  • Une chaîne contenant les données de l'inventaire existant 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 les nouveaux produits à ajouter au format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (par exemple, "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

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 en la découpant au niveau des virgules pour obtenir les entrées individuelles des produits existants
  3. Pour chaque entrée de produit existant, découper au niveau des deux-points pour obtenir le nom du produit, le prix et la quantité
  4. Convertir la chaîne du prix en float64 et la chaîne de la quantité en int
  5. Créer et remplir la map inventory avec les données des produits existants
  6. Créer une fonction nommée addNewItem qui prend la map inventory, le nom du produit, le prix et la quantité comme paramètres et retourne une erreur :
    • Si le produit existe déjà dans l'inventaire, retourner une erreur avec le message "product already exists: [product_name]"
    • Si le produit n'existe pas, l'ajouter à l'inventaire et retourner nil
  7. Analyser la seconde entrée en la découpant au niveau des virgules pour obtenir la liste des nouveaux produits à ajouter
  8. Pour chaque nouvelle entrée de produit, découper au niveau des deux-points pour obtenir le nom du produit, le prix et la quantité
  9. Convertir la chaîne du prix en float64 et la chaîne de la quantité en int
  10. Afficher l'en-tête du processus d'ajout : "Adding New Items:"
  11. Pour chaque nouveau produit, appeler la fonction addNewItem et afficher les résultats :
    • Si aucune erreur : "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Si erreur : "[product_name]: Failed to add - [error_message]"
  12. Compter et afficher les statistiques d'ajout :
    • "Addition Summary:"
    • "Items processed: [total_number_of_items_processed]"
    • "Items added: [number_of_items_successfully_added]"
    • "Items rejected: [number_of_items_that_failed_to_add]"
  13. Afficher l'inventaire mis à jour par ordre alphabétique des noms de produits :
    • "Updated Inventory:"
    • Pour chaque produit : "- [product_name]: $[price] (Stock: [quantity])"
  14. Calculer et afficher les statistiques finales de l'inventaire :
    • "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]"
  15. Lister tous les produits rejetés :
    • S'il y a des produits rejetés : "Rejected products: [comma_separated_list_of_rejected_products]"
    • Si aucun produit n'est rejeté : "All new products were added successfully"

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 créer des messages d'erreur, le package fmt pour la sortie formatée, et le package sort pour trier les noms de produits par ordre alphabétique. Formatez tous les prix à 2 décimales et la valeur totale de l'inventaire à 2 décimales. Ce défi démontre comment étendre en toute sécurité des collections de données tout en empêchant les entrées en double grâce à une gestion des erreurs et une validation appropriées.

Essayez vous-même

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

type Product struct {
	Price    float64
	Quantity int
}

func checkStock(inventory map[string]Product, productName string) (int, error) {
	product, exists := inventory[productName]
	if !exists {
		return 0, errors.New("product not found: " + productName)
	}
	return product.Quantity, nil
}

func main() {
	var inventoryData string
	var checkRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&checkRequests)

	inventory := make(map[string]Product)

	// Parse inventory data
	productEntries := strings.Split(inventoryData, ",")
	for _, entry := range productEntries {
		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 check requests
	productsToCheck := strings.Split(checkRequests, ",")

	fmt.Println("Stock Check Results:")

	var productsFound int
	var productsNotFound int
	var totalStock int
	var missingProducts []string

	for _, productName := range productsToCheck {
		quantity, err := checkStock(inventory, productName)
		if err != nil {
			fmt.Printf("%s: Error - %s\n", productName, err.Error())
			productsNotFound++
			missingProducts = append(missingProducts, productName)
		} else {
			fmt.Printf("%s: %d units in stock\n", productName, quantity)
			productsFound++
			totalStock += quantity
		}
	}

	fmt.Println("Check Summary:")
	fmt.Printf("Products checked: %d\n", len(productsToCheck))
	fmt.Printf("Products found: %d\n", productsFound)
	fmt.Printf("Products not found: %d\n", productsNotFound)
	fmt.Printf("Total stock for found products: %d units\n", totalStock)

	if len(missingProducts) > 0 {
		fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
	} else {
		fmt.Println("All requested products are available")
	}
}

Toutes les leçons de Logique & Flux