École Hexagone

TP1 – Gestion de l'équipage

4PYTH – Projet fil rouge « Fondation » · Vendredi 9 octobre

Une flotte de vaisseaux spatiaux en orbite autour d'une planète

Contexte

Dans un futur lointain, la galaxie est plongée dans une crise sans précédent. La Seconde Fondation, un groupe secret maîtrisant les sciences mentales, lutte pour maintenir la stabilité galactique. Mais un chef rebelle connu sous le nom du Mulet menace cet équilibre.

Officier de la flotte marchande indépendante, vous êtes chargé de réorganiser les équipages de vos vaisseaux pour préparer une contre-offensive. Première mission : gérer les membres d'équipage et vous assurer que vos vaisseaux sont opérationnels avant l'arrivée des renforts. 🫡

Ce TP en bref

0 Le dépôt GitHub

Git · venv

Tout le projet vit dans un seul dépôt, que vous enrichirez de TP en TP.

  1. Créez un dossier de projet et son environnement virtuel, puis initialisez votre dépôt Git :
    
              mkdir 4pyth-fondation
              cd 4pyth-fondation
              python3 -m venv .venv        # Windows : py -m venv .venv
              git init
            
  2. Créez un fichier .gitignore, pour que l'environnement virtuel ne soit jamais envoyé sur GitHub :
    
              .venv/
              __pycache__/
            
  3. Créez un fichier README.md avec au moins le titre du projet et votre nom. Vous le compléterez au fil des TP (mode d'emploi, bonus réalisés, déclaration d'usage de l'IA).
  4. Sur GitHub, créez un dépôt privé nommé 4pyth-fondation-nom-prenom, sans README, puis reliez-le et poussez :
    
              git add .
              git commit -m "Initialisation du projet Fondation"
              git branch -M main
              git remote add origin https://github.com/votre-pseudo/4pyth-fondation-nom-prenom.git
              git push -u origin main
            
  5. Dans Settings → Collaborators, invitez Chris-CHEVALIER, au plus tard le vendredi 9 octobre.
Premier commit de votre vie ? Git vous demande votre identité

        git config --global user.name "Nom d'utilisateur"
        git config --global user.email "adresse@exemple.fr"
      

Utilisez l'adresse de votre compte GitHub.

1 L'équipage

Listes · dictionnaires

L'équipage est une liste de membres. Chaque membre est un dictionnaire contenant cinq clés :

CléContenuType
first_nameprénomstr
last_namenom de famille, unique dans l'équipagestr
gender"F" ou "M"str
ageâge en annéesint
roleun rôle de la liste autorisée (voir étape 2)str

Dans un fichier main.py, créez l'équipage de départ en copiant ces cinq membres :


      crew = [
          {"first_name": "Bel", "last_name": "Riose", "gender": "M", "age": 48, "role": "commandant"},
          {"first_name": "Gaal", "last_name": "Dornick", "gender": "F", "age": 34, "role": "technicien"},
          {"first_name": "Hugo", "last_name": "Crast", "gender": "M", "age": 37, "role": "pilote"},
          {"first_name": "Salvor", "last_name": "Hardin", "gender": "F", "age": 28, "role": "armurier"},
          {"first_name": "Novi", "last_name": "Sura", "gender": "F", "age": 25, "role": "entretien"},
      ]
    

Le reste de la flotte vous attend dans le jeu de données ci-dessous. Vous ajouterez ces membres avec votre propre fonction add_member. C'est la meilleure façon de la tester.

Jeu de données – flotte « Galactica », commandant Bel Riose

NomGenreÂgeRôle
Bel RioseM48commandant
Gaal DornickF34technicien
Salvor HardinF28armurier
Hugo CrastM37pilote
Jagger FountM41pilote
Hober MallowM52pilote
Lathan DeversM46marchand
Limmar PonyetsM43marchand
Novi SuraF25entretien
Ebling MisM34entretien
Eskel GorovM32marchand
NomGenreÂgeRôle
FallomF28pilote
Han PritcherM31armurier
Harlan BrannoF38entretien
Lewis PirenneM34pilote
Munn ComporM27technicien
Yugo AmaryM33technicien
Bayta DarellF48entretien
Toran DarellM52technicien
Stora GendibalF35technicien
Jord CommassonM53entretien

Trois mentalistes complètent la flotte : Tellem Bond (M, 48 ans), Yanna Seldon (F, 52 ans) et Joie (F, 25 ans). Ils ont des pouvoirs particuliers. Vous les modéliserez au TP2.

2 Les fonctions de gestion

Fonctions · conditions · boucles · exceptions

Dans un fichier crew.py, écrivez les quatre fonctions suivantes. Chacune reçoit l'équipage en paramètre.

add_member(crew) – Ajouter un membre

  1. Demande le prénom, le nom de famille, le genre, l'âge et le rôle du nouveau membre avec input().
  2. Refuse toute saisie invalide et, grâce à une boucle while, la redemande tant qu'elle n'est pas correcte :
    • prénom et nom de famille : entre 3 et 15 caractères ;
    • nom de famille unique dans l'équipage, sans tenir compte de la casse ;
    • genre : "F" ou "M" ;
    • âge : un nombre entier écrit en chiffres. Une saisie comme vingt est refusée (on ne la convertit pas en 20) et ne doit pas faire planter le programme ;
    • rôle : uniquement une valeur de la liste ROLES, sans tenir compte de la casse.
  3. Ajoute le dictionnaire du nouveau membre à la liste et affiche une confirmation.

      ROLES = ["commandant", "pilote", "technicien", "armurier", "marchand", "entretien"]
    
Réflexe cyber : la liste blanche Plutôt que d'essayer d'interdire les mauvaises valeurs (liste noire, toujours incomplète), on n'accepte que les valeurs connues. C'est le principe de validation des entrées recommandé partout en sécurité : formulaires web, paramètres d'API, règles de pare-feu…

remove_member(crew) – Retirer un membre

  1. Demande le nom de famille du membre à retirer.
  2. Le retire de la liste et affiche une confirmation.
  3. Affiche un message clair si aucun membre ne porte ce nom.

display_crew(crew) – Afficher l'équipage

  1. Affiche toutes les informations de chaque membre sur une ligne, numérotée.
  2. Affiche un message si l'équipage est vide.

check_crew(crew) – Vérifier l'équipage

  1. Vérifie que l'équipage compte au moins 2 membres, dont au moins un pilote et un technicien.
  2. Affiche L'équipage est prêt pour la mission ! ou, sinon, ce qui manque.
  3. Renvoie True ou False.
Indices
  • Une fonction, une tâche : une petite fonction ask_int(prompt) qui redemande un entier jusqu'à obtenir une saisie valide vous servira pour l'âge… et pour le menu de l'étape 3.
  • Même idée pour la recherche : une fonction find_member(crew, last_name) qui renvoie le membre ou None sert à la fois pour l'ajout (unicité) et pour la suppression.
  • Revoyez les notions « try, except, else, raise » et « while, break, continue » du cours.

3 Le menu interactif

while · match / case · modules
  1. Dans main.py, importez vos fonctions depuis crew.py.
  2. Affichez le menu dans une boucle while True et traitez le choix avec match / case.
  3. L'option [0] Quitter sort de la boucle. Les TP suivants ajouteront les options [5], [6], etc.
  4. Un choix invalide (abc, 7…) affiche un message et ne fait jamais planter le programme.
  5. Placez le lancement du menu sous if __name__ == "__main__":. Ainsi, le menu ne démarre que si l'on exécute main.py directement et pas si un autre fichier l'importe (pour réutiliser ses fonctions ou les tester, par exemple).

      ===== Flotte marchande – Gestion de l'équipage =====
      [1] Ajouter un membre
      [2] Retirer un membre
      [3] Afficher l'équipage
      [4] Vérifier l'équipage
      [0] Quitter
      Votre choix : 3
       1. Bel Riose (M, 48 ans) – commandant
       2. Gaal Dornick (F, 34 ans) – technicien
       3. Hugo Crast (M, 37 ans) – pilote
       4. Salvor Hardin (F, 28 ans) – armurier
       5. Novi Sura (F, 25 ans) – entretien
    
Commitez ! Un commit par étape terminée, avec un message qui dit ce qui a changé : git add . puis git commit -m "Ajout du menu interactif" et git push.

+ Pour aller plus loin

Facultatif

Bonus 1 – Terminal de bord sécurisé

Bonus 2 – Contraintes d'âge

Bonus 3 – Promotions

Bonus 4 – Rapport d'équipage

À méditer Essayez d'ajouter Toran Darell puis Bayta Darell et enfin Fallom, qui n'a pas de nom de famille. Vos règles de validation fonctionnent… mais sont-elles adaptées à la réalité ? Une règle trop stricte bloque des utilisateurs légitimes ; une règle trop souple laisse passer n'importe quoi. Trouver le bon équilibre est tout l'enjeu de la validation des entrées.

✓ Avant de rendre

Vérifiez chaque point. Ils correspondent à la grille d'évaluation du projet Fondation.