Numérique et Sciences Informatiques1ère

Décomposer un problème complexe
Exercices corrigés

Maîtrisez la décomposition de problèmes complexes : analyse, découpage en sous-problèmes et résolution modulaire grâce à ces 5 exercices détaillés.

Concepts & Exercices
\(Problème_{complexe} = \sum_{i=1}^{n} SousProblème_i\)
Principe de décomposition
Diviser pour régner
Approche algorithmique
Technique fondamentale
Indépendance
Sous-problèmes autonomes
Chaque partie gérable séparément
Composition
Solution globale
Assemblage des sous-solutions
Global
Module
Fonction
Instruction
Exercice 1
Décomposer la gestion d'une maison intelligente
Exercice 2
Analyser un système de commerce électronique
Exercice 3
Structurer un système de gestion scolaire
Exercice 4
Créer un jeu vidéo simple
Exercice 5
Développer un système de suivi financier
Corrigé : Exercices 1 à 3
1 Décomposition de la gestion d'une maison intelligente
Définition :

Décomposition : Technique consistant à diviser un problème complexe en sous-problèmes plus simples et gérables, chacun pouvant être résolu indépendamment.

Méthodologie de décomposition :
  1. Identifier le problème global à résoudre
  2. Analyser les grandes fonctions du système
  3. Isoler les sous-fonctions distinctes
  4. Organiser les sous-problèmes en modules indépendants
  5. Identifier les relations entre les modules
  6. Valider la complétude de la décomposition
Étape 1 : Problème global

"Concevoir un système de gestion pour une maison intelligente qui contrôle l'éclairage, le chauffage, la sécurité, la musique et l'automatisation des volets."

Étape 2 : Décomposition en sous-problèmes
Contrôle éclairage
Allumer/éteindre, régler intensité, programmer horaires
Contrôle chauffage
Régler température, programmer horaires, modes économie
Sécurité
Surveillance caméras, alarme, détection mouvement
Système audio
Contrôler volume, playlists, diffusion dans zones
Automatisation volets
Monter/descendre, programmation, capteurs lumière
Étape 3 : Relations entre modules
Module Dépendances Communications
Éclairage Sécurité, Volets Activation automatique en cas d'intrusion
Chauffage Éclairage, Sécurité Réduction en mode absence
Sécurité Tous Activation globale en cas d'urgence
5 modules principaux avec interactions définies
Réponse finale :

Le problème de gestion d'une maison intelligente est décomposé en 5 modules indépendants : éclairage, chauffage, sécurité, audio et volets. Chaque module peut être développé séparément avec des interfaces clairement définies.

Règles appliquées :

Modularité : Chaque sous-problème est autonome et bien défini

Encapsulation : Les modules masquent leur implémentation interne

Interfaces claires : Communication standardisée entre modules

2 Analyse d'un système de commerce électronique
Définition :

Système de commerce électronique : Plateforme permettant aux utilisateurs d'acheter des produits en ligne avec gestion des comptes, du panier, du paiement et de la livraison.

Étape 1 : Problème global

"Créer une plateforme e-commerce permettant aux clients de naviguer, rechercher, commander, payer et suivre leurs commandes, tout en gérant les stocks et les ventes pour les vendeurs."

Étape 2 : Décomposition hiérarchique
1
Gestion des utilisateurs - Inscription, connexion, profils, permissions
2
Gestion du catalogue - Produits, catégories, descriptions, images
3
Gestion du panier - Ajout/suppression d'articles, quantités
4
Gestion des commandes - Validation, statut, historique
5
Gestion des paiements - Modes, validation, sécurité
6
Gestion des stocks - Inventaire, seuils, alertes
7
Gestion des livraisons - Adresses, transporteurs, suivi
Étape 3 : Diagramme de décomposition
# Structure du système e-commerce
class SystemeEcommerce:
    def __init__(self):
        self.utilisateurs = GestionUtilisateurs()
        self.catalogue = GestionCatalogue()
        self.panier = GestionPanier()
        self.commandes = GestionCommandes()
        self.paiements = GestionPaiements()
        self.stocks = GestionStocks()
        self.livraisons = GestionLivraisons()

