🧪 TP1 – Radio CEMify 📻 (10%)
Niveau d’utilisation de l’I.A.G. : Niveau 1
Voici les fichiers de départ du travail pratique:
Mise en contexte​
C’est officiel ! La session d’hiver 2026 marque le grand retour en ondes de la radio étudiante du Cégep Édouard-Montpetit, désormais connue sous le nom de Radio CEMify.
Afin d’encourager la participation étudiante, les administrateurs de la radio mettent en circulation un formulaire papier permettant aux étudiants de proposer les chansons qu’ils souhaitent entendre à l’antenne. L’initiative connaît un succès immédiat : les demandes affluent rapidement et le volume de morceaux à gérer augmente de jour en jour.
Très vite, les administrateurs constatent que cette approche « papier-crayon » atteint ses limites. La gestion du répertoire devient lourde, peu flexible et propice aux erreurs. Il devient alors évident qu’un outil informatique simple et efficace est nécessaire pour centraliser, consulter et mettre à jour les morceaux proposés. Les administrateurs font donc appel à toi, développeur en devenir, afin de concevoir une première version d’un gestionnaire de répertoire musical, utilisable en mode console.
Partie 1 – Gestion du répertoire musical (TODO 01 à TODO 12)​
Dans cette première partie, tu dois compléter les fonctionnalités de base du gestionnaire musical de Radio CEMify. Les administrateurs de la radio étudiante t’ont transmis les spécifications fonctionnelles suivantes, qui devront être respectées afin de répondre à leurs besoins opérationnels :
Au démarrage du programme​
- Le répertoire musical doit automatiquement être chargé à partir du fichier Bibliothèque.csv.
- Chaque ligne du fichier représente un morceau et suit le format suivant : artiste|album|titre|cote|mm:ss
Pendant l'exécution​
L’utilisateur doit pouvoir interagir avec l’application à l’aide d’un menu en console lui permettant de :
- Afficher le contenu du répertoire musical ;
- Trier les morceaux selon leur cote (1 à 5, 5 étant la cote la plus élevée) ;
- Afficher les informations détaillées d’un morceau ;
- Consulter les statistiques du répertoire (# total de morceaux et durée totale) ;
- Ajouter un nouveau morceau au répertoire ;
- Supprimer un morceau existant ;
- Modifier la cote d’appréciation d’un morceau du répertoire.
À la fermeture du programme​
- Le répertoire musical doit automatiquement être sauvegardé dans le fichier Bibliotheque.csv
Attention ! Toutes les modifications effectuées pendant la session doivent être conservées
Algorithme de tri​
Afin de trier les morceaux selon leur cote, nous vous demandons d’utiliser l’algorithme du tri à bulles. Son principe est le suivant : On considère une liste L de taille N contenant une suite de nombres aléatoires. L’algorithme parcourt la liste, et dès que deux éléments consécutifs ne sont pas ordonnés, il les échange. Exemple d’exécution de l’algorithme de tri à bulles :

Les cases gris clair représentent les éléments comparés, les flèches rouges les échanges d’éléments, et les case gris sombre les éléments placés définitivement. L’opération de triage compte pour 10% du TP1 et est répartie selon la pondération suivante :
- 5% pour l’élaboration d’un pseudo-code valide (à valider avec le prof)
- 5% pour l’implémentation adéquate de l’algorithme selon votre pseudo-code
Voici un autre exemple du tri à bulle animée:

Informations additionnelles​
Cette première partie a pour objectif de consolider les acquis du cours Introduction à la programmation C# (1P6) et d’introduire progressivement les concepts de la programmation orientée objet. Cette première partie du TP est structurée à l’aide de commentaires TODO. Tu dois compléter les sections demandées sans modifier la structure globale du programme. Portes bien attention à la façon dont le code est documenté et structuré. Tu devras documenter ton code dans la partie 2.
Les fichiers suivants te sont fournis :
- Program.cs : Contient la logique principale du programme.
- Morceau.cs : Classe représentant un morceau de musique (ne pas modifier).
- Bibliotheque.csv : Fichier CSV contenant le répertoire initial de la radio.
Git​
Le projet doit obligatoirement être réalisé dans un dépôt Git. Dès le début du travail, tu dois créer un répertoire Git local pour ce projet et y effectuer des commits réguliers (~1 commit par TODO) reflétant l’évolution de ton programme.
Tests unitaires​
Le projet de départ contient quelques tests unitaires, généreusement écrits par un héros obscur. Ceux-ci vous permettront de valider le fonctionnement de base de certaines fonctions, mais ne couvrent pas l’ensemble des cas limites. Pour utiliser les tests unitaires, assurez-vous de respecter la nomenclature des fonctions et référez-vous à votre professeur pour apprendre à les exécuter.
Contenu évalué​
- Manipulation d’une classe prédéfinie
- Manipulation d’une liste contenant des objets
- Instanciation d’objets
- Complétion de méthodes
- Lecture et écriture de fichiers texte
- Création d’un premier dépôt Git et gestion d’une branche
Partie 2 – Gestion des utilisateurs et des droits d’accès (TODO 10 à 15)​
Vous devez documenter la partie 2 du tp!
Référez-vous à la section sur documenter son code: 👉 Documenter son code
Lors de la présentation de votre produit aux administrateurs de la radio, une nouvelle problématique est soulevée : n’importe qui peut actuellement modifier le répertoire musical. Les administrateurs souhaitent donc introduire la notion d’utilisateur afin de mieux contrôler l’accès aux fonctionnalités de l’application. En principe, seuls les utilisateurs ayant créé un compte pourront modifier le répertoire musical, tandis que les invités pourront uniquement le consulter.
Dans cette seconde partie, vous devez bonifier le gestionnaire de répertoire musical en y intégrant une classe Utilisateur, conformément au diagramme de classes fourni. Les fonctionnalités développées à la Partie 1 doivent être conservées et demeurées fonctionnelles.
Voici les nouvelles exigences des administrateurs :
Au démarrage du programme​
Au lancement du programme, l’utilisateur doit pouvoir choisir entre :
- Se créer un compte ;
- Continuer en tant qu’invité.
Types d’utilisateurs et fonctionnalités associées​
Utilisateur invité​
Si l’utilisateur choisit de continuer en tant qu’invité, son statut est automatiquement défini comme Invité. Un utilisateur invité a un accès restreint aux fonctionnalités de l’application et peut uniquement :
- Trier le répertoire musical de la radio ;
- Afficher les informations détaillées d’un morceau ;
- Consulter les statistiques du répertoire musical.
Utilisateur connecté​
Lorsqu’un utilisateur choisit de se créer un compte, il doit fournir :
- Un nom d’utilisateur ;
- Un mot de passe.
Son statut est alors automatiquement défini comme Étudiant. En plus des fonctionnalités développées dans la Partie 1, un utilisateur connecté peut accéder à des options supplémentaires dans le menu principal. Il peut :
- Transférer un morceau du répertoire musical vers une liste de lecture personnelle ;
- Afficher le contenu de sa liste de lecture personnelle ;
- Consulter les informations de son profil :
- Nom d’utilisateur ;
- Mot de passe (masqué à l’aide de caractères « * ») ;
- Statut.
- Modifier son mot de passe.
Liste de lecture personnelle​
Lorsqu’un utilisateur se connecte :
- Si une liste de lecture personnelle existe déjà , elle doit être chargée automatiquement ;
- Si elle n’existe pas, elle doit être créée automatiquement selon la nomenclature suivante :
- ListeDeLecture_nomUtilisateur.csv où nomUtilisateur correspond au nom d'utilisateur défini lors de la création du compte.
Important! Lorsqu’un morceau est transféré du répertoire musical vers la liste de lecture personnelle, il ne s’agit pas d’une nouvelle instance. La liste de lecture doit contenir une référence vers le morceau existant dans le répertoire musical de la radio.
À la fin du programme​
Lors de la fermeture de l’application, la liste de lecture personnelle de l’utilisateur connecté doit être sauvegardée automatiquement.
Exigences techniques​
La classe Utilisateur doit être implémentée en respectant le modèle suivant :​

Propriétés​
MotDePasse : Permet d’obtenir et modifier le mot de passe de l'utilisateur. Cette propriété est en lecture seule à l’extérieur de la classe.
MotDePasseMasqué (propriété calculée) : Retourne le mot de passe sous forme masquée (suite de *). Elle permet d’afficher l’information sans exposer la valeur réelle.
NomFichierListeLecture (propriété calculée) : Génère automatiquement le nom du fichier associé à la liste de lecture personnelle de l’utilisateur selon le format requis.
NomUtilisateur : Propriété en lecture seule permettant d’obtenir le nom d’utilisateur du profil sans permettre sa modification directe.
Statut : Propriété en lecture seule indiquant le type d’utilisateur (Invité ou Étudiant), basé sur l’énumération définie dans la classe.
Méthode ModifierMDP()​
- Rôle : Modifie le mot de passe de l’utilisateur.
- Paramètre : chaîne de caractères représentant le nouveau mot de passe de l’utilisateur.
- Retour : Aucun.
Constructeur par défaut​
- Rôle : Initialise un utilisateur invité avec les valeurs par défaut et le statut Invité.
Constructeur paramétré​
- Rôle : Initialise un utilisateur connecté avec les valeurs par entrées et le statut Étudiant.
Vous devrez utiliser une énumération (enum) pour représenter le statut de l’utilisateur, comme suit :​
Contenu évalué​
- Définir une nouvelle classe
- Encapsulation
- Propriétés calculées
- Type par énumération
- Documentation appropriée des classes et des méthodes
- Gestion globale des versions (add, commit, push, merge, …)