Laboratoire 3 - ÉTS : Cours par sigle · Décomposition d’un polygone concave en polygones...

13
École de technologie supérieure Génie de la production automatisée GPA665 Structures de données et algorithmes Laboratoire 3 Décomposition d’un polygone concave en polygones convexes Responsable du cours : Mohamed Cheriet, ing., Ph. D. Rédaction du laboratoire : Jean-Christophe Demers Révision et barème de correction : Yan Levasseur & Mathieu Binette Temps alloué pour ce laboratoire : 4 périodes de laboratoire Résumé En trois comme en deux dimensions, la gestion de formes à géométrie complexes nécessite beaucoup de manipulations mathématiques. Souvent, ces manipulations seront simplifiées par la décomposition d’une forme concave en plusieurs formes convexes, pour lesquelles les algorithmes d’optimisation sont rapides et efficaces. Le graphisme et la planification de trajectoire d’un robot mobile sont des exemples où la décomposition en formes convexes est très avantageuse. Ce laboratoire vous donnera l’occasion de réaliser un algorithme simple de décomposition en formes convexes. Ce sera l’occasion de mettre en pratique les notions relatives à l’utilisation du TDA arbre. De plus, par ce laboratoire, vous expérimenterez des notions telles que les types structurés, types énumérés, pointeurs, tableaux dynamiques, récursivité, et l’utilisation de structures de données et de fonctions existantes. Il vous incombera donc de développer un algorithme efficace pour résoudre le problème concret de la concavité d’une forme en adoptant une méthode de programmation rigoureuse qui tient compte des concepts fondamentaux de qualité logiciel.

Transcript of Laboratoire 3 - ÉTS : Cours par sigle · Décomposition d’un polygone concave en polygones...

École de technologie supérieure

Génie de la production automatisée

GPA665

Structures de données et algorithmes

Laboratoire 3

Décomposition d’un polygone concave en polygones convexes

Responsable du cours : Mohamed Cheriet, ing., Ph. D. Rédaction du laboratoire : Jean-Christophe Demers Révision et barème de correction : Yan Levasseur & Mathieu Binette Temps alloué pour ce laboratoire : 4 périodes de laboratoire

Résumé

En trois comme en deux dimensions, la gestion de formes à géométrie complexes nécessite beaucoup de manipulations mathématiques. Souvent, ces manipulations seront simplifiées par la décomposition d’une forme concave en plusieurs formes convexes, pour lesquelles les algorithmes d’optimisation sont rapides et efficaces. Le graphisme et la planification de trajectoire d’un robot mobile sont des exemples où la décomposition en formes convexes est très avantageuse.

Ce laboratoire vous donnera l’occasion de réaliser un algorithme simple de décomposition

en formes convexes. Ce sera l’occasion de mettre en pratique les notions relatives à

l’utilisation du TDA arbre. De plus, par ce laboratoire, vous expérimenterez des notions

telles que les types structurés, types énumérés, pointeurs, tableaux dynamiques,

récursivité, et l’utilisation de structures de données et de fonctions existantes.

Il vous incombera donc de développer un algorithme efficace pour résoudre le problème concret de la concavité d’une forme en adoptant une méthode de programmation rigoureuse qui tient compte des concepts fondamentaux de qualité logiciel.

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 2 / 13

Énoncé du problème

La description d’une entité par un polygone apporte des solutions à une multitude de

problèmes de différentes natures. Ainsi, il est pertinent de développer une panoplie

d’outils algorithmiques et géométriques servant à la manipulation de polygones. Or, il

existe plusieurs propriétés particulières aux polygones convexes qui permettent le

développement d’outils puissants, efficaces et uniques, qui sont très lourds ou simplement

irréalisables pour le cas de polygones concaves.

Pour cette raison, il est souvent préférable de diviser un polygone concave en plusieurs

polygones convexes et ainsi pouvoir utiliser les différentes propriétés de ces polygones

particuliers. Malgré tout, la décomposition d’un polygone n’est pas une tâche triviale et

demande l’élaboration d’un algorithme d’une certaine complexité.

Dans ce laboratoire vous aurez à implanter une solution fonctionnelle à ce problème.

Finalement, la nature récursive du problème sera exploitée.

Définitions d’un polygone convexe

Soit P, un polygone formé de n sommets et n segments. P est convexe s’il répond à la

définition suivante (sinon P est concave) :

il est impossible de tracer une droite à l’intérieur du polygone qui traverse le

contour de ce dernier.

Une autre définition utile est :

tous les angles intérieurs du polygone sont inférieurs à 180°.

142,1°121,5°

77,9°

131,6°

