NOM : PRÉNOM : TP : G TP EXAMEN DE JAVA 2010-2011 Consignes : avec documents, mais sans téléphone, ordinateur ou autre moyen de communication. Durée : 2h Recommandations : Le code doit être écrit en JAVA (pas de pseudo-code ou de littérature personnelle). Les correcteurs savent que vous n êtes pas des compilateurs, donc ils ne seront pas regardant sur les ; mais n exagérez pas! Si le sujet vous paraît trop long, c est normal!!! Ne vous inquiétez pas : essayez d en faire le maximum et surtout de BIEN faire ce que vous faites. QUESTIONS : QCM (10 points) Entourez la bonne réponse, ou rayez les mauvaises. Bonne réponse =1pt ; mauvaise réponse = -0.5pt ; pas de réponse=0pt. 1. Pour les classes A et B définies comme suit : class A { private int x; public A() { x = 5; public int getx() { return x; class B extends A { private int x; public B() { x = 7; qu affichera le code suivant? A a1 = new A(); B b1 = new B(); A a2 = new B(); System.out.println(a1.getX() + et + b1.getx() + et encore + a2.getx() ); a. 5 et 5 et encore 5 b. 5 et 7 et encore 5 c. 5 et 7 et encore 7 d. autre chose 2. Pour les classes A et B, définies comme suit, cela ne compile pas. Pourquoi? class A { private int x; protected int y; public int z; public A() { x = 5; y = 7; z = 9; 1/10
class B extends A { public B() { x = 7; y = 9 ; z = 11; a. L'accès à x dans B est illégal. b. L'accès à y dans B est illégal. c. L'accès à z dans B est illégal. d. B ne fait pas appel au constructeur de A 3. Soit la classe A suivante : class A { static private int x = 1; public A() { x++; public int getx() { return x; qu affichera le code suivant? A a1 = new A(); A a2 = new A(); A a3 = new A(); System.out.println(a1.getX() + - + a2.getx() + - + a3.getx()) ; a. 1-2 - 3 b. 2-3 - 4 c. 3-3 - 3 d. 4-4 - 4 4. Quelle classe n a pas de classe mère? a. String b. Orpheline c. une classe abstraite d. Object 5. Quelle propriété des classes abstraites est vraie? a. Elle ne peut être instanciée. b. Elle ne peut être dérivée. c. Elle n'a pas de classe mère. d. Elle ne peut pas avoir de données membres. 6. Soit la classe A et les deux interfaces I et J suivantes : interface I { public void methodedei(); interface J { public void methodedej(); 2/10
class A implements I, J{ private int i; public A() { i = 0; Ce code ne compile pas car a. On ne peut pas implémenter les deux interfaces I et J en même temps. b. Il faut utiliser le mot clé extends au lieu de implements. c. Il faut que A redéfinisse les méthodes contenues dans I et J. d. Une autre raison. 7. Soit les classe A et B suivantes : class A { public String name; public A(String n) { name = n; class B { public A mona; public B(A a) { mona = a; Qu'affice le code suivant : A a1 = new A(«nom1») ; B b1 = new B(a1) ; a1.name = «nom2» ; B b2 = new B(a1); System.out.println(b1.mona.name + - + b2.mona.name) ; a. nom1 - nom1 b. nom1 - nom2 c. nom2 - nom2 d. autre 8. Combien d instances de la classe A crée le code suivant? A x,u,v; x = new A(); A y = new A(); y = x; A z = new A(); a. Aucune b. Trois c. Quatre d. Cinq 3/10
9. Les fichiers.class obtenus avec javac contiennent a. Le code source en java. b. Les instructions spécifiques à une architecture, qui seront directement exécutées par le processeur. c. Le bytecode, c'est à dire des instructions d'une machine virtuelle qui seront traduites par un interpréteur. d. Le metacode, c'est à dire des instructions génériques interprétables directement par n'importe quelle architecture de microprocesseur. 10. Le code de la classe MainTest ci-dessous class A { public String getname() { return I'm A ; class B extends A { public String getname() { return I'm B ; class MainTest { public static void main(string args[]) { A a; if(args[0].equals( a )) a = new A(); else a = new B(); System.out.println(a.getName()); est une illustration a. de l héritage b. de l encapsulation c. de la cryptographie d. du polymorphisme EXERCICE : JEmails (15 points) Nous allons réaliser un programme de traitement des emails appelé JEmails. Lisez attentivement le code suivant, et répondez aux questions. 1. Expliquez ce que font les méthodes commentées par a, b, c, d et e. Utilisez les champs de commentaires javadoc (/ /) laissés vides pour l'occasion. 2. Remplissez les méthodes commentées par f, g, h et i en vous aidant des indications fournies. Votre code doit se comporter tel que le suggère le commentaire javadoc de ces méthodes. 4/10
3. Remplissez le corps de la classe DateComparator (commenté par j) en vous inspirant de la classe SenderComparator. Fichier JEmails.java import java.util.; / classe principale du programme JEMails. Contient la liste des comptes emails. / public class JEmails { / liste des comptes emails / List<String> accountfiles; List<Account> accounts; / option pour le tri des emails 0 : par date 1 : par expéditeur / static int sorted = 0; / a / / / public JEmails(String[] filenames) { accountfiles = new ArrayList<String>(); accounts = new ArrayList<Account>(); for(string file : filenames) { Account a = new Account(file); accountfiles.add(file); accounts.add(a); / mets à jour la liste des emails de chacun des comptes / public void checkfornewmails() { System.out.println("checking for new mails..."); / f / / affiche la liste des emails de chacun des comptes en prennant 5/10
en compte l'option de tri / public void updatedisplay() { System.out.println("your emails :"); / g / / b / / / public void infodisplay() { for(int i = 0 ; i < accounts.size(); i++) { Account a = accounts.get(i); System.out.println(accountFiles.get(i)); System.out.println("-----"); System.out.println(a); System.out.println("====="); / variable static déterminant l'état de fonctionnement du programme (true : en marche, false : à l'arrêt) / private static boolean running = false; / méthode principale du programme création d'une nouvelle instance de JEmails, puis boucle tant que le programme est en marche. / public static void main(string args[]) { JEmails jemails = new JEmails(args); running = true; Scanner scan = new Scanner(System.in); while(running) { String next = scan.next(); //ligne entrée au clavier if(next.startswith("n")) //commence par "n" jemails.checkfornewmails(); else if(next.startswith("u")) //commence par "u" jemails.updatedisplay(); else if(next.startswith("s")) //commence par "s" sorted = 1 - sorted; else if(next.startswith("i")) //commence par "i" jemails.infodisplay(); else if(next.startswith("q")) { //commence par "q" System.out.println("quit"); running = false; Fichier Email.java 6/10
import java.util.; / classe encapsulant les données contenues dans un email / public class Email { String from; String to; String subject; Date date; String text; / renvoie l'expéditeur de l'email / public String getsender() { return from; / c / / / public Date getdate() { return date; / renvoie une représentation sous forme de String de la manière suivante : From : <champ from> To : <champ to> date : <champ date> subject : <champ subject> ----- <champ text> / public String tostring() { / h / Fichier Account.java import java.util.; import java.io.; / classe encupsulant les données d'un compte email / public class Account { String emailaddress; String login; String password; String pop3server; 7/10
List<Email> emails; / d / / / public Account(String configfilename) { try { BufferedReader in = new BufferedReader(new FileReader(configFileName)); String line; while((line = in.readline())!= null) { String left = line.substring(0, line.indexof(':')); String right = line.substring(line.indexof(':')); if(left.equalsignorecase("email") ) emailaddress = right; else if(left.equalsignorecase("login")) login = right; else if(left.equalsignorecase("password")) password = right; else if(left.equalsignorecase("pop3")) pop3server = right; in.close(); catch(ioexception e) { e.printstacktrace(); / met à jour la liste des emails avec les nouveaux emails du serveur / public void checkfornewmails() { //code trop long pour la roxe / renvoie la liste des emails triée par date / public List<Email> getemailssortedbydate() { / i / / renvoie la liste des emails triée par expéditeurs / public List<Email> getemailssortedbysender() { 8/10
/ trie la liste des emails avec un comparateur sur les expéditeurs / Collections.sort(emails, new SenderComparator()); return emails; / e / / / public String tostring() { String s = "email : "+emailaddress+"\n"; s += "login : "+login+"\n"; s += "password"+password+"\n"; s += "server : "+pop3server; return s; Fichier SenderComparator.java import java.util.; / comparateur permettant de trier des email par ordre alphabétique d'expéditeur / public class SenderComparator implements Comparator<Email> { public int compare(email e1, Email e2) { return e1.getsender().compareto(e2.getsender()); Fichier DateComparator.java import java.util.; / comparateur permettant de trier des email par ordre alphabétique d'expéditeur / public class DateComparator implements Comparator<Email> { / j / 9/10
À titre d'exemple de configuration de compte, voici le fichier tpjava.conf. On peut utiliser ce fichier en lançant par exemple JEmails avec la commande «java Jemails tpjava.conf» email:tpjava@ensea.fr login:tpjava password:j4v415900d pop3:silver.ensea.fr Espace supplémentaire : 10/10