class GestionUtilisateurs:
    def __init__(self):
        self.profiles = []
        self.permissions = {}
    
    def creer_compte(self, utilisateur):
        # Gère l'inscription et la création de compte
        pass

class GestionCatalogue:
    def __init__(self):
        self.produits = []
        self.categories = []
    
    def rechercher_produit(self, critere):
        # Gère la recherche de produits
        pass

class GestionPanier:
    def __init__(self):
        self.articles = []
        self.total = 0
    
    def ajouter_article(self, produit, quantite):
        # Gère l'ajout d'un article au panier
        pass

# Autres classes similaires pour chaque module...
Étape 4 : Avantages de la décomposition
  • Chaque module peut être développé indépendamment
  • Facilité de maintenance et de mise à jour
  • Meilleure réutilisabilité du code
  • Testabilité séparée de chaque module
  • Meilleure collaboration entre développeurs
7 modules principaux pour un système e-commerce complet
Réponse finale :

Le système e-commerce est décomposé en 7 modules distincts : gestion des utilisateurs, catalogue, panier, commandes, paiements, stocks et livraisons. Cette structure permet une gestion modulaire et une évolution progressive.

Règles appliquées :

Responsabilité unique : Chaque module a une fonction claire

Cohésion forte : Les éléments d'un module sont liés entre eux

Couplage faible : Peu de dépendances entre modules

3 Structuration d'un système de gestion scolaire
Définition :

Système de gestion scolaire : Application permettant de gérer les élèves, les enseignants, les cours, les notes, les absences et les plannings d'une institution éducative.

Étape 1 : Problème global

"Développer un système de gestion scolaire qui permet aux administrateurs de gérer les inscriptions, aux enseignants de suivre les performances des élèves, et aux parents de consulter les résultats et absences."

Étape 2 : Décomposition fonctionnelle
Système global
Gestion des personnes
Gestion pédagogique
Gestion administrative
Étape 3 : Sous-modules détaillés
Gestion élèves
Inscriptions, dossiers, photos, contacts parents
Gestion enseignants
Profils, spécialités, emploi du temps
Gestion cours
Matières, programmes, niveaux
Gestion notes
Saisie, calculs, rapports
Gestion absences
Suivi, justificatifs, statistiques
Gestion planning
Emplois du temps, salles, réservations
Étape 4 : Modèle conceptuel
# Modèle de gestion scolaire décomposé
class Ecole:
    def __init__(self):
        self.personnes = PersonnesManager()
        self.cours = CoursManager()
        self.notes = NotesManager()
        self.absences = AbsencesManager()
        self.planning = PlanningManager()

class PersonnesManager:
    def __init__(self):
        self.eleves = []
        self.enseignants = []
        self.administrateurs = []
    
    def ajouter_eleve(self, eleve):
        # Gestion des inscriptions élèves
        pass

class CoursManager:
    def __init__(self):
        self.matieres = []
        self.niveaux = []
        self.classes = []
    
    def affecter_cours(self, enseignant, matiere, classe):
        # Attribution des cours
        pass

class NotesManager:
    def __init__(self):
        self.bulletins = {}
        self.moyennes = {}
    
    def saisir_note(self, eleve, matiere, note, periode):
        # Saisie des notes
        pass

# Continuation pour les autres modules...
Structure hiérarchique: École → Personnes/Cours/Notes/Absences/Planning
Réponse finale :

Le système de gestion scolaire est structuré en 5 modules principaux avec une hiérarchie claire. Cette décomposition permet une gestion modulaire des aspects humains, pédagogiques et administratifs de l'établissement.

Règles appliquées :

Abstraction : Chaque module encapsule sa logique métier

Hiérarchie : Organisation logique des sous-problèmes

Extensibilité : Ajout facile de nouvelles fonctionnalités

Corrigé : Exercices 4 à 5
4 Création d'un jeu vidéo simple
Définition :

Jeu vidéo : Application interactive avec gestion des personnages, des graphismes, de la physique, des collisions, des scores et de l'interface utilisateur.

Étape 1 : Problème global

"Développer un jeu de plateforme 2D où le joueur contrôle un personnage qui doit atteindre la fin du niveau en évitant des obstacles et en collectant des objets."