125,8°

121,0°

121,5°

77,9°

131,6°

44,0°

52,8°

292,2°

Polygone convexe Polygone concave

Sommets convexes

Sommets concaves

Segments défini par deux sommets

Figure 1 : Exemples de polygone convexe et de polygone concave

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 3 / 13

Nature récursive du problème et structure de données

Intuitivement, il est facile de décomposer un polygone concave en deux sous-polygones

dont un est convexe et l’autre indéfini. Développer un tel algorithme de décomposition

peut être très pratique puisque la nature récursive du problème apparaît dès le départ. En

effet, il suffit d’utiliser simplement ce même algorithme de décomposition sur le

sous-polygone indéfini si ce dernier est concave. De cette façon, en appliquant

récursivement cet algorithme de décomposition sur tous les sous-polygones indéfinis qui

sont concaves, on obtient une décomposition complète du polygone concave initial en

plusieurs polygones convexes.

Puisque cette approche de décomposition donne pour chaque sous-polygone concave

deux sous-polygones pour le décrire, on utilise un arbre binaire permettant de représenter

cette structure de données. Dans ce type d’arbre, chacun des noeuds correspond à un

polygone. Ainsi, la racine correspond au polygone concave initial qui est décrit par toutes

les feuilles de l’arbre (correspondant aux sous-polygones convexes de l’arbre). Il est

intéressant de remarquer que l’arbre obtenu n’est aucunement équilibré puisque ce

dernier possède pour chaque noeud un enfant avec un seul et unique descendant.

Néanmoins, cette représentation d’un polygone concave par des polygones convexes

reste performante et très bien adaptée étant donné la nature récursive du problème.

La figure 4 montre un exemple du résultat obtenu par une telle approche.

Algorithme de décomposition

Il existe plusieurs approches pour décomposer un polygone concave en polygones

convexes. L’approche présentée ici offre certaines caractéristiques intéressantes.

Premièrement elle permet une solution élégante en utilisant l’approche récursive

précédemment expliquée. Deuxièmement, elle permet une décomposition du polygone

initiale en sous-polygones de n sommets et non pas des polygones triangulaires formés

de 3 sommets uniquement (comme plusieurs autres algorithmes le font). De cette façon,

le nombre de sous-polygones convexes nécessaires à la représentation du polygone

concave peut être beaucoup moindre. Finalement, il est possible d’optimiser l’algorithme

de façon à décomposer le polygone concave en un nombre optimal de sous-polygones

convexes. Cette optimisation se fait en prenant, pour chaque appel récursif, le

sous-polygone convexe qui minimise le nombre de sommets du sous-polygone indéfini.

Cette optimisation n’est pas demandée dans le cadre de ce travail1.

L’algorithme de décomposition2 d’un polygone concave en sous-polygones convexes est

réalisé en 2 étapes principales :

1. On identifie tous les sommets Si correspondant aux concavités Ci du polygone P.

2. On détermine si le polygone est concave par le nombre de sommets correspondant aux

concavités (nc). Si nc = 0 alors le polygone est convexe et on arrête le processus, sinon on

divise le polygone concave en deux polygones : un polygone convexe et un polygone indéfini.

Cette division est la partie la plus délicate du travail à faire et se fait en 4 étapes.

i. On identifie un sommet Si pour lequel il existe deux voisins consécutifs, Si+d et Si+2d qui

respectent les trois critères suivants3 :

1 Les étudiants qui trouveront la façon de faire cette optimisation et qui prendront le temps de l’implanter se

mériteront une évaluation plus clémente ! 2 L’algorithme qui est décrit ici est la version simplifiée, sans optimisation.

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 4 / 13

a. le sommet Si+d est un sommet convexe (ceci implique que le polygone formé par les

trois sommets didii SSS 2 est un polygone convexe);

b. le sommet Si+3d est à l’extérieur (la frontière étant incluse) du polygone formé par les

sommets didii SSS 2 ;

c. le segment formé par les sommets Si et Si+2d n’entre pas en collision avec le

polygone à scinder.

ii. On parcourt les sommets du polygone à partir de Si+jd (j = 2) jusqu’à ce qu’on atteigne un

sommet Si+jd qui correspond à l’un des cinq critères suivants :

a. Si+jd est un sommet correspondant à une concavité;

b. le sommet Si+(j+1)d est à l’intérieur (la frontière étant exclue) du polygone formé par

les sommets Si à Si+jd;

c. le segment formé par les sommets Si+(j+1)d et Si entre en collision avec le polygone à

scinder;

d. le polygone créé par les sommets Si à Si+(j+1)d est concave;

