Challenge clôturé · 14 Mar 2026
Le Gestionnaire Familial Python : De la Logique à l'Interface
Dans ce challenge, vous allez construire un système complet de gestion familiale. Objectifs : 1. Maîtriser les structures de données (listes, dictionnaires). 2. Manipuler les dates avec le module datetime. …
I
@ING_ERGY
9 votes
1
🏆
// gagnant officiel
@ING_ERGY
solution_winner.python
# Votre solution au challenge ici
# Écrivez du code propre et commenté !
# Définition des membres de la famille
pere = "John"
mere = "Jane"
enfants = ["Anna", "Lucas", "Léa", "Nathan", "Chloé"]
def presenter_la_famille():
print(f"Voici la famille de {pere} et {mere} :")
print(f"Ils ont {len(enfants)} enfants.")
# On utilise une boucle pour lister les enfants
print("Les enfants s'appellent :")
for enfant in enfants:
print(f"- {enfant}")
# Appel de la fonction pour voir le résultat
presenter_la_famille()
# deuxieme partie
# Configuration de la famille
famille = {
"John": "le père, passionné de cuisine.",
"Jane": "la mère, qui adore la peinture.",
"Anna": "l'aînée des 5 enfants, très douée en maths.",
"Lucas": "le deuxième enfant, fan de football.",
"Léa": "la troisième, elle joue du piano.",
"Nathan": "le quatrième, un vrai petit explorateur.",
"Chloé": "la petite dernière, toujours souriante."
}
def presenter_interactif():
print("--- Bienvenue dans l'album de famille ---")
print("Membres : John, Jane, Anna, Lucas, Léa, Nathan, Chloé")
print("(Tapez 'quitter' pour arrêter)\n")
continuer = True
while continuer:
choix = input("De qui voulez-vous faire la connaissance ? ").capitalize()
if choix == "Quitter":
print("Au revoir !")
continuer = False
elif choix in famille:
print(f"Voici {choix} : {famille[choix]}\n")
else:
print(f"Désolé, {choix} ne fait pas partie de cette famille. Réessayez !\n")
# Lancement de l'interaction
presenter_interactif()
# troisième partie
from datetime import date
# On récupère l'année actuelle dynamiquement
annee_actuelle = date.today().year
# Dictionnaire avec l'année de naissance pour chaque membre
# (On imagine que nous sommes en 2026)
famille = {
"John": {"role": "le père", "naissance": 1985},
"Jane": {"role": "la mère", "naissance": 1987},
"Anna": {"role": "l'aînée", "naissance": 2010},
"Lucas": {"role": "le deuxième", "naissance": 2012},
"Léa": {"role": "la troisième", "naissance": 2015},
"Nathan": {"role": "le quatrième", "naissance": 2018},
"Chloé": {"role": "la petite dernière", "naissance": 2021}
}
def presenter_famille_evolutive():
print(f"--- Bienvenue dans la famille en l'an {annee_actuelle} ---")
print("Membres : " + ", ".join(famille.keys()))
while True:
choix = input("\nDe qui voulez-vous des nouvelles ? (ou 'quitter') : ").capitalize()
if choix == "Quitter":
print("À l'année prochaine !")
break
if choix in famille:
infos = famille[choix]
# Calcul de l'âge : Année actuelle - Année de naissance
age = annee_actuelle - infos["naissance"]
print(f"Voici {choix}, {infos['role']}. Cette année, {choix} a {age} ans !")
else:
print(f"Oups, {choix} n'est pas dans la base de données.")
# Lancement
presenter_famille_evolutive()
#quatrièmes partie
from datetime import date
annee_actuelle = date.today().year
famille = {
"John": {"role": "le père", "naissance": 1985, "job": "Architecte"},
"Jane": {"role": "la mère", "naissance": 1987, "job": "Médecin"},
"Anna": {"role": "l'aînée", "naissance": 2010},
"Lucas": {"role": "le deuxième", "naissance": 2012},
"Léa": {"role": "la troisième", "naissance": 2015},
"Nathan": {"role": "le quatrième", "naissance": 2018},
"Chloé": {"role": "la petite dernière", "naissance": 2021}
}
def determiner_activite(nom, age, infos):
# Si c'est un parent (ils ont une clé 'job')
if "job" in infos:
return f"Travaille comme {infos['job']}."
# Si c'est un enfant, on regarde l'âge
if age < 3:
return "Est encore à la maison (trop petit pour l'école)."
elif 3 <= age < 6:
return "Est à l'école maternelle."
elif 6 <= age < 11:
return "Est à l'école primaire."
elif 11 <= age < 15:
return "Est au collège."
elif 15 <= age < 18:
return "Est au lycée."
else:
return "Poursuit ses études supérieures ou travaille."
def presenter_famille_complete():
print(f"--- Chronique de la famille en {annee_actuelle} ---")
while True:
choix = input("\nNom du membre (ou 'quitter') : ").capitalize()
if choix == "Quitter":
break
if choix in famille:
infos = famille[choix]
age = annee_actuelle - infos["naissance"]
activite = determiner_activite(choix, age, infos)
print(f"--- {choix} ---")
print(f"Âge : {age} ans")
print(f"Statut : {activite}")
else:
print("Membre inconnu.")
presenter_famille_complete()
#cinquieme partie
import json
from datetime import date
fichier_famille = "famille.json"
# Données par défaut si le fichier n'existe pas
donnees_par_defaut = {
"John": {"role": "père", "naissance": 1985, "job": "Architecte"},
"Jane": {"role": "mère", "naissance": 1987, "job": "Médecin"}
}
# Charger la famille depuis le fichier ou créer le fichier
try:
with open(fichier_famille, "r") as f:
famille = json.load(f)
except FileNotFoundError:
famille = donnees_par_defaut
with open(fichier_famille, "w") as f:
json.dump(famille, f, indent=4)
def ajouter_membre():
nom = input("Nom du nouveau membre : ").capitalize()
annee = int(input("Année de naissance : "))
role = input("Rôle (ex: enfant, oncle) : ")
famille[nom] = {"role": role, "naissance": annee}
# Sauvegarde immédiate dans le fichier
with open(fichier_famille, "w") as f:
json.dump(famille, f, indent=4)
print(f"{nom} a été ajouté(e) à la famille !")
# Ici, tu pourrais intégrer cette fonction dans ta boucle 'while' précédente
#seizième partie
def afficher_famille_triee(famille):
# Tri par année de naissance (du plus vieux au plus jeune)
# On accède à la clé 'naissance' de chaque dictionnaire membre
membres_tries = sorted(
famille.items(),
key=lambda item: item[1]['naissance']
)
print("\n--- Liste de la famille (du plus âgé au plus jeune) ---")
for nom, infos in membres_tries:
age = date.today().year - infos['naissance']
print(f"{nom} ({age} ans) - {infos['role'].capitalize()}")
# Tu peux appeler cette fonction à chaque fois que tu veux voir l'ordre
# afficher_famille_triee(famille)
#Septième partie
def calculer_ecart_age_moyen(famille):
ages_parents = [2026 - infos['naissance'] for nom, infos in famille.items() if infos['role'] == "père" or infos['role'] == "mère"]
ages_enfants = [2026 - infos['naissance'] for nom, infos in famille.items() if infos['role'] == "enfant"]
if not ages_parents or not ages_enfants:
return 0
# On prend la moyenne d'âge des parents
moyenne_parents = sum(ages_parents) / len(ages_parents)
# On calcule l'écart pour chaque enfant par rapport à la moyenne parentale
ecarts = [abs(moyenne_parents - age) for age in ages_enfants]
return sum(ecarts) / len(ecarts)
# Exemple d'appel :
# moyenne = calculer_ecart_age_moyen(famille)
# print(f"L'écart d'âge moyen entre les parents et les enfants est de {moyenne:.1f} ans.")
#huitième partie
def generer_rapport(famille, nom_fichier="rapport_famille.txt"):
# Tri des membres par âge (du plus jeune au plus vieux)
membres_tries = sorted(
famille.items(),
key=lambda item: item[1]['naissance'],
reverse=True
)
with open(nom_fichier, "w", encoding="utf-8") as f:
f.write(f"--- Rapport de la famille - {date.today().year} ---\n\n")
# Liste triée
f.write("Membres (du plus jeune au plus âgé) :\n")
for nom, infos in membres_tries:
age = date.today().year - infos['naissance']
f.write(f"- {nom} : {age} ans, {infos['role']}\n")
# Ajout des statistiques
f.write("\n--- Statistiques ---\n")
ecart = calculer_ecart_age_moyen(famille)
f.write(f"Écart d'âge moyen (Parents/Enfants) : {ecart:.1f} ans\n")
print(f"Rapport généré avec succès dans : {nom_fichier}")
# Appel de la fonction
# generer_rapport(famille)
#neuvième partie
import os
def generer_rapport_annuel(famille):
annee_actuelle = date.today().year
nom_fichier = f"rapport_famille_{annee_actuelle}.txt"
# On utilise la même logique de tri que précédemment
membres_tries = sorted(famille.items(), key=lambda item: item[1]['naissance'], reverse=True)
with open(nom_fichier, "w", encoding="utf-8") as f:
f.write(f"--- Archive Familiale : {annee_actuelle} ---\n\n")
for nom, infos in membres_tries:
age = annee_actuelle - infos['naissance']
f.write(f"{nom} ({age} ans) - {infos['role']}\n")
print(f"Archive créée avec succès : {nom_fichier}")
#dixieme partie
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
from datetime import date
# Données de la famille
famille = {
"John": 1985, "Jane": 1987, "Anna": 2010,
"Lucas": 2012, "Léa": 2015, "Nathan": 2018, "Chloé": 2021
}
def afficher_graphique():
annee_actuelle = date.today().year
noms = list(famille.keys())
ages = [annee_actuelle - naissance for naissance in famille.values()]
# Création de la figure Matplotlib
fig, ax = plt.subplots(figsize=(6, 4))
ax.bar(noms, ages, color='skyblue')
ax.set_title(f"Âge des membres de la famille en {annee_actuelle}")
ax.set_ylabel("Âge")
# Intégration dans Tkinter
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()
# Initialisation de la fenêtre Tkinter
root = tk.Tk()
root.title("Gestionnaire Familial")
btn = tk.Button(root, text="Afficher le graphique des âges", command=afficher_graphique)
btn.pack(pady=20)
root.mainloop()
#final
import tkinter as tk
from tkinter import messagebox
from datetime import date
# Données de la famille
famille = {"John": 1985, "Jane": 1987, "Anna": 2010}
def ajouter_membre_gui():
nom = entry_nom.get()
try:
annee = int(entry_annee.get())
famille[nom] = annee
messagebox.showinfo("Succès", f"{nom} a été ajouté(e) !")
entry_nom.delete(0, tk.END)
entry_annee.delete(0, tk.END)
except ValueError:
messagebox.showerror("Erreur", "Veuillez entrer une année valide.")
root = tk.Tk()
root.title("Gestionnaire Familial")
# Champs de saisie
tk.Label(root, text="Nom :").pack()
entry_nom = tk.Entry(root)
entry_nom.pack()
tk.Label(root, text="Année de naissance :").pack()
entry_annee = tk.Entry(root)
entry_annee.pack()
btn_ajouter = tk.Button(root, text="Ajouter à la famille", command=ajouter_membre_gui)
btn_ajouter.pack(pady=10)
root.mainloop()
1
Participations
9
Votes totaux
9,0
Moy. votes / entry
1
Langages utilisés
Toutes les participations
1
I
@ING_ERGY
👑
4 semaines, 2 jours ago
Pas de description.
2
Connexion pour rejoindre la discussion.
I
je remercie tout mes supporteur tous ceux qui on rendu ma victoire possible
S
Félicitations Ing Ergy