Étape 2 : Architecture du jeu
Loop principale - Gestion du temps, rendu, entrées
Gestion du joueur - Mouvements, états, collisions
Gestion des entités - Ennemis, objets, décor
Rendu graphique - Affichage sprites, animations
Système audio - Sons, musiques, effets
Gestion du jeu - Scores, vies, états
Étape 3 : Structure de code
# Structure modulaire d'un jeu
class Jeu:
    def __init__(self):
        self.ecran = Ecran()
        self.joueur = Joueur()
        self.entites = EntitesManager()
        self.rendu = RenduManager(self.ecran)
        self.audio = AudioManager()
        self.etat_jeu = EtatJeu()
        
    def boucle_principale(self):
        while self.etat_jeu.en_cours:
            # Gestion des événements
            self.gerer_evenements()
            
            # Mise à jour de la logique
            self.mettre_a_jour()
            
            # Rendu graphique
            self.rendre()
    
    def gerer_evenements(self):
        # Gestion des entrées utilisateur
        pass
    
    def mettre_a_jour(self):
        # Mise à jour de la logique de jeu
        self.joueur.mettre_a_jour()
        self.entites.mettre_a_jour()
        self.verifier_collisions()
    
    def rendre(self):
        # Affichage des éléments
        self.rendu.dessiner_fond()
        self.rendu.dessiner_entites()
        self.rendu.dessiner_ui()

class Joueur:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.vie = 3
        self.score = 0
    
    def deplacer(self, dx, dy):
        # Logique de déplacement
        pass
    
    def subir_degats(self, degats):
        # Gestion des dégâts
        self.vie -= degats

class EntitesManager:
    def __init__(self):
        self.ennemis = []
        self.objets = []
        self.obstacles = []
    
    def verifier_collisions(self):
        # Gestion des collisions
        pass
Étape 4 : Avantages de l'approche modulaire
  • Chaque module peut être testé indépendamment
  • Meilleure lisibilité et maintenabilité du code
  • Facilité d'extension avec de nouvelles fonctionnalités
  • Parallélisation possible du développement
  • Réutilisation potentielle des modules
6 modules principaux pour un jeu de plateforme 2D
Réponse finale :

Le jeu est décomposé en 6 modules principaux : boucle principale, joueur, entités, rendu, audio et gestion du jeu. Cette architecture permet une implémentation modulaire et une évolution aisée.

Règles appliquées :

Séparation des préoccupations : Chaque module gère un aspect spécifique

Flux de données clair : Communication définie entre modules

Temps réel : Gestion appropriée des contraintes temporelles

5 Développement d'un système de suivi financier
Définition :

Système de suivi financier : Application permettant de gérer les transactions, les budgets, les investissements et de produire des rapports financiers détaillés.

Étape 1 : Problème global

"Créer un système de suivi financier personnel qui permet d'enregistrer les revenus et dépenses, de suivre les budgets, de gérer les investissements et de produire des rapports graphiques."

Étape 2 : Décomposition fonctionnelle
Gestion des comptes
Comptes bancaires, cartes de crédit, espèces
Gestion des transactions
Revenus, dépenses, transferts
Gestion des budgets
Catégories, seuils, alertes
Gestion des investissements
Actions, obligations, portefeuille
Génération de rapports
Graphiques, analyses, exportations
Synchronisation
Import de relevés, sauvegarde
Étape 3 : Modèle de données décomposé
# Modèle financier décomposé
class SuiviFinancier:
    def __init__(self):
        self.comptes = GestionComptes()
        self.transactions = GestionTransactions()
        self.budgets = GestionBudgets()
        self.investissements = GestionInvestissements()
        self.rapports = GestionRapports()
        self.synchronisation = GestionSync()
    
    def mettre_a_jour_solde(self):
        # Met à jour les soldes de tous les comptes
        for compte in self.comptes.get_all():
            compte.solde = self.transactions.calculer_solde(compte.id)

class GestionComptes:
    def __init__(self):
        self.comptes = []
    
    def ajouter_compte(self, type_compte, nom, solde_initial=0):
        # Ajoute un nouveau compte
        compte = Compte(type_compte, nom, solde_initial)
        self.comptes.append(compte)
        return compte

class GestionTransactions:
    def __init__(self):
        self.transactions = []
    
    def enregistrer_transaction(self, montant, categorie, compte, date):
        # Enregistre une nouvelle transaction
        transaction = Transaction(montant, categorie, compte, date)
        self.transactions.append(transaction)
        return transaction
    
    def calculer_solde(self, compte_id):
        # Calcule le solde d'un compte
        solde = 0
        for t in self.transactions:
            if t.compte_id == compte_id:
                solde += t.montant
        return solde

class Transaction:
    def __init__(self, montant, categorie, compte_id, date):
        self.montant = montant  # positif pour revenus, négatif pour dépenses
        self.categorie = categorie
        self.compte_id = compte_id
        self.date = date

class Compte:
    def __init__(self, type_compte, nom, solde_initial=0):
        self.type = type_compte
        self.nom = nom
        self.solde = solde_initial
        self.numero = self.generer_numero()

    def generer_numero(self):
        # Génère un numéro de compte unique
        import random
        return f"ACC-{random.randint(10000, 99999)}"

# Module de budget
class GestionBudgets:
    def __init__(self):
        self.budgets = []
        self.depenses_par_categorie = {}
    
    def definir_budget_mensuel(self, categorie, montant_max):
        # Définit un budget mensuel pour une catégorie
        budget = Budget(categorie, montant_max)
        self.budgets.append(budget)
        return budget
    
    def verifier_depassement(self, categorie, montant):
        # Vérifie si le budget est dépassé
        depenses = self.depenses_par_categorie.get(categorie, 0)
        total = depenses + montant
        
        for budget in self.budgets:
            if budget.categorie == categorie:
                if total > budget.montant_max:
                    return True
        return False
Étape 4 : Intégration et validation
\(Solde_{final} = Solde_{initial} + \sum_{i=1}^{n} Transaction_i\)
Calcul du solde

Chaque module contribue à la cohérence globale du système financier.

Système modulaire: Comptes → Transactions → Budgets → Investissements → Rapports
Réponse finale :

Le système de suivi financier est décomposé en 6 modules spécialisés : comptes, transactions, budgets, investissements, rapports et synchronisation. Cette structure permet une gestion précise et une évolution progressive des fonctionnalités.

Règles appliquées :

Intégrité des données : Chaque module assure la cohérence de ses données

Modularité : Les modules peuvent évoluer indépendamment

Fiabilité : Calculs financiers précis et vérifiables

Cours bien détaillé
\(Problème = f(Données, Objectifs, Contraintes)\)
Formulation d'un problème
🎯
Définition : Décomposer un problème complexe consiste à le diviser en sous-problèmes plus simples et gérables, chacun pouvant être résolu indépendamment.
📏
Avantages : Meilleure compréhension, facilité de résolution, modularité, réutilisabilité, testabilité.
📐
Principe : "Diviser pour régner" - Technique algorithmique fondamentale dans la résolution de problèmes complexes.
📝
Applications : Programmation modulaire, conception logicielle, architecture de systèmes, algorithmique.
💡
Conseil : Commencer par identifier les grandes fonctionnalités du système
🔍
Attention : Éviter les dépendances circulaires entre modules
Astuce : Utiliser des diagrammes pour visualiser la structure
📋
Méthode : Appliquer la technique "top-down" ou "bottom-up"
Vérification : S'assurer que la combinaison des sous-solutions résout le problème global
Processus de décomposition :
  • Analyse : Comprendre le problème dans sa globalité
  • Identification : Repérer les sous-fonctions ou modules distincts
  • Isolation : Définir clairement les responsabilités de chaque module
  • Hiérarchisation : Organiser les modules selon leur dépendance
  • Interface : Définir les points de communication entre modules
  • Validation : Vérifier la complétude et la cohérence
  • Implémentation : Développer chaque module indépendamment
Règles importantes :
  • Chaque sous-problème doit être plus simple que le problème global
  • Les modules doivent avoir des interfaces bien définies
  • La décomposition doit être cohérente et complète
  • Chaque module doit avoir une responsabilité unique
  • Les dépendances entre modules doivent être minimisées
  • La solution globale doit émerger de la combinaison des sous-solutions
\(Qualité_{modularité} = \frac{\sum_{i=1}^{n} Cohésion_i}{\sum_{i=1}^{n} Couplage_i}\)
Qualité de la modularité
Décomposer un problème complexe Conception et décomposition de problèmes