e. le polygone créé par les sommet Si à Si+(j+1)d entre en collision avec un des

sommets restants du polygone à scinder.

iii. On scinde le polygone concave P en deux polygones : le polygone convexe Pconvexe

formé par les sommets Si à Si+jd et le polygone indéfini Pindéfini formé par les sommets

Si+(j+1)d à Si (en respectant la définition circulaire des sommets décrivant les polygones).

iv. On recommence récursivement le processus avec Pindéfini

Voici un exemple pas à pas de cet algorithme pour le polygone suivant (les nombres

indiquent l’ordre dans lequel sont définis les sommets) :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Sommets convexes

Sommets concaves

Segments défini par deux sommets

Figure 2 : Polygone concave

3 d est la direction du voisin considéré, c’est-à-dire 1 ou -1. Pour ce laboratoire on simplifie l’algorithme en posant

d = 1.

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 5 / 13

Polygone convexe résultat de l’appel

récursif précédent Polygone indéfinie résultat de l’appel

récursif précédent

Description de l’algorithme pour passer de l’appel récursif courant au suivant

1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Polygone initial. nc = 4 Si = 2 j = 2 défini par la contrainte 2c

2

1

2

3

1

2

3

4

5

6

7

8

9

10

11

12

13

Ces polygones sont le résultat de l’algorithme appliqué au polygone initial après le premier appel de la fonction de décomposition. nc = 4 Si = 1 j = 2 défini par la contrainte 2c

3

1

2

3 1

2

3

4

7

8

9

5

6

10

1112

nc = 4 Si = 1 j = 3 défini par la contrainte 2a

4

1

2

3

4

7

89

10

1

4

5

6

2

3

nc = 4 Si = 3 j = 4 défini par la contrainte 2d

5

5

2

3

4

1

1

23

4

5

6

7

nc = 3 Si = 3 j = 2 défini par la contrainte 2a

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 6 / 13

6

1

2

3

4

56

1

2

3

nc = 2 Si = 3 j = 2 défini par la contrainte 2d

7

2

3

1

12

3

4

5

nc = 1 Si = 2 j = 2 défini par la contrainte 2a

8

1

2

3

34

1

2

nc = 1 Si = 1 j = 2 défini par la contrainte 2d

9

3

1

2

12

3

nc = 0 polygone convexe

fin des appels récursifs

Voici le résultat de la décomposition obtenue :

Figure 3 : Résultat obtenu après la décomposition du polygone concave

Le graphique suivant montre le résultat de l’arbre de décomposition binaire

résultant :

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 7 / 13

1

2

3

4

5

6

7

8

9

10

11

12

13

14

1

2

3

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

7

8

9

1

2

3

5

6

7

89

10

1

4

5

6

2

3

12

13

10

1112

1

2

3

4

1

23

4

5

6

7

5

2

3

4

1

4

56

1

2

3

1

2

3

12

3

4

5

2

3

1

34

1

2

1

2

3

12

3

3

1

2

Figure 4 : Exemple d'arbre binaire obtenu représentant la décomposition d'un polygone concave

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 8 / 13

On remarque que cette décomposition en polygones convexes ne donne pas un nombre

optimal de polygones. Après optimisation, on obtient plutôt cette décomposition qui

contient 5 polygones au lieu des 9 polygones obtenus par l’algorithme de base. N’oublier

pas que vous ne devez pas implanter la version optimisée de l’algorithme, cette partie

n’est ici qu’à titre informatif pour ceux qui désirent aborder le problème.

Figure 5 : Décomposition optimal du polygone concave

Programme à développer

Le programme que vous devez réaliser est évidemment l’implantation de l’algorithme

précédemment décrit. Pour ce faire vous devez respecter tous les points suivants.

Structure logiciel

Votre programme doit être une extension du corps de programme que vous avez utilisé

pour le laboratoire 2. De cette façon, vous aurez accès à toutes les fonctions qui avaient

été préalablement implantées :

gestion de l’interface Windows ;

gestion de la boucle des messages de Windows ;

gestion de la fenêtre de saisie du nom de fichier d’entrée ;

gestion de la fameuse fenêtre « À propos… » ;

gestion des menus et de la barre d’outils ;

toutes les fonctions graphiques sont déjà incluses.

De plus, vous avez à votre portée une bibliothèque de calculs géométriques dédiés à ce

laboratoire. Cette bibliothèque vous donne une solution pour chaque sous-problèmes

posés par l’algorithme de décomposition (principalement la vérification des différentes

contraintes et conditions). Ainsi, il ne vous reste qu’à développer le corps global de

l’algorithme en manipulant adéquatement les types de données et en faisant appel aux

différentes fonctions fournies en temps opportun.

Votre programme doit être en mesure de lire un fichier texte dans lequel se trouve la

description d’un polygone. Vous devez en faire une validation de base afin de vous

assurer que le fichier respecte le format imposé. Après avoir lancé votre algorithme de

décomposition, vous devez afficher les informations suivantes :

tracer tous les polygones convexes résultants de la décomposition (tel que

montré à la figure 3), vous devez par contre afficher chaque polygone d’une

couleur différente;

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 9 / 13

afficher les informations suivantes sur la structure de données :

o le nombre de polygones convexes requis pour la description;

o le nombre total de sommets et de segments utilisés pour décrire tous les

polygones convexes ;

o la somme de tous les périmètres des polygones convexes.

Structure de données à respecter

Tous les types de données sont déjà déclarés dans la bibliothèque de fonctions

géométriques disponible sur le site web. Vous devez donc utiliser correctement les types

déjà définis pour pouvoir utiliser les fonctions existantes. De plus, puisque vous

programmez avec un compilateur C++ nous nous permettons d’utiliser les types booléens

(qui ne sont pas portable directement sur un compilateur C). Voici les types qui ont été

déclarés et que vous devez utiliser :

Un type énuméré IsConvex indiquant si un sommet ou un polygone est

convexe, concave ou indéfini.

typedef enum {icConcave = 0, icConvex = 1, icUndef = 10} IsConvex;

Une structure TVertex contenant les informations pour chaque sommet.

typedef struct {

int X, Y;

IsConvex VertexIsConvex;

} TVertex;

Une structure TPolygon définissant chaque polygone. Cette structure est celle

utilisée pour chaque noeud de l’arbre de représentation binaire. C’est pourquoi on y remarque les deux pointeurs vers les sous-polygones (SubConvexPolygon

et SubUndefPolygon). Puisque le nombre de sommets de chaque polygone est

connu (mémorisé par la variable NbVertices), un tableau de TVertex contenant

la liste des sommets est créé dynamiquement pour chaque nouvel instanciation de polygone via le pointeur Vertices.

typedef struct _TPolygon{

int NbVertices;

TVertex *Vertices;

IsConvex PolygonIsConvex;

struct _TPolygon *SubConvexPolygon;

struct _TPolygon *SubUndefPolygon;

} TPolygon;

Le schéma de la page suivante montre un exemple de cette structure.

Les nombreuses fonctions de traitement sur les polygones sont incluses dans le fichier

présent sur le site web. Vous avez accès directement au code et toute l’information sur

ces fonctions se retrouve aux en-têtes de chaque fonction définie dans le fichier PolygonLibrary.c. Principalement vous allez devoir faire appel aux fonctions suivantes :

DefineVerticesConvexity

DefinePolygonConvexity

PointIsInsideConvexPolygon

SegmentIntersectSegment

SegmentIntersectPolygon

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 10 / 13

X

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvexX

Y

VertexIsConvex

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon X

X

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon X

X

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon X

X

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon

NbVertices

Vertices

PolygonIsConvex

SubConvexPolygon

SubUndefPolygon X

X

X

X

......

......

......

......

Figure 6 : Exemple de la structure de données

Évidemment vous allez devoir réaliser toutes les fonctions nécessaires à la gestion de la

structure de données. C’est-à-dire l’instanciation de toute la structure, l’ajout d’un noeud

dans l’arbre, la suppression de tous les noeuds, la gestion dynamique de la mémoire, la

lecture du fichier d’entrée et toutes les autres fonctions que vous jugerez pertinentes.

Fichier d’entrée

Le fichier d’entrée est normalisé et doit correspondre au format suivant. On retrouve en

en-tête le nombre de noeuds n du polygone. Ensuite, sur n lignes les coordonnées des

sommets décrivant le polygone suivant ce format spécifique (X, Y). Voici un polygone

ainsi que sa représentation selon ce format :

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 11 / 13

13

(100,20)

(40,40)

(40,120)

(140,160)

(120,140)

(160,120)

(120,80)

(140,120)

(60,60)

(220,80)

(160,160)

(260,120)

(260,60)

Figure 7 : Exemple de fichier d'entrée

Lors de la lecture du fichier, vous devez vous assurer que ce dernier et vérifier les 2 points

suivants :

le nombre de sommets indiqué correspond bien au nombre de sommets inclus

dans le fichier;

les coordonnées doivent être inclus dans les intervalles suivants 640,0x et

480,0y .

Informations supplémentaires

Tous les algorithmes qui ont été décrits ici et toutes les fonctions que vous devez utiliser

utilisent une description normalisée du polygone. Ainsi, il est essentiel que tous les

polygones traités (soit ceux en entrée ou ceux que vous générez) soient décrits de la

façon suivante :

les sommets contigus du polygone se retrouvent contigus dans la liste de

description (le tableau référencé par la variable Vertices dans la structure

TPolygon);

la description du polygone se fait toujours dans le sens anti-horaire.

Finalement, vous ne devez utiliser aucune variable globale et votre code doit être lisible

tout en étant bien documenté.

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 12 / 13

Évaluation

L’évaluation de ce laboratoire sera différente des deux laboratoires précédents et permettra à l’évaluateur de faire une évaluation interactive. L’évaluation sera en trois parties :

1. Comme d’habitude, vous devez produire un rapport comprenant un organigramme général du déroulement de votre programme (1 page). Vous devez aussi remplir la grille d’évaluation. Par contre, notez qu’il n’y aura pas de questions à répondre par écrit.

2. Vous aurez à faire une brève présentation orale au chargé de laboratoire. Cette présentation d’une dizaine minutes vous donnera la chance d’expliquer en détail les éléments importants du laboratoire. Par exemple, vous pouvez expliquer votre approche globale, les difficultés que vous avez eues et les solutions que vous avez trouvées.

3. Finalement, vous aurez à répondre aux questions de l’évaluateur (environ 10 minutes également). Ces questions permettront de bien cerner votre niveau de compréhension.

L’évaluation se fera pendant la semaine d’examen. La date exacte n’est pas déterminée mais l’évaluation sera pendant la période des examens finaux. Lors des deux dernières périodes de laboratoire, une feuille circulera vous permettant de réserver un bloc horaire. C’est votre responsabilité de vous présenter à cette évaluation.

À titre indicatif, voici des exemples de questions qui pourraient vous être posées :

Quelle est la pertinence de la structure de données utilisée dans ce laboratoire. En quoi cette structure est-elle mieux adaptée au problème de la division en sous-polygones qu’une autre structure de données ? Donnez les avantages et les inconvénients de la structure de données en arbre pour ce problème.

Que seraient les implications de l’imposition d’une forme plus équilibrée de l’arbre ? Est-ce réalisable ?

Imaginons le problème de la sélection d’un des sous-polygones affiché à l’écran à l’aide de la souris. Élaborez un moyen par lequel il serait possible d’identifier le sous-polygone sélectionné (avec comme seule information la position X et Y de la souris) sans parcourir toute la structure de données. Quel TDA suggèreriez-vous pour cette tâche ?

La remise se fait par un fichier ZIP correspondant aux éléments suivants :

Le dossier principal de votre projet Visual C++ incluant tous ses dépendants (sauf les librairies principales du C/C++). N’oubliez pas de bien documenter votre code source.

Une version exécutable de votre programme.

Un PDF de votre rapport.

Le fichier doit être nommé : GPA665_LAB3_Polygone_VotreNom.ZIP

Le tout doit être remis par courriel au chargé de laboratoire avant la date prescrite.

GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002

LABORATOIRE 3 13 / 13

Grille d’évaluation

En guise d’autoévaluation, imprimez et remplissez vous-même cette section. Mentionnez

une référence (nom de fichier et numéro de ligne) lorsque demandé pour faciliter la

vérification par le correcteur.

Spécifications techniques Oui Non Référence (fichier, ligne)

5 Validation du fichier d’entrée

_____________________

10 Séparation des polygones réussie

10 Affichage des sous-polygones colorés à partir d’un fichier .SDA en animation

_____________________

5 Affichage des statistiques pour les sous-polygones : nombre total de polygones, de segments, somme de tous les périmètres.

_____________________

Spécifications de programmation Oui Non

5 Utilisation de la structure de données imposées (arbre binaire)

_____________________

5 Gestion dynamique de la mémoire et libération de l’espace alloué

_____________________

(-10) Aucune variable globale

Qualité logicielle T.B. Bon Pauvre Référence (fichier, ligne)

5 Modularité : usage généralisé de fonctions et regroupement logique en modules

_____________________

_____________________

5 Robustesse : Précaution pour éviter les problèmes de données erronées, etc.

_____________________

_____________________

5 Documentation : Commentaires pertinents qui accélèrent la compréhension du code

_____________________

_____________________

5 Clarté du code : Code concis et court utilisant les fonctions adaptées

_____________________

_____________________

60 TOTAL

Section réservée au correcteur :

/ 10 Organigramme

/ 30 Évaluation orale, réponses aux

questions

/ 60 Respect des spécifications

/ 100 Total