Examen Algorithmique – Programmation FIP (ING39)

Transcription

Examen Algorithmique – Programmation FIP (ING39)
Examen Algorithmique – Programmation FIP (ING39)
V. Aponte, P. Courtieu, S. Rosmorduc
Nov 2013
Exercice 1 Les collections (6 points)
On utilise les classes Contact et RepTel pour modéliser un répertoire téléphonique formé d’un ensemble
de contacts. Chaque contact est donné par son nom et la liste, sans doublons, de ses numéros de téléphone
(String). Le code de la classe Contact vous est fourni. Un répertoire est représenté par une table d’associations entre noms de contacts (String) et objets Contact. Les noms de contacts doivent être tous différents,
sans distinction entre minuscules et majuscules. Une partie de la classe RepTel vous est fournie. Vous devrez
la compléter en suivant les consignes imposées par les questions suivantes.
Code fourni :
/** Classe pour modéliser un contact **/
public class Contact {
private String nom;
private Set<String> numTel;
public Contact(String n){
nom = n;
numTel = new HashSet<String>();
}
public String getNom() { return nom;}
/** Ajoute un numero de telephone (sans doublons)
public void ajoutNum(String num) {
numTel.add(num);
}
/** Teste si ce contact contient le numero
public boolean contientNumero(String num) {
return numTel.contains(num);
}
}
/** Classe pour modéliser un répertoire **/
public class RepTel {
private String nom;
private HashMap<String,Contact> rep;
1
*/
*/
public RepTel(String n){
nom=n; rep = new HashMap<String,Contact>();
}
// ... A completer
Question 1.1 (méthode nouveauContact)
La méthode nouveauContact(nc, nums) doit ajouter un nouveau contact de nom nc, avec tous
les numéros du tableau nums. Afin d’éviter l’ajout multiple d’un nom identique aux majuscules/minuscules près, l’ajout d’un nouveau nom dans le répertoire se fait après avoir convertit celui-ci en minuscules.
Complétez le code de la méthode nouveauContact.
public class RepTel {
...
/** Ajoute un nouveau contact dans le repertoire
* @param nc nom du contact
* @param nums tableau de numeros du contact
**/
public void nouveauContact(String nc, String [] nums){
Contact c = new Contact(nc);
// A compléter
...
String key = nc.toLowerCase();
rep.put(key, c);
}
}
Question 1.2 (Enlever des contacts)
Ajouter une méthode enleveContactDeNumero() qui prend en paramètre un numéro, et retire du
répertoire tous les contacts qui possèdent ce numéro. La méthode renvoie false si aucun contacte n’a pu
être enlevé. Attention : plusieurs contacts du répertoire peuvent contenir un même numéro, il faut alors tous
les enlever.
public void enleveContactDeNumero(String num){
// A compléter
Exercice 2 Invariants et tests (6 points)
Considérez la classe suivante. Cette classe devrait vérifier à tout moment l’invariant suivant :
Si le tableau data est null ou vide alors x vaut 0, sinon x a la plus grande valeur du tableau data.
1
public class A {
2
2
private int x = 0;
private int[] data;
3
4
5
public A(int[] d0) {
data = d0;
updateX();
}
6
7
8
9
10
// Change x pour satisfaire invariant
private void updateX() {
if (data == null || data.length == 0) {
x = 0;
} else {
x = data[0];
for (int i = 1; i < data.length; i++) {
if (data[i] > x) {
x = data[i];
}
}
}
}
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Incremente toutes les valeurs du tableau
public void incr() {
for (int i = 0; i < data.length; i++) {
data[i] = data[i] + 1;
}
updateX();
}
32
public boolean testInvariant(){
// A completer
}
33
34
35
36
}
Partie I : tests
Question 2.1
On souhaite tester que l’invariant de cette classe est maintenu à la création de tout objet, et après chaque
appel de méthode. Depuis la classe de test on ne pourrra accèder aux variables d’instance privées et on ne
pourra tester que les méthodes publiques. Ecrivez la méthode testInvariant() qui renvoie true si l’état
courant de l’objet satisfait l’invariant. Cette méthode vous servira à réaliser des cas de test JUNIT dans les
questions suivantes.
Question 2.2
Donnez 2 cas répresentatifs de tests JUNIT permettant de tester qu’un objet nouvellement créé satisfait
l’invariant. Vous utiliserez la méthode testInvariant(). Un de vos tests doit se faire sur objet avec un
3
tableau qui ne soit ni null ni vide.
Question 2.3
Donnez 1 cas de test pour un objet avec tableau non null ni vide pour montrer qu’après appel à la
méthode incr(), l’objet courant satisfait l’invariant.
Partie II : erreurs de conception
Question 2.4
La ligne 27 de cette classe peut provoquer la levée d’une exception. (a) Expliquez pourquoi et (b) Donnez un exemple d’utilisation de cette classe qui provoque l’erreur.
Question 2.5
Un utilisateur de cette classe peut provoquer la violation de l’invariant (sans lever aucune exception).
Donnez un morceau de code qui aboutit à cela. Indication : le problème potentiel est lié au paramètre passé
lors de la création d’un objet.
Exercice 3 Entrées/sorties (6 points)
Question 3.1
Écrire un programme qui prendra deux paramètres (sur la ligne de commande), qui seront respectivement
un chemin de fichier texte (args[0]) et une chaı̂ne de caractères (args[1]) et qui affichera toutes les
lignes du fichier texte qui contiennent la chaı̂ne args[1].
Question 3.2
Une image au format PNG commence par les octets [137, 80, 78, 71, 13, 10]. On suppose que c’est une
solution fiable pour savoir si un fichier est au format PNG (indépendamment de son extension).
Écrivez un petit programme qui affichera format png si un fichier dont le chemin est passé en
paramètre est au format PNG, et non png sinon.
Exercice 4 Web (2 points)
Pour les données suivantes, indiquez où il faut les stocker : bean requête, bean session, bean application,
ou base de données.
1. le résultat d’une recherche effectuée par l’utilisateur ;
2. les informations sur le nom et les droits de l’utilisateur connecté ;
3. une commande de produit que l’utilisateur a validée et payée ;
4
4. les cinq dernières recherches effectuées par l’utilisateur sur le site, dans la dernière demie-heure ;
5. le nombre d’utilisateurs actuellement connectés.
5