| É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
NombreetNoeudExpressionconstituent les structures de données fondamentales, représentant respectivement les nombres et les nœuds d'expression.creer_expressionutiliseNoeudExpressionpour construire l'arbre et appellegenerer_nombrepour générer des nombres aléatoires.evalueretest_valides'appuient sur la structure deNoeudExpressionpour calculer ou valider l'expression récursivement.valider_operationest une fonction auxiliaire decreer_expressiongarantissant la validité des expressions générées.forme_canoniqueetformater_expressionstandardisent 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_canoniqueempê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_operationpour 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
evaluerest 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.