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
9 votes Python Soumis 4 semaines, 2 jours ago
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
python

Pas de description.

Discussion
2
Connexion pour rejoindre la discussion.
I
@ING_ERGY 4 semaines, 1 jour ago
je remercie tout mes supporteur tous ceux qui on rendu ma victoire possible
S
@sajtech 4 semaines ago
Félicitations Ing Ergy