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
Valide / pas valide (2 points)
Pour chaque ligne ci dessous, dites si elle est valide ou non. Si elle n'est pas valide dites pourquoi, et si elle est valide, préciser les conditions de cette validité, si besoin.
Chaque ligne est indépendante.
Exemple : int a = b; est valide, à condition que "b" soit aussi de type "int".
- int x = 12.5;
- boolean majeur = (age > 18);
- double y = 50;
- Animal a = new Chien();
- truc.machin();
- int[] liste = {1, 2, a, b}
- machin.chose = true;
- Hero h = Hero("Superman");
- int x = 12.5; : non valide, car on essaie de stocker un "double" dans un "int".
- boolean majeur = (age > 18); : valide, si age est de type numérique.
- double y = 50; : valide, c'est comme si l'on écrivait double y = 50.0
- Animal a = new Chien(); : valide, si la classe "Chien" hérite la classe ou implémente l'interface "Animal"
- truc.machin(); : valide, si la classe de l'instance "truc" possède une méthode "machin" sans paramètres.
- int[] liste = {1, 2, a, b} : invalide car il manque le ";", sinon valide si a et b sont des "int"
- machin.chose = true; : valide, si la classe de l'instance "machin" possede une propriété de type "boolean" nommée "chose".
- Hero h = Hero("Superman"); : non valide, car il manque le "new". Avec le "new", la condition aurait été que la classe "Hero" possède un constructeur avec un paramètre de type "String"
Appels de méthodes 1 (1 point)
Soit une classe "Personnage" avec une propriété publique de type "int" nommée "life", et une classe "Jeu" déclarée ainsi :
class Jeu { public void attaque1(Personnage p) { Personnage perso = new Personnage(); perso.life = perso.life - 10; } public void attaque2(Personnage perso) { perso.life = perso.life - 10; } public void attaque3(Personnage p) { p.life = p.life - 10; } }
Quel sera le résultat de l'execution de ce code ?
Personnage perso = new Personnage(); perso.life = 100; Jeu jeu = new Jeu(); jeu.attaque1(perso); jeu.attaque2(perso); jeu.attaque3(perso); System.out.println("Il reste : " + perso.life + " points");
Il reste 80 points
Appels de méthodes 2 (1 point)
Soit les méthodes :public int attaque(int valeur){ return valeur - 10; } public int soin(int valeur){ return valeur + 5; }
Quel sera le résultat de l'execution de ce code ?
int res = soin( attaque( soin( attaque( attaque(100) ) ) ) ); System.out.println("Il reste : " + res + " points");
Il reste 80 points
Héritage (2 points)
Représentez les affirmations suivante avec des déclarations de classes Java valides (sans aucune propriétés ni méthodes).
- Un primate est un mammifère.
- Un humain est un primate.
- Un ouran-outang est un primate.
- Un chat est un félin.
- Un félin est un mammifère.
class Mammifere {} class Primate extends Mammifere {} class Humain extends Primate {} class OranOutang extends Primate {} class Felin extends Mammifere {} class Chat extends Felin {}
Android
Hello World ! (1,5 point)
Pour un simple projet Android qui va afficher le message "Hello World", quels sont les 3 composants essentiels de cette application, et quel est leur rôle ?
- Le manifest, qui déclare entre autre la version d'Android utilisée, ainsi que la liste des Activity de mon application.
- L'Activity, qui sera le point d'entrée de mon application.
- Le layout de l'activity, qui permettra de composer l'interface utilisateur.
Strings (1,5 point)
Complétez les phrases suivantes :
Le fichier Strings.xml se trouve dans le dossier /values/ et sert à les chaines de caractères, essentiellement pour simplifier la de l'application.
Grace à son , on peut faire référence à une chaine de caractère avec depuis une activity Java, ou avec @ depuis un layout XML.
Le fichier Strings.xml se trouve dans le dossier res/values/ et sert à centraliser les chaines de caractères, essentiellement pour simplifier la traduction de l'application.
Grace à son identifiant, on peut faire référence à une chaine de caractère avec R.string depuis une activity Java, ou avec @string depuis un layout XML.
Utilisation du framework (3 points)
Soit ce layout pour mon activity :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
Quelles sont les étapes importantes à développer pour que mon Activity puisse être notifiée de la pression de ce bouton ?
- Dans le layout, préciser un id dans la balise du boutton : android:id="@+id/monBouton"
- Dans l'activity, utiliser findViewById(R.id.monBouton) pour récuperer l'instance de Button
- Appeler la méthode setOnClickListener sur l'instance du bouton, en lui passant this, mon activity.
- Ajouter l'implementation de l'interface OnClickListener sur mon Activity
- Implémenter concretement la méthode de l'interface : OnClick sur mon Activity
- Bonus : Importer toutes les classes et interfaces nécessaires : Button et OnClickListener
Projet
Poker version light : la bataille (8 points)
Le projet consiste à simuler un jeu de carte très simple : le jeu la de bataille.
Le déroulement d'une partie (passionnante) :
- On rempli une pioche avec toutes les cartes numériques (de 1 à 10, sans les figures) de chaque "enseigne" (pique, coeur, carreau et trèfle.).
- On tire 5 cartes au hasard de cette pioche pour construire la main du joueur 1.
- On tire 5 autres cartes au hasard de cette même pioche pour construire la main du joueur 2.
- On cherche la meilleure carte de chaque main (la valeur la plus élevée), et on les compare entre elle.
- Le joueur ayant la carte avec la valeur la plus haute gagne la partie.
A partir du déroulement ci dessus et du code existant, complétez le projet en ajoutant les classes et les méthodes manquantes, en respectant le code existant.
Quelques conseils / questions à se poser :
- Dans quel classe implémenter la méthode remplirPioche ? A quoi servent chacun de ces parametres ?
- La classe EnsembleDeCarte permet de représenter à la fois la pioche et les mains des joueurs. A quel moment crée-t-on les instances pour les mains des joueurs ?
- La classe EnsembleDeCarte doit stocker une liste de carte. Par quel moyen ? Est-ce que cette liste est fixe ?
- Si la méthode "tire" vous parait complexe, commencez par vous demander comment faire pour tirer 1 seule carte.
- Si vous avez oublié comment faire quelque chose (tirer une valeur au hasard, par exemple), écrivez du pseudo-code, pour éviter de perdre trop de temps la dessus.
package fr.cnam.bataille; public class HomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); EnsembleDeCarte pioche = new EnsembleDeCarte(); this.remplirPioche(pioche, 1, 10, "pique"); this.remplirPioche(pioche, 1, 10, "coeur"); this.remplirPioche(pioche, 1, 10, "carreau"); this.remplirPioche(pioche, 1, 10, "trefle"); EnsembleDeCarte main1 = pioche.tire(5); EnsembleDeCarte main2 = pioche.tire(5); Carte bestMain1 = main1.meilleureCarte(); Carte bestMain2 = main2.meilleureCarte(); if (bestMain1.valeur > bestMain2.valeur) { System.out.println("Gagnant joueur 1 avec : "); System.out.println(bestMain1.valeur + " de " + bestMain1.enseigne); } else if (bestMain1.valeur < bestMain2.valeur) { System.out.println("Gagnant joueur 2 avec : "); System.out.println(bestMain2.valeur + " de " + bestMain2.enseigne); } else { System.out.println("Ex-aequo !"); } } }
Exemple de sortie :
Gagnant joueur 2 avec : 10 de trefle
class Carte { public int valeur; public String enseigne; }
public class HomeActivity extends Activity { ... public void remplirPioche(EnsembleDeCarte pioche, int valeurMini, int valeurMaxi, String enseigne){ for(int i = valeurMini; i <= valeurMaxi, i++ ){ Carte carte = new Carte(); carte.valeur = i; carte.enseigne = enseigne; pioche.ajoute(carte); } } }
class EnsembleDeCarte {
List