NFP121
Programmation avancée Session avril 2014 - durée : 3 heures
Documents autorisés
Exercice 1 :
(3 points)1) Donner toutes les relations de sous-typage entre les types suivants, sous forme d'un diagramme : chaque type dans une boîte, et des flèches signifiant « est sous-type de » entre ces boîtes.
○ Object ○ LinkedList<? extends Number>
○ List<Number> ○ List<capture of ? extends Number>
○ List<Integer> ○ List<List<String>>
○ List<? super Number> ○ List<List<?>>
○ List<? extends Number> ○ List<List<capture of ?>>
○ ArrayList<Number> ○ List<? extends List<?>>
○ ArrayList<Object> ○ List<? extends List<capture of ?>>
2) Quel code permet de créer un nouveau tableau de type T[] de 10 cases à partir de l'objet Class<T>.
Exercice 2 :
(4 points)L’architecture des tâches est donnée à la figure ci-dessous où le détail des classes TacheElementaire et TacheComplexe n’est pas donné. Une tâche est caractérisée par un nom et un coût. Une tâche peut être élémentaire ou complexe. Une tâche complexe est composée de sous-tâches. Il est ainsi possible d’ajouter une sous-tâche à une tâche complexe, ajouter(Tache) ou de supprimer une sous-tâche, supprimer(Tache). Le coût d’une tâche complexe est la somme des coûts des tâches qui la composent.
1) Indiquer le ou les patrons de conception utilisés dans cette architecture.
2) Ci-dessous le code de l’interface Tache.
Écrire en Java la classe TacheElementaire qui est une réalisation de l’interface Tache.
public interface Tache {
// Obtenir le nom de la tâche.
String getNom();
// Obtenir le coût de la tâche.
int getCout();
}
3) Une tâche complexe est composée d’un nombre quelconque de tâches. On décide d’utiliser l’interface java.util.Collection pour stocker les sous-tâches. Comme on souhaite pouvoir parcourir toutes les sous-tâches d’une tâche complexe, la classe TacheComplexe réalise l’interface java.lang.Iterable.
Indiquer quel est le coût de la tâche tA construite comme indiqué dans le code ci-dessous : public class TestTache1 {
public static void main(String[] args) {
TacheComplexe tA = new TacheComplexe("A");
tA.ajouter(new TacheElementaire("A1", 10));
tA.ajouter(new TacheElementaire("A2", 20));
} }
System.out.println("Cout de tA = " + tA.getCout());
4) Écrire en Java la classe TacheComplexe.
Exercice 2 :
(13 points)On s'intéresse ici à l'étude d'un système d'aviation civile d'une région déterminée. Ce système est formé d'un ensemble d'aéroports (Pékin, Mumbai, Maynila, Kuala Lampur : losanges jaunes sur la figure ci-dessous), ainsi qu'un ensemble de tours de contrôle (carrés bleus sur la figure ci-dessous). Lors de son trajet (de Mumbai à Maynila par exemple), l'avion détermine son chemin de proche en proche : il demande toujours à la tour de contrôle (numérotés de 1 à 11) qu'il rencontre le reste de son chemin. De plus, les déplacements d'un avion doivent s'effectuer selon la grille régulière sur la figure ci-dessous (une arête représente 15 min de vol et 100km de distance). L'ensemble des tours de contrôle et aéroports (les aéroports sont aussi des tours de contrôle) possèdent des coordonnées sur la grille (des couples (x,y) en commençant par le point en haut à gauche). Il est aussi relié à un même système informatique qui permet de gérer la circulation des avions sur cette plate-forme. Le vol de Mumbai à Maynila passera donc pas les tours 1, 3, 5, 6, 7 et 8.
Dans un premier temps, on va supposer que les vols initiés connaissent a priori leur trajet ainsi que le temps nécessaire. Un vol initié, connaissant déjà son point de départ et son point d'arrivée, doit se renseigner sur l'état de la météo dans l'aéroport de départ. Les aéroports doivent donc maintenir cette information à jour.
Une mauvaise météo dans un aéroport de départ obligera l'avion à voler à basse altitude pendant un certain temps avant de regagner son altitude habituelle. Un vol est donc aussi caractérisé par son altitude de croisière. Il est également caractérisé par une distance maximale que l'avion peut parcourir (quantité de carburant). Il faut donc s'assurer avant le départ que la distance prévue pour le vol (aussi caractéristique du vol) est inférieure à 80 % de la distance maximale (le reste forme la marge de sécurité au niveau de la quantité de carburant). Le tableau ci-dessous résume les caractéristiques des différents appareils.
Le système qu'on aimerait mettre en place permet de contrôler l'ensemble des vols sur la plate-forme.
1) Diagramme de classes: (2pts)
Proposer un diagramme de classes pour ce système.
2) Codage Java : (2pts)
Implémentez votre solution Java pour créer les vols suivants :
Nom du vol Départ Arrivée Départ (GMT) Durée Appareil
ID200 Mumbai Maynila 10:25 3h30 Airbus 111
MH370 Kuala Lampur Pékin 11:26 5h Airbus 111
MH911 Kuala Lampur Maynila 16:00 3h Airbus 120
3) Entrées-Sorties : (2pts)
Chaque heure, l'opérateur souhaite extraire deux fichiers XML, l'un contenant les vols en cours, et l'autre contenant les vols arrivés à destination durant l'heure passée. Mettez en place le code Java nécessaire pour implémenter ce cas d'utilisation. On utilisera une boucle infinie pour simuler l'écoulement du temps. Des pauses de 500ms seront utilisées pour simuler 20 minutes de temps (à adapter si nécessaire). Un vol est supposé arrivé à destination lorsque sa durée est écoulée par rapport à l'heure de départ.
4) Interface graphique : (3,5pts)
Proposer une interface graphique pour gérer cette plate-forme : initier des vols, afficher les vols en cours ainsi que leurs altitudes, consulter et mettre à jour la météo,… Une partie de cette interface sera consacrée aux aéroports (météo,emplacement,...), et une autre aux vols (altitude, destination,...).
Une grande importance sera accordée à l'ergonomie et aux choix des composants. Sur votre feuille d'examen, schématisez l'ensemble en spécifiant le rôle (avec argumentation) de chaque composant.
5) Les threads : (3,5pts)
Contrairement à ce qui a été supposé plus haut, on va considérer ici qu'un avion détermine son trajet de proche en proche (en consultant les tours de contrôle). Le déroulement des vols sera simulé par des threads parallèles. Un vol sera donc représenté par un thread qui, au lancement, devra consulter la météo et initier le vol. Pour le trajet Kuala Lampur-Pékin, le vol sera initié avec la direction de vol vers la tour de contrôle numéro 4 (a=0 et b=1). Arrivée au point 4, l'avion demandera la suite de son chemin à la tour 4, qui lui indiquera de changer de direction de vol vers le nord (a=-1, b=0) et de voler pendant 30 min (l'avion sera donc dans la mesure d'entrer en contact avec la tout n°3 au bout de 30 min), ainsi de suite. Le tableau ci-dessous résume les messages envoyés par les tours de contrôle.
Lors de l'initiation, le vol consultera aussi la météo (variable à deux niveaux : bonne et mauvaise). Une mauvaise météo obligera l'avion en question à voler à basse altitude (80 % de son altitude de croisière) pendant 45 minutes, avant de regagner progressivement son altitude habituelle au bout de 30 min.
Pour connaître son chemin, un avion communique avec la tour de contrôle à une fréquence (en MHz) qui dépend de son altitude : f = 120 + |A – 12 000| / 1000 , où A est l'altitude de l'appareil. Les tours de contrôle connaissent déjà le plan de tous les vols ainsi que leurs altitudes. Pour guider les avions, une tour va émettre (5 min avant le passage de l'avion, jusqu'à 5 min après) l'information qu'il faut sur la fréquence prévue qui sera capturée par l'avion ciblé. L'avion ira donc chercher cette information à la fréquence calculée à partir de son altitude pour connaître la suite de son chemin. Si la tour consultée correspond au point d'arrivée, alors le vol est terminé. Il est à noter que les tours émettent leurs signaux de façon ponctuelle, c'est à dire qu'un signal émis par la tour 7 par exemple n'est pas capturé par un avion au point 10.
On va créer les vols suivants :
Nom du vol Départ Arrivée Départ (GMT) Durée Appareil
ID200 Mumbai Maynila 10:25 3h30 Airbus 111
MH370 Kuala Lampur Pékin 11:25 5h Airbus 111
Les vols ID200 et MH370 ont des altitudes de croisière respectives de 13 000 m et 10 000m.
Tous les soirs (19h), un contrôle systématique est effectué sur les fichiers XML contenant les vols en cours et les vols arrivés à destination. Est-ce que tout est dans l'ordre ? Où est passé le vol MH370 ?