# Corrigé du TP Z-Event --- ## Partie 1 : Le compteur (variables et types) ### 1.1. État de la cagnotte **Question 1.1** : ```python pourcentage = round(collecte / objectif * 100, 2) print(f"Objectif atteint à {pourcentage} %") # Objectif atteint à 73.5 % ``` **Question 1.2** : ```python reste = objectif - collecte print(f"Il manque {reste} euros") # Il manque 662549.25 euros ``` ### 1.2. Le piège du compteur **Question 1.3** : ```python don_1 = "25" don_2 = "40" total = don_1 + don_2 print(total) # affiche 2540 : sur deux chaînes, + est une concaténation # Correction : convertir les chaînes en nombres avant d'additionner total = int(don_1) + int(don_2) print(total) # 65 ``` ## Partie 2 : L'annonce des dons (fonctions) ### 2.1. Formater un don **Question 2.1** : ```python def formater_don(pseudo, montant): return f"{pseudo} vient de donner {montant} euros" # Test print(formater_don("Nyx_42", 5.0)) # Nyx_42 vient de donner 5.0 euros print(formater_don("Marion_NSI", 100.0)) # Marion_NSI vient de donner 100.0 euros ``` ### 2.2. Repérer les gros dons **Question 2.2** : ```python def est_gros_don(montant, seuil=50): return montant >= seuil # Test print(est_gros_don(120.0)) # True print(est_gros_don(50.0)) # True print(est_gros_don(20.0)) # False print(est_gros_don(20.0, 10)) # True ``` ### 2.3. Les paliers **Question 2.3** : ```python def palier(total): if total < 500000: return "Départ" elif total < 1000000: return "Palier 1" elif total < 2000000: return "Palier 2" else: return "Objectif" # Test print(palier(120000)) # Départ print(palier(750000)) # Palier 1 print(palier(1837450.75)) # Palier 2 print(palier(2500000)) # Objectif ``` ### 2.4. Le message complet **Question 2.4** : ```python def annonce_regie(pseudo, montant): message = formater_don(pseudo, montant) if est_gros_don(montant): message = message + " [GROS DON]" return message # Test print(annonce_regie("Poulpe3000", 2.0)) # Poulpe3000 vient de donner 2.0 euros print(annonce_regie("Anonyme", 250.0)) # Anonyme vient de donner 250.0 euros [GROS DON] ``` ## Partie 3 : L'historique des dons (boucles et listes) ### 3.1. Le total collecté **Question 3.1** : ```python def total_dons(liste_dons): total = 0 for don in liste_dons: total = total + don["montant"] return total # Test print(total_dons(dons)) # 1449.5 print(total_dons([])) # 0 ``` ### 3.2. Le don le plus élevé **Question 3.2** : ```python def plus_gros_don(liste_dons): record = liste_dons[0] # on part du premier don, surtout pas de 0 for don in liste_dons: if don["montant"] > record["montant"]: record = don return record # Test record = plus_gros_don(dons) print(record["pseudo"], record["montant"]) # Anonyme 500.0 ``` ### 3.3. Compter et filtrer **Question 3.3** : ```python def compter_gros_dons(liste_dons, seuil=50): compteur = 0 for don in liste_dons: if est_gros_don(don["montant"], seuil): compteur = compteur + 1 return compteur # Test print(compter_gros_dons(dons)) # 7 print(compter_gros_dons(dons, 100)) # 4 ``` **Question 3.4** : ```python def donateurs(liste_dons): pseudos = [] for don in liste_dons: if don["pseudo"] not in pseudos: pseudos.append(don["pseudo"]) return pseudos # Test print(donateurs(dons)) # ['Nyx_42', 'TitiLeBg', 'Camille_R', 'Poulpe3000', 'Anonyme', 'Sam_du_59', 'Lulu_2007', 'Marion_NSI', 'Kevin_B'] ``` ### 3.4. Le bandeau des derniers dons **Question 3.5** : ```python def derniers_dons(liste_dons, n): return liste_dons[-n:] # Test for don in derniers_dons(dons, 3): print(don["heure"], don["pseudo"]) # 21:39 Anonyme # 21:48 Poulpe3000 # 21:59 Marion_NSI ``` ## Partie 4 : Le classement des chaînes (dictionnaires) ### 4.1. La cagnotte de chaque chaîne **Question 4.1** : ```python def cagnottes(liste_dons): totaux = {} for don in liste_dons: streamer = don["streamer"] if streamer in totaux: totaux[streamer] = totaux[streamer] + don["montant"] else: totaux[streamer] = don["montant"] return totaux # Test totaux = cagnottes(dons) print(totaux["Antoine Daniel"]) # 115.0 print(totaux["Joueur du Grenier"]) # 140.0 print(len(totaux)) # 13 ``` ### 4.2. La chaîne en tête **Question 4.2** : ```python def meilleure_chaine(totaux): meilleur = None for streamer in totaux: if meilleur is None or totaux[streamer] > totaux[meilleur]: meilleur = streamer return meilleur # Test print(meilleure_chaine(cagnottes(dons))) # MisterMV ``` ### 4.3. Le détail des dons **Question 4.3** : ```python def dons_par_chaine(liste_dons): detail = {} for don in liste_dons: streamer = don["streamer"] if streamer not in detail: detail[streamer] = [] detail[streamer].append(don["montant"]) return detail # Test detail = dons_par_chaine(dons) print(detail["MisterMV"]) # [20.0, 12.0, 500.0] print(detail["Baghera Jones"]) # [15.5, 5.0, 35.0] ``` ### 4.4. Le podium **Question 4.4** : ```python def podium(totaux): classement = sorted(totaux, key=lambda streamer: totaux[streamer], reverse=True) return classement[:3] # Test print(podium(cagnottes(dons))) # ['MisterMV', 'Domingo', 'Ultia'] ``` ## Partie 5 : Le planning et les raids (synthèse) ### 5.1. Qui est à l'antenne **Question 5.1** : ```python def a_l_antenne(planning, heure): for streamer, debut, fin in planning: if debut < fin: if debut <= heure < fin: return streamer else: # créneau à cheval sur minuit if heure >= debut or heure < fin: return streamer return None # Test print(a_l_antenne(planning, 19)) # Antoine Daniel print(a_l_antenne(planning, 22)) # Joueur du Grenier print(a_l_antenne(planning, 1)) # Baghera Jones print(a_l_antenne(planning, 10)) # None ``` ### 5.2. Suivre la chaîne des raids **Question 5.2** : ```python def suivre_raids(raids, depart): parcours = [depart] courant = depart while raids.get(courant): # .get évite l'erreur si la clé est absente courant = raids[courant][0] parcours.append(courant) return parcours # Test print(suivre_raids(raids, "Antoine Daniel")) # ['Antoine Daniel', 'MisterMV', 'Joueur du Grenier', 'Baghera Jones', 'Ultia'] print(suivre_raids(raids, "Horty")) # ['Horty', 'Sylvain Levy'] print(suivre_raids(raids, "Ultia")) # ['Ultia'] ``` --- ## Code complet fonctionnel ```python # Toutes ces données sont inventées pour l'exercice. objectif = 2500000 collecte = 1837450.75 dons = [ {"pseudo": "Nyx_42", "streamer": "Antoine Daniel", "montant": 5.0, "heure": "18:04"}, {"pseudo": "TitiLeBg", "streamer": "MisterMV", "montant": 20.0, "heure": "18:11"}, {"pseudo": "Camille_R", "streamer": "Joueur du Grenier", "montant": 50.0, "heure": "18:23"}, {"pseudo": "Nyx_42", "streamer": "Baghera Jones", "montant": 15.5, "heure": "18:37"}, {"pseudo": "Poulpe3000", "streamer": "Horty", "montant": 2.0, "heure": "18:41"}, {"pseudo": "Anonyme", "streamer": "Ultia", "montant": 120.0, "heure": "18:52"}, {"pseudo": "Sam_du_59", "streamer": "Antoine Daniel", "montant": 10.0, "heure": "19:03"}, {"pseudo": "Camille_R", "streamer": "Sylvain Levy", "montant": 30.0, "heure": "19:14"}, {"pseudo": "Lulu_2007", "streamer": "ZeratoR", "montant": 8.5, "heure": "19:20"}, {"pseudo": "TitiLeBg", "streamer": "Etoiles", "montant": 45.0, "heure": "19:33"}, {"pseudo": "Marion_NSI", "streamer": "Joueur du Grenier", "montant": 75.0, "heure": "19:47"}, {"pseudo": "Poulpe3000", "streamer": "MisterMV", "montant": 12.0, "heure": "19:55"}, {"pseudo": "Anonyme", "streamer": "Domingo", "montant": 250.0, "heure": "20:08"}, {"pseudo": "Kevin_B", "streamer": "Baghera Jones", "montant": 5.0, "heure": "20:16"}, {"pseudo": "Nyx_42", "streamer": "Maghla", "montant": 60.0, "heure": "20:29"}, {"pseudo": "Sam_du_59", "streamer": "Horty", "montant": 3.5, "heure": "20:38"}, {"pseudo": "Marion_NSI", "streamer": "Antoine Daniel", "montant": 100.0, "heure": "20:44"}, {"pseudo": "Lulu_2007", "streamer": "Alphacast", "montant": 18.0, "heure": "20:57"}, {"pseudo": "Camille_R", "streamer": "Ultia", "montant": 40.0, "heure": "21:05"}, {"pseudo": "Kevin_B", "streamer": "Ponce", "montant": 22.5, "heure": "21:12"}, {"pseudo": "TitiLeBg", "streamer": "Joueur du Grenier", "montant": 15.0, "heure": "21:26"}, {"pseudo": "Anonyme", "streamer": "MisterMV", "montant": 500.0, "heure": "21:39"}, {"pseudo": "Poulpe3000", "streamer": "Sylvain Levy", "montant": 7.5, "heure": "21:48"}, {"pseudo": "Marion_NSI", "streamer": "Baghera Jones", "montant": 35.0, "heure": "21:59"}, ] planning = [ ("Antoine Daniel", 18, 20), ("MisterMV", 20, 22), ("Joueur du Grenier", 22, 24), ("Baghera Jones", 0, 3), ("Ultia", 3, 6), ] raids = { "Antoine Daniel": ["MisterMV"], "MisterMV": ["Joueur du Grenier", "Horty"], "Joueur du Grenier": ["Baghera Jones"], "Baghera Jones": ["Ultia"], "Ultia": [], "Horty": ["Sylvain Levy"], "Sylvain Levy": [], } pourcentage = round(collecte / objectif * 100, 2) print(f"Objectif atteint à {pourcentage} %") # Objectif atteint à 73.5 % reste = objectif - collecte print(f"Il manque {reste} euros") # Il manque 662549.25 euros don_1 = "25" don_2 = "40" total = don_1 + don_2 print(total) # affiche 2540 : sur deux chaînes, + est une concaténation # Correction : convertir les chaînes en nombres avant d'additionner total = int(don_1) + int(don_2) print(total) # 65 def formater_don(pseudo, montant): return f"{pseudo} vient de donner {montant} euros" # Test print(formater_don("Nyx_42", 5.0)) # Nyx_42 vient de donner 5.0 euros print(formater_don("Marion_NSI", 100.0)) # Marion_NSI vient de donner 100.0 euros def est_gros_don(montant, seuil=50): return montant >= seuil # Test print(est_gros_don(120.0)) # True print(est_gros_don(50.0)) # True print(est_gros_don(20.0)) # False print(est_gros_don(20.0, 10)) # True def palier(total): if total < 500000: return "Départ" elif total < 1000000: return "Palier 1" elif total < 2000000: return "Palier 2" else: return "Objectif" # Test print(palier(120000)) # Départ print(palier(750000)) # Palier 1 print(palier(1837450.75)) # Palier 2 print(palier(2500000)) # Objectif def annonce_regie(pseudo, montant): message = formater_don(pseudo, montant) if est_gros_don(montant): message = message + " [GROS DON]" return message # Test print(annonce_regie("Poulpe3000", 2.0)) # Poulpe3000 vient de donner 2.0 euros print(annonce_regie("Anonyme", 250.0)) # Anonyme vient de donner 250.0 euros [GROS DON] def total_dons(liste_dons): total = 0 for don in liste_dons: total = total + don["montant"] return total # Test print(total_dons(dons)) # 1449.5 print(total_dons([])) # 0 def plus_gros_don(liste_dons): record = liste_dons[0] # on part du premier don, surtout pas de 0 for don in liste_dons: if don["montant"] > record["montant"]: record = don return record # Test record = plus_gros_don(dons) print(record["pseudo"], record["montant"]) # Anonyme 500.0 def compter_gros_dons(liste_dons, seuil=50): compteur = 0 for don in liste_dons: if est_gros_don(don["montant"], seuil): compteur = compteur + 1 return compteur # Test print(compter_gros_dons(dons)) # 7 print(compter_gros_dons(dons, 100)) # 4 def donateurs(liste_dons): pseudos = [] for don in liste_dons: if don["pseudo"] not in pseudos: pseudos.append(don["pseudo"]) return pseudos # Test print(donateurs(dons)) # ['Nyx_42', 'TitiLeBg', 'Camille_R', 'Poulpe3000', 'Anonyme', 'Sam_du_59', 'Lulu_2007', 'Marion_NSI', 'Kevin_B'] def derniers_dons(liste_dons, n): return liste_dons[-n:] # Test for don in derniers_dons(dons, 3): print(don["heure"], don["pseudo"]) # 21:39 Anonyme # 21:48 Poulpe3000 # 21:59 Marion_NSI def cagnottes(liste_dons): totaux = {} for don in liste_dons: streamer = don["streamer"] if streamer in totaux: totaux[streamer] = totaux[streamer] + don["montant"] else: totaux[streamer] = don["montant"] return totaux # Test totaux = cagnottes(dons) print(totaux["Antoine Daniel"]) # 115.0 print(totaux["Joueur du Grenier"]) # 140.0 print(len(totaux)) # 13 def meilleure_chaine(totaux): meilleur = None for streamer in totaux: if meilleur is None or totaux[streamer] > totaux[meilleur]: meilleur = streamer return meilleur # Test print(meilleure_chaine(cagnottes(dons))) # MisterMV def dons_par_chaine(liste_dons): detail = {} for don in liste_dons: streamer = don["streamer"] if streamer not in detail: detail[streamer] = [] detail[streamer].append(don["montant"]) return detail # Test detail = dons_par_chaine(dons) print(detail["MisterMV"]) # [20.0, 12.0, 500.0] print(detail["Baghera Jones"]) # [15.5, 5.0, 35.0] def podium(totaux): classement = sorted(totaux, key=lambda streamer: totaux[streamer], reverse=True) return classement[:3] # Test print(podium(cagnottes(dons))) # ['MisterMV', 'Domingo', 'Ultia'] def a_l_antenne(planning, heure): for streamer, debut, fin in planning: if debut < fin: if debut <= heure < fin: return streamer else: # créneau à cheval sur minuit if heure >= debut or heure < fin: return streamer return None # Test print(a_l_antenne(planning, 19)) # Antoine Daniel print(a_l_antenne(planning, 22)) # Joueur du Grenier print(a_l_antenne(planning, 1)) # Baghera Jones print(a_l_antenne(planning, 10)) # None def suivre_raids(raids, depart): parcours = [depart] courant = depart while raids.get(courant): # .get évite l'erreur si la clé est absente courant = raids[courant][0] parcours.append(courant) return parcours # Test print(suivre_raids(raids, "Antoine Daniel")) # ['Antoine Daniel', 'MisterMV', 'Joueur du Grenier', 'Baghera Jones', 'Ultia'] print(suivre_raids(raids, "Horty")) # ['Horty', 'Sylvain Levy'] print(suivre_raids(raids, "Ultia")) # ['Ultia'] ``` --- Auteur : Florian Mathieu Licence CC BY-SA Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.