Projet de Développement en Binôme

Élément Description
Cours associé Ingénierie Logicielle
Référence du devoir Spécifications du devoir
Objectif du projet Maîtriser le processus de collaboration sur un projet

Dépôt GitHub : [https://github.com/xiu-ye/zuoye2]



PSP:

PSP2.1 Étapes du Procsesus Personnel Temps estimé (minutes) Temps réel (minutes)
Planning Planification 40 60
Estimate Estimation de la durée de la tâche 60 90
Development Développement 360 420
Analysis Analyse des besoins (incluant l'apprentissage de nouvelles technologies) 60 80
Design Spec Rédaction de la documentation technique 30 35
Design Review Revue de conception 20 30
Coding Standard Standards de codage (adaptation aux besoins actuels) 20 30
Design Conception détaillée 50 70
Coding Implémentation 190 220
Code Review Revue de code 40 50
Test Tests (auto-test, modifications, soumission) 40 40
Reporting Rapport 40 50
Test Repor Rapport de test 20 30
Size Measurement Calcul de la charge de travail 15 25
Postmortem & Process Improvement Plan Bilan et plan d'amélioration du processus 20 30
Total Total 1005 1260

1.Organisation du Code

Le module de calcul a pour fonctions principales la génération d'expressions mathématiques, l'évaluation de leur valeur et la vérification de leur validité. L'organisation du code se présente comme suit :

  • Classes :
  • Nombre : Encapsule les entiers et les fractions, offrant la simplification de fractions, la représentation en chaîne et la conversion entre types.
  • NoeudExpression : Représente un nœud de l'arbre d'expression, supportant les nœuds feuilles (nombres) et les nœuds internes (opérateurs avec sous-arbres gauche et droit).
  • Fonctions :
  • creer_expression : Génère récursivement un arbre d'expression mathématique aléatoire.
  • evaluer : Calcule récursivement la valeur de l'arbre d'expression.
  • est_valide : Vérifie la validité de l'arbre d'expression.
  • valider_operation : Vérifie la validité d'un opérateur spécifique (comme les contraintes de soustraction et de division).
  • generer_nombre : Génère un nombre aléatoire (entier ou fraction).
  • forme_canonique : Convertit l'arbre d'expression en forme canonique pour éviter les expressions dupliquées.
  • formater_expression : Formate l'arbre d'expression en chaîne avec parenthèses et espaces.

Relations entre Classes et Fonctions

  • Nombre et NoeudExpression constituent les structures de données fondamentales, représentant respectivement les nombres et les nœuds d'expression.
  • creer_expression utilise NoeudExpression pour construire l'arbre et appelle generer_nombre pour générer des nombres aléatoires.
  • evaluer et est_valide s'appuient sur la structure de NoeudExpression pour calculer ou valider l'expression récursivement.
  • valider_operation est une fonction auxiliaire de creer_expression garantissant la validité des expressions générées.
  • forme_canonique et formater_expression standardisent et mettent en forme les expressions.

2.Diagramme de Flux des Fonctions Clés

Voici le diagramme de flux pour creer_expression :

Début
  |
  v
Générer un nombre aléatoire (probabilité 0.3 ou atteint nb_opérations_max) -> Retourner nœud feuille
  |
  v
Sélectionner un opérateur aléatoire (+, -, *, /)
  |
  v
Générer récursivement le sous-arbre gauche
  |
  v
Générer récursivement le sous-arbre droit
  |
  v
Valider la legality de l'opération (valider_operation) -> Si invalide, régénérer
  |
  v
Retourner le nœud interne
Fin


Points Clés et Originalité de l'Algorithme

  • Génération récursif d'expressions : La génération aléatoire récursive d'arbres d'expression assure la diversité et la complexité des expressions.
  • Forme canonique : L'utilisation de forme_canonique empêche la génération d'expressions dupliquées.
  • Vérification de validité : La validation en temps réel de la légalité des opérations de soustraction et de division garantit que les expressions sont calculables.

3.Code Clé du Projet et Explications

Génération d'Expression

def creer_expression(nb_operations_max, valeur_max, operations_courantes=0):
    if operations_courantes > nb_operations_max:
        return None

    if random.random() < 0.3 or operations_courantes == nb_operations_max:
        return NoeudExpression(valeur=generer_nombre(valeur_max))

    operateur = random.choice(['+', '-', '*', '/'])
    gauche = creer_expression(nb_operations_max, valeur_max, operations_courantes + 1)
    droite = creer_expression(nb_operations_max, valeur_max, operations_courantes + 1)

    if not valider_operation(gauche, droite, operateur, valeur_max):
        return creer_expression(nb_operations_max, valeur_max, operations_courantes)

    return NoeudExpression(gauche=gauche, op=operateur, droite=droite)


  • Fonctionnalité : Génère récursivement un arbre d'expression aléatoire.
  • Points essentiels :
  • Le contrôle de la probabilité de génération des nœuds feuilles via random.random().
  • L'utilisation de valider_operation pour garantir la légalité des opérations.

Évaluation de la Valeur d'Expression

def evaluer(noeud):
    if noeud.est_feuille():
        return noeud.valeur.vers_fraction()

    gauche = evaluer(noeud.gauche)
    droite = evaluer(noeud.droite)

    return {
        '+': lambda a, b: a + b,
        '-': lambda a, b: a - b,
        '*': lambda a, b: a * b,
        '/': lambda a, b: a / b
    }[noeud.op](gauche, droite)


  • Fonctionnalité : Calcule récursivement la valeur de l'arbre d'expression.
  • Points essentiels :
  • L'utilisation d'un dictionnaire pour mapper les opérateurs vers les fonctions de calcul correspondantes.
  • L'évaluation récursive des valeurs des sous-arbres gauche et droit.

4. Cas de Test

Voici 10 cas de test avec leurs descriptions :

Cas de Test Résultat Attendu Description
1 + 2 3 Addition simple
3 - 2 1 Soustraction simple
2 * 3 6 Multiplication simple
6 / 2 3 Division simple
1/2 + 1/2 1 Addition de fractions
1/2 - 1/3 1/6 Soustraction de fractions
1/2 * 2/3 1/3 Multiplication de fractions
1/2 / 1/4 2 Division de fractions
1 + 2 * 3 7 Priorité des opérateurs
(1 + 2) * 3 9 Priorité des parenthèses

Vérification de Correctness

  • Chaque résultat attendu est vérifié par calcul manuel.
  • La fonction evaluer est utilisée pour calculer les résultats et les comparer aux valeurs attendues.

5. Bilan du Projet en Binôme

  • Encouragement à l'expérimentation : « Détecter les problèmes est plus précieux que d'avancer rapidement »
  • Expression active de la pensée : Expliquer pendant le codage, comme « ici j'utilise la récursion pour traiter la structure arborescente car le nombre de niveaux est indéterminé »
  • Questions et retours immédiats : Signaler directement les problèmes détectés
  • Éviter le silence prolongé : En cas de blocage, dessiner ensemble un diagramme de flux ou du pseudo-code pour clarifier la logique.

Étiquettes: Python programmation-en-binôme tests-unitaires expressions-mathématiques arbre-binaire

Publié le 9 juin à 19h10