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 des stocks en implémentant une fonctionnalité permettant d’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 possibilité d’étendre 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 d’inventaire existantes 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 que dans les leçons précédentes, avec les champs Price (float64) et Quantity (int)
  2. Analyser la première entrée en la divisant sur les virgules afin d’obtenir les entrées des produits existants
  3. Pour chaque entrée de produit existant, la diviser sur les deux-points afin d’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 appelée addNewItem qui prend la map d’inventaire, le nom du produit, le prix et la quantité comme paramètres et renvoie une erreur :
    • Si le produit existe déjà dans l’inventaire, renvoyer une erreur avec le message "product already exists: [product_name]"
    • Si le produit n’existe pas, l’ajouter à l’inventaire et renvoyer nil
  7. Analyser la deuxième entrée en la divisant sur les virgules afin d’obtenir la liste des nouveaux produits à ajouter
  8. Pour chaque nouvelle entrée de produit, la diviser sur les deux-points afin d’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 :
    • En l’absence d’erreur : "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • En cas d’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 dans l’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. Répertorier 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 diviser les chaînes d’entrée, le package strconv pour convertir les chaînes en nombres, le package errors pour créer les 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 avec 2 décimales et la valeur totale de l’inventaire avec 2 décimales. Ce défi montre comment étendre des collections de données en toute sécurité tout en empêchant les entrées en double grâce à une gestion et une validation appropriées des erreurs.

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

Entraînez-vous par vous-même : Compilateur Go en ligne