Ch. 00 · Leçon 4
Mini-projet 3 — Gestion d'un stock de magasin
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é
- Arbre d'analyse modulaire (au moins 7 modules).
- T.D.O complet.
- Algorithme de recherche dichotomique sur le tableau de codes.
- Algorithme d'insertion triée d'un nouveau code.
- Procédures pour vente et réapprovisionnement (paramètres VAR).
- Traduction Python 3 complète.
- 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.