Aller au contenu principal

Ch. 00 · Leçon 4

Mini-projet 3 — Gestion d'un stock de magasin

120 minanalyse · python
Affichage du code

Ce que vous saurez faire

  • Concevoir un système de gestion d'inventaire complet
  • Implémenter une recherche dichotomique sur tableau trié
  • Modifier un tableau via des paramètres VAR (procédures)
  • Détecter et signaler les alertes (stock faible)

100 articles, recherche dichotomique, alertes de stock

Ce 3e mini-projet est le plus ambitieux : il combine tous les chapitres du programme et met en scène une situation professionnelle réaliste.


Énoncé

Un magasin gère son stock de 100 articles maximum. Chaque article est caractérisé par :

  • son code (entier unique, trié par ordre croissant dans le tableau),
  • son nom (chaîne),
  • son prix unitaire (réel),
  • sa quantité en stock (entier).

Le programme propose un menu :

=== Gestion stock ===
1. Ajouter un article (codes triés)
2. Rechercher un article (par code)
3. Vendre N unités d'un article
4. Réapprovisionner un article
5. Afficher les articles en alerte (stock < 10)
6. Afficher la valeur totale du stock
0. Quitter

Contraintes

  • Le tableau des codes est toujours trié croissant → recherche dichotomique.
  • L'ajout d'un nouvel article doit insérer à la bonne position (décalage).
  • La vente doit vérifier que la quantité disponible est suffisante.

Travail demandé

  1. Arbre d'analyse modulaire (au moins 7 modules).
  2. T.D.O complet.
  3. Algorithme de recherche dichotomique sur le tableau de codes.
  4. Algorithme d'insertion triée d'un nouveau code.
  5. Procédures pour vente et réapprovisionnement (paramètres VAR).
  6. Traduction Python 3 complète.
  7. Cas limites : stock vide, stock plein, code déjà existant, quantité demandée > stock disponible.

Pistes

💡 Indice 1 — Structures de stockage

Quatre tableaux parallèles :

codes[100]     : entiers triés croissants
noms[100]      : chaînes
prix[100]      : réels
quantites[100] : entiers
nb_articles    : entier (0..100)
💡 Indice 2 — Insertion triée

Pour insérer un nouveau code, trouvez sa position (premier indice où codes[i] > nouveau_code), puis décalez tous les éléments à droite à partir de cette position dans les 4 tableaux. C'est l'opération inverse de la suppression.

💡 Indice 3 — Alerte stock faible

Parcours simple du tableau, test quantites[i] < 10. Comptage filtré + affichage.


Corrigé partiel

📘 Voir les fragments clés

Recherche dichotomique sur les codes

def chercher_dicho(codes: list[int], nb: int, code_cible: int) -> int:
    """Retourne l'indice de code_cible dans codes[0..nb-1] trié, ou -1."""
    g, d = 0, nb - 1
    while g <= d:
        m = (g + d) // 2
        if codes[m] == code_cible:
            return m
        elif codes[m] < code_cible:
            g = m + 1
        else:
            d = m - 1
    return -1

Insertion triée

def inserer_article(codes, noms, prix, quantites, nb, code, nom, p, q) -> int:
    """Insère le nouvel article à la bonne position. Retourne le nouveau nb."""
    if nb >= 100:
        print("Stock plein.")
        return nb

    # Trouver la position d'insertion
    pos = nb  # par défaut, à la fin
    for i in range(nb):
        if codes[i] > code:
            pos = i
            break
        if codes[i] == code:
            print("Code déjà existant.")
            return nb

    # Décaler les 4 tableaux à droite à partir de pos
    for i in range(nb, pos, -1):
        codes[i] = codes[i - 1]
        noms[i] = noms[i - 1]
        prix[i] = prix[i - 1]
        quantites[i] = quantites[i - 1]

    # Insérer
    codes[pos] = code
    noms[pos] = nom
    prix[pos] = p
    quantites[pos] = q
    return nb + 1

Vendre N unités (procédure modificatrice)

def vendre(codes, quantites, nb, code, n) -> bool:
    """Diminue le stock de l'article `code` de `n` unités. Retourne True si OK."""
    idx = chercher_dicho(codes, nb, code)
    if idx == -1:
        print(f"Article {code} introuvable.")
        return False
    if quantites[idx] < n:
        print(f"Stock insuffisant : {quantites[idx]} disponibles, {n} demandées.")
        return False
    quantites[idx] -= n
    return True

Articles en alerte

def afficher_alertes(codes, noms, quantites, nb, seuil=10) -> None:
    print(f"\n--- Articles en alerte (stock < {seuil}) ---")
    count = 0
    for i in range(nb):
        if quantites[i] < seuil:
            print(f"  Code {codes[i]:<5} | {noms[i]:<20} | {quantites[i]} restant(s)")
            count += 1
    print(f"{count} article(s) en alerte.")

Valeur totale du stock

def valeur_totale(prix: list[float], quantites: list[int], nb: int) -> float:
    total = 0.0
    for i in range(nb):
        total += prix[i] * quantites[i]
    return total

Discussion pédagogique

Ce projet illustre pourquoi la dichotomie est utile : sur 100 articles, séquentiel = 100 comparaisons / dichotomie = 7. Si chaque vente déclenche une recherche, on divise le temps par ~14.

Question ouverte au lecteur : que se passe-t-il si l'on accepte qu'un client cherche par nom plutôt que par code ? Les noms ne sont pas triés. La dichotomie n'est plus utilisable directement → recherche séquentielle obligatoire ou indexation séparée (hors programme).


Auto-évaluation

  • Arbre d'analyse avec ≥ 7 modules
  • T.D.O complet pour les 4 tableaux parallèles
  • Recherche dichotomique correcte sur les codes
  • Insertion triée avec décalage des 4 tableaux
  • Vente avec vérification de quantité
  • Cas limites : stock plein, code dupliqué, quantité insuffisante
  • Justification du choix de la dichotomie (codes triés)

Si vous avez réussi à coder ce projet entièrement, vous êtes prêt pour le bac.

Bravo d'être arrivé jusqu'ici. Marquez la leçon terminée pour ancrer le progrès.