IFT1025-A2010 Examen Final Programmation 2 Date:16 décembre
Transcription
IFT1025-A2010 Examen Final Programmation 2 Date:16 décembre
IFT1025-A2010 Examen Final Programmation 2 Date:16 décembre, 12:30-15:30 Guy Lapalme (60) 1. Vous devez écrire une application Java qui va fournir une liste triée des couples de mots successifs (bigrammes) d’un fichier avec leur fréquence (c’est-à-dire leur nombre d’occurrences). Par exemple, soit le fichier suivant Vive le vent, vive le vent Vive le vent d’hiver Qui s’en va sifflant, soufflant Dans les grands sapins verts... Oh ! Vive le temps, vive le temps Vive le temps d’hiver Boule de neige et jour de l’an Et bonne année grand-mère... La liste des bigrammes qui apparaissent plus d’une fois sera la suivante: (le,temps):3 (le,vent):3 (temps,vive):2 (vent,vive):2 (vive,le):6 Pour y arriver, vous devez suivre les étapes suivantes: (10) (a) Implantez une méthode getMots qui reçoit en paramètre le nom d’un fichier et qui retourne un liste des mots (de type List<String>) dans ce fichier. Les méthodes de traitement de fichier sont rappelées à la page 6 et l’interface List à la page 4. (20) (b) Soit la classe générique Pair suivante (identique à celle présentée en classe) class Pair<T,S>{ private T first; private S second; public Pair(T first, S second){ this.first=first; this.second=second; } public T getFirst(){return first;} public S getSecond(){return second;} public String toString(){ return "("+first+","+second+")"; } } IFT1025-A2010 Page 2 Écrivez la classe Bigramme comme sous-classe de Pair pour conserver deux String correspondant aux deux mots du bigramme. Cette sous-classe devrait implanter l’interface Comparable (sa définition est rappelée en page 4). Un bigramme est trié d’abord sur son premier mot et ensuite sur son deuxième en utilisant l’ordre naturel des String. (10) (c) Dites quelle structure de données du FrameWork des Collections de Java vous choisiriez pour conserver les bigrammes et leur fréquence.Justifiez votre choix. (10) (d) Implantez une méthode getBigrammes qui reçoit la liste des mots du fichier retournée en (a) et qui calcule les fréquences des bigrammes à l’aide de la structure de donnée que vous aurez choisie en (c). Cette méthode retourne la structure remplie. (10) (e) Écrivez la méthode imprimerBigrammes qui écrit sur System.out les bigrammes et leur fréquence calculés en (d) lorsque lorsque leur fréquence est plus grande que 1. Voir l’exemple du résultat attendu au début de l’énoncé de ce numéro. (30) 2. Implantez une classe générique FIFO (first-in, first-out) qui est une structure qui permet de conserver des éléments d’un type quelconque dans une file d’attente selon l’ordre premier arrivé, premier servi. Cette classe comprend les méthodes suivantes: entrer qui ajoute l’élément donné en paramètre à la fin de la file et retourne la file modifiée; sortir qui retire un élément au début de la file et le retourne en résultat; nb qui indique le nombre d’éléments dans la file. (10) (a) Quelle structure de données du Framework des Collections vous semble la plus appropriée pour implanter cette classe ? justifiez votre réponse. (20) (b) Écrivez le code Java pour implanter cette classe en utilisant la structure de données que vous avez choisie en (a). Donnez le code complet de la classe: c’est-à-dire les trois méthodes entrer, sortir et nb et aussi celui du constructeur et de la méthode toString() qui retourne dans une chaı̂ne une représentation des éléments dans la file. IFT1025-A2010 Page 3 (10) 3. Dans la définition de BSTNode, rappelée à la page 7, ajoutez la méthode public List<E> sansDescendants() qui retourne une liste de tous les noeuds n’ayant aucun noeud enfant. (2) 4. Question bonus. Quelle ligne faudrait-il insérer à la place du commentaire dans ce programme Java pour qu’il devienne syntaxiquement correct et qu’il imprime Bonjour les amis. public class BrowserTest { public static void main(String[] args) { // compléter ici... if(i!=i+0) System.out.println("Bonjour les amis"); } } Cet examen comporte 3 questions pour un total de 100 points. Bonne chance IFT1025-A2010 Rappel d’éléments du Collection Framework de Java public interface Collection<E> extends Iterable<E>{ // Opérations de base int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator<E> iterator(); // Opérations de groupe boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); void clear(); } public interface Iterator<E> { boolean hasNext(); <E> next(); void remove(); } public interface Comparable<T> { public int compareTo(T o); } public interface Comparator<T> { public int compare(T o1, T o2); } public interface List<E> extends Collection<E> { // accès par position E get(int index); E set(int index, E element); void add(int index, E element); E remove(int index); boolean addAll(int index, Collection <? extends <E>>); // recherche int indexOf(Object o); int lastIndexOf(Object o); //Exemples de création //List<String> l = new ArrayList<String>(); //List<Integer> l = new LinkedList<Integer>(); } Page 4 IFT1025-A2010 public // // // // } Page 5 interface Set<E> extends Collection<E>{ aucune nouvelle méthode mais s’assure que tous les éléments sont distincts Exemple de création Set<String> s = new HashSet<String>(); public interface Map<K,V> { // Opérations de base V put(K key, V value); V get(K key); V remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); // Opérations de groupe void putAll(Map<? Extends K, ? extends V> m); void clear(); // Vues comme des Collections public Set<K> keySet(); public Collection<V> values(); public Set<Map.Entry<K,V>> entrySet(); // Interface pour les entrées de la table (entrySet) // on la désigne par Map.Entry public interface Entry<K,V> { K getKey(); V getValue(); V setValue(V value); } //Création //Map<String,Integer> m = new HashMap<String,Integer>(); //Map<String,Integer> m = new LinkedHashMap<String,Integer>(); } public interface // vue comme SortedSet<E> SortedSet<E> SortedSet<E> SortedSet<E> extends Set<E> { sous-ensemble subSet(Object fromElement, Object toElement); headSet(Object toElement); tailSet(Object fromElement); // points extr^ emes E first(); E last(); IFT1025-A2010 Page 6 // accès au comparateur Comparator<? super E> comparator(); //Création //SortedSet<String> ss = new TreeSet<String>(); } public interface SortedMap<K,V> extends Map<K,V> { // vue comme sous-table SortedMap<K,V> subMap(K fromKey, K toKey); SortedMap<K,V> headMap(K toKey); SortedMap<K,V> tailMap(K fromKey); // accès aux clés extr^ emes K firstKey(); K lastKey(); // accès au comparateur Comparator<? super K> comparator(); //Création //SortedMap<String,Integer> sm = new TreeMap<String,Integer>(); } Rappel sur la lecture de fichiers Entrées-sorties BufferedReader in = new BufferedReader(new FileReader(fileName)); BufferedReader contient la méthode readLine() qui retourne une ligne comme un String ou null lorsqu’on est à la fin du fichier. Tokenization Scanner sc = new Scanner(l); Scanner contient les méthodes hasNext() qui retourne true s’il reste des tokens à traiter next() qui retourne le prochain token comme une String (vous pouvez supposer ici que next() élimine les ponctuations et que la chaı̂ne retournée ne contient que les caractères du mot en minuscule) Exceptions FileReader peut lever FileNotFoundException et BufferedReader peut lever IOException qui doivent être traitées en indiquant le nom du fichier où s’est produit l’exception sur System.err. IFT1025-A2010 Rappel de certains éléments de la classe BSTNode public class BSTNode <E extends Comparable<E>> { protected E element; protected BSTNode<E> left, right; public BSTNode (E elem) { // Construct a BST node with element elem and no children. this.element = elem; this.left = null; this.right = null; } public void insert (E elem) { // Insert the element elem in this BST if not already there. int direction = elem.compareTo(element); if (direction<0) if(left==null) left = new BSTNode<E>(elem); else left.insert(elem); else if (direction>0) if (right==null) right = new BSTNode<E>(elem); else right.insert(elem); } } Page 7