"Les cours de neeko.fr"

Retour en haut

Java / Android : Correction de l'Examen blanc

Condition de l'examen blanc : 2h30, sur papier. Pas de documents ni d'accès à un ordinateur.

Sur 20 points.

Tous les exercices sont indépendants, sauf précision contraire.

Java

1. Types primitifs (1 point)

Soit le code suivant :

/* Fichier TypesPrimitifs01.java */ public class TypesPrimitifs01 { public static void main(String[] args) { System.out.println(3/2); } }

Que retourne la séquence de commandes suivante ?

javac TypesPrimitifs01.java java TypesPrimitifs01

"1" car ici les littéraux "3" et "2" sont des littéraux de type entier. L'opérateur "/" est donc l'opérateur de division entière qui retourne un entier correspondant au quotient de la division euclidienne.

2. Héritage et Composition (3 points)

D'apres la structure de classe suivante :

abstract class Vehicule { abstract public void avancer(); }

class Voiture extends Vehicule { public void avancer(){ this.rouler(); } public void rouler(){ System.out.println("Je roule"); } }

class Avion extends Vehicule { public void avancer(){ this.voler(); } public void voler(){ System.out.println("Je vole"); } }

class Opel extends Voiture { }

class Porsche extends Voiture { }

class Boeing extends Avion { }

class Airbus extends Avion { }

Pour chaque ligne de code ci-dessous, indiquez son résultat si elle est valide, ou la raison de son invalidité.

Airbus airbusA320 = new Airbus(); airbusA320.voler(); Avion planneur = new Avion(); planneur.voler(); Vehicule boeing747 = new Boeing(); boeing747.voler(); Vehicule concorde = new Airbus(); concorde.avancer(); Voiture opelCorsa = new Opel(); opelCorsa.avancer(); Vehicule velo = new Vehicule(); velo.avancer();

Airbus airbusA320 = new Airbus(); airbusA320.voler(); //Je vole Avion planneur = new Avion(); planneur.voler(); //Je vole : rien ne m'empeche d'instancier directement un avion Vehicule boeing747 = new Boeing(); boeing747.voler(); //Erreur : L'instanciation est correcte, mais l'appel à la méthode est impossible, puisque ma variable est de type Vehicule. //Je ne peux donc appeller que des méthodes de la classe Vehicule ici. Vehicule concorde = new Airbus(); concorde.avancer(); //Je vole : L'instanciation est du meme principe que le précédent, donc bonne. Par contre l'appel de la methode est correct : comme Airbus "est un" avion, c'est la méthode avancer() de la classe Avion qui est exécutée. Voiture opelCorsa = new Opel(); opelCorsa.avancer(); //Je roule : Meme raison que précédent, avec la classe Voiture. Vehicule velo = new Vehicule(); velo.avancer(); //Erreur, je ne peux pas instancier directement un "Vehicule", car c'est une classe Abstraite (abstract) ! C'est obligatoire car elle contient une méthode abstraite (qui n'a pas de "corps").

3. Héritage et composition (3 points)

Soit les classes suivantes :

abstract class Arme { public abstract int getDamages(); }

class Epee extends Arme { public int getDamages(){ return 10; } }

class PistoLaser extends Arme { public int getDamages(){ return 50; } }

Epee epee = new Epee(); PistoLaser pisto = new PistoLaser(); Personnage p1 = new Personnage(epee); Personnage p2 = new Personnage(pisto); int d1 = p1.attaque(); int d2 = p2.attaque(); System.out.println("P1 : " + d1); System.out.println("P2 : " + d2);

P1 : 10 P2 : 50

Ecrivez la classe complete Personnage sachant que la méthode "attaque()" utilise l'instance qui est passée au constructeur de la classe Personnage.

class Personnage { private Arme arme; public Personnage(Arme arme){ this.arme = arme; } public int attaque(){ return this.arme.getDamages(); } }

Gestion de projet

4. Objectif de la gestion de projet (1 point)

Quel est l'objectif visé par la gestion de projet ? Choissisez la bonne réponse et commentez brièvement les 2 autres.

Tout simplement, satisfaire le client. Même si, en général, produire un livrable de haute qualité avec de nombreuses fonctionnalités bien implementées laisse penser que le client sera satisfait, il peut arriver que les critères qui établissent la qualité du livrable ne soient pas ceux du client (autrement dit, le produit est de qualité selon *nous* mais ne satisfait pas le client). C'est pourquoi la gestion de projet doit s'attacher à satisfaire le client avant tout. La deuxième réponse est bien sûr fausse : une estimation exhaustive semble impossible (des évènements imprévus arrivent presque toujours) et les estimations - même non-exhaustives et itératives - restent un moyen, pas un but.

5. Méthodes agiles (1 point)

Donner deux principes qui caractérisent les méthodes agiles.

Systeme d'exploitation

6. Echanges d'information (1 point)

Sous quel nom regroupe-t-on les mécanismes qui pemettent aux processus d'échanger de l'information entre eux ? Android n'en propose qu'un dans son framework. Quel est sont nom ?

Les IPC pour Inter-Processus Communication. Sous Linux, il existe les tubes (pipe), les socket, la mémoire partagée... Sous Android, la communication entre les processus est réalisée par Binder qui est implémenté dans le noyau Linux modifié pour Android et permet d'échanger de l'information sous forme d'objets à travers un mécanisme de mémoire partagé caché à l'utilisateur (et qui est un mécanisme très rapide pour le partage de données).

Android

7. Vues (1 point)

Citez 3 élément permettant de composer une interface utilisateur dans le framework Android. De quelle classe héritent-ils tous ?

TextView, ImageView, RelativeLayout, LinearLayout, Button ... héritent tous de View.

8. Layouts (3 points)

Dessinez schématiquement le résultat du layouts XML suivant

Exemple de schéma attendu :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" android:layout_alignParentRight="true"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/some_text" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:text="@string/some_text" /> </RelativeLayout>

Projet

Marchand de tapis

Vous réalisez une application de vente de tapis.

Voici la description de toutes les classes et interface qui composent cette application.

Pour les classes "CatalogueTapis" et "AfficheTapis", seules les méthodes publiques sont montrées, on imagine que d'autres méthodes privée permettent à ces classes de fonctionner correctement.

9. Complétez (3 points)

Complétez la méthode onCreate ci-dessous pour que tous les composants nécessaires soit initialisés, puis initiez une recherche "en dur" d'un tapis de 2x2 mètres, de moins de 150 euros. Expliquez brièvement le déroulement de la recherche jusqu'a l'affichage du résultat.

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //completez... }

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CatalogueTapis catalogue = new CatalogueTapis(); AfficheTapis afficheur = new AfficheTapis(); RechercheTapis recherche = new RechercheTapis(); recherche.exactHauteur = 200; recherche.exactLargeur = 200; recherche.prixMax = 150; catalogue.rechercheMeilleurTapis(recherche, afficheur); }

On commence par construire un objet contenant les critères de la recherche. On passe cette objet au catalogue, qui va s'occuper de trouver et d'instancier un objet Tapis. L'objet Tapis sera passé à l'afficheur (lui même passé au catalogue), par l'intermédiare de l'interface "TrouveTapisListener".

10. Algo : recherche du meilleur tapis (3 points)

Ecrivez la méthode ayant pour signature private Tapis rechercheTapis(List<Tapis> tousLesTapis, RechercheTapis recherche) contenant un algoritme qui permet de trouver le meilleur tapis parmis la liste de tous les tapis.

Le meilleur tapis doit rassembler toutes ces conditions :

Si aucun tapis n'est trouvé, renvoyer null.

private Tapis rechercheTapis(List<Tapis> tousLesTapis, RechercheTapis recherche){ Tapis meilleurTapis = null; for (int i=0; i < tousLesTapis.size(); i++) { Tapis tapis = tousLesTapis.get(i); if (tapis.largeur == recherche.exactLargeur && tapis.hauteur == recherche.exactHauteur) { if (meilleurTapis == null) { meilleurTapis = tapis; } else { double nouvelleMarge = tapis.prixPublic - tapis.prixAchat; double actuelleMarge = meilleurTapis.prixPublic - meilleurTapis.prixAchat; if (nouvelleMarge > actuelleMarge) { meilleurTapis = tapis; } } } } return meilleurTapis; }

ou...

private Tapis rechercheTapis(List<Tapis> tousLesTapis, RechercheTapis recherche){ Tapis meilleurTapis = null; for (int i=0; i < tousLesTapis.size(); i++) { Tapis tapis = tousLesTapis.get(i); if (tapis.largeur != recherche.exactLargeur) { continue; } if (tapis.hauteur != recherche.exactHauteur) { continue; } if (meilleurTapis == null) { meilleurTapis = tapis; continue; } double nouvelleMarge = tapis.prixPublic - tapis.prixAchat; double meilleureMarge = meilleurTapis.prixPublic - meilleurTapis.prixAchat; if (nouvelleMarge > meilleureMarge) { meilleurTapis = tapis; } } return meilleurTapis; }