École Polytechnique Département de Génie Informatique INF-4100, Sujets spéciaux: le langage JAVA Examen intratrimestriel: Automne 2003 Question 1: (5 points) 1.1 On désire créer et initialiser un tableau bidimensionnel non rectangulaire constitué de 500 rangées; chaque rangée contient un nombre variable de colonnes, chaque emplacement contenant une valeur de type "float"; le nombre de colonnes d'une rangée est fixé comme suit: - si le numéro de rangée est compris entre zéro et 249, le nombre de colonnes de cette rangée est égal au numéro de rangée plus un; - si le numéro de rangée est plus grand que 249, le nombre de colonnes est égal à 500 moins le numéro de rangée. Une fois le tableau créé, il doit être initialisé en plaçant dans chaque Tableau[i][j] une valeur donnée par la formule 8.75 * i + 6.29*j Écrivez les instructions requises. Réponse: float Tableau [][] = new float[500][]; for(int i = 0; i<500; i++) if(i<250)Tableau[i] = new float[i+1]; else Tableau[i] = new float[500-i]; for(int i=0; i<500; i++) for(int j=0; j< Tableau[i].length; j++) Tableau[i][j] = 8.75f*i + 6.29f*j; 1.2 Étant donné ce même tableau, et un entier K compris entre 0 et 499, comment obtient on le nombre d'éléments de la rangée K sans refaire le calcul décrit ci- haut? int TailleRangeeK = Tableau[K].length; Question 2: (4 points) Écrivez une méthode qui reçoit un nom complet de fichier et le sépare en ses éléments; la spécification détaillée est comme suit: - nom de la méthode: Separe - un seul argument: une chaine de caractères qui est le nom complet d'un fichier, y compris l'identification du disque; les séparateurs entre les noms de répertoires peuvent être soit / ou \; le nombre de répertoires n'est pas prédéfini; - valeur de retour: un tableau de chaines de caractères dont la taille est égale au nombre de noms de répertoires dans la chaîne fournie en argument plus deux; le premier élément contient le nom du disque sans le deux-points; le dernier élément contient le nom du fichier avec son extension; chacun des autres éléments contient un des noms de répertoire; Exemple : si cette méthode reçoit la chaine c:\Rep1\Tralala/FouFou/Unfichier.lll, elle retourne un tableau de taille 5 dont les éléments sont: c Rep1 Tralala FouFou Unfichier.lll Réponse: String [] Separe(String S) { StringTokenizer ST = new StringTokenizer(S, ":/\\"); String Resultat[] = new String[ST.countTokens()]; for(int i=0; i<Resultat.length; i++) Resultat[i] = new String(ST.nextToken()); return Resultat; } NOTE: Dans les deux questions suivantes, le mot "package" réfère à une des "librairies" de JAVA. Question 3: (5 points) On considère le programme ci-dessous. Ce programme est composée de deux classes, la classe "Decelle.java" et la classe "Reference.java". La classe "Decelle.java" contient le point d’entrée de ce programme. Les deux classes "Decelle.java" et "Reference.java" sont spécifiées de la façon suivante : public class Decelle { StringBuffer sb = new StringBuffer("Le pavillon"); String s = "le pavillon "; public Decelle() { if ((sb.length() > 20) && (sb.append(" Decelle").equals("False"))) sb.append(" : se trouve sur l'avenue Decelle"); sb.append(" Decelle"); System.out.println("La valeur est: " + sb); System.out.println(s.toUpperCase()); System.out.println(s); } public static void main(String args[]) { Decelle decel = new Decelle(); Reference R1 = new Reference (); Reference R2 = new Reference (); R1.vare = 10; R1.varstatic ++; R2.vare = 20; R1.incremente(R2); R2.increme nte(R1); System.out.println(R1.vare); System.out.println(R2.vare); System.out.println(R1.varstatic); System.out.println(R2.varstatic); } } class Reference { int vare = 10; static int varstatic = 30; public void incremente(Reference refere) { refere.vare++; refere.varstatic++; } } 3.1 Quelle est la différence entre la classe String et la classe StringBuffer? Réponse: La classe String représente une chaîne de caractère constante son contenu ne change pas même si on applique l’ensemble des méthodes que la classe String possède. Le contenu change si et seulement si l’objet est recréé avec une nouvelle chaîne de caractère. La classe StringBuffer représente une chaîne de caractère dont la taille change dynamiquement. Le contenu des objets de type StringBuffer change suite à l’appel de certaines méthodes de cette classe. 3.2 À quel package (librairie) appartiennent ces deux classes (String et StringBuffer)? Réponse: Java.lang 3.3 Pour quelle raison ce package (librairie)(de la question 3.2) n’est- il pas importé dans la classe Decelle? Réponse: Le package java.lang est importé par défaut par toutes les applications Java 3.4 Qu’est ce que ce programme affiche après son exécution? Réponse: le résultat de l’exécution du programme est : La valeur est: Le pavillon Decelle LE PAVILLON le pavillon 11 21 33 33. Question 4: (6 points) On considère une classe ManipuleFichier. Cette classe contient la méthode fichier() décrite de la façon suivante : void fichier(){ Try { FileOutputStream fos = new FileOutputStream("xx"); for (int j = 10; j < 50; j++) fos.write(j); fos.close(); RandomAccessFile raf = new RandomAccessFile("xx", "r"); raf.seek(10); int i = raf.read(); raf.close() System.out.println("i = " + i); } catch(IOException e) { } } 4.1 Décrivez brièvement la particularité de la classe Ra ndomAccessFile dans le package (librairie) java.io? Réponse: La classe RandomAccessFile permet un accès aléatoire aux fichiers en lecture et en écriture. Le reste des classes du package Java.io ne permettent qu’un accès séquentiel aux fichiers. 4.2 Quel est le résultat de l’appel de la méthode fichier()? Réponse: i = 20 4.3 Écrivez une méthode publique de la classe ManipuleFichier sans valeur de retour. Cette méthode sera nommée "afficheJeton", reçoit en paramètre une chaîne de caractère qui représente le chemin et le nom d’un fichier texte dont les caractères sont codés sur 8 bits. Cette méthode ouvre le fichier en lecture. Si le fichier existe, la méthode affiche dans la zone de texte "zoneTxT", la taille de ce fichier, le nombre de mots qu’il contient ainsi que les mots eux mêmes. Chaque mot doit être affiché sur une ligne. Si le fichier n’existe pas un message d’erreur serait affiché dans une boite de dialogue. La méthode "afficheJeton" ne dois pas utiliser la classe JFileChooser. On suppose que la classe ManipuleFichier déclare la zone de texte "zoneTxT" de type JTextArea et que cet objet est accessible par la méthode "afficheJeton". Réponse: public void afficheJeton(String nomfichier){ char cbuf []; StringTokenizer tokens; int taille ; try{ File file = new File(nomfichier); BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(nomfichier))); taille = (int)file.length(); cbuf = new char [(int)file.length()]; br.read(cbuf,0,(int)file.length()); tokens = new StringTokenizer(new String(cbuf)); zonneTxT.setText(""); zonneTxT.setText("La taille du fichier: " + taille+ "\n Nombre d'éléments: " + tokens.countTokens() + "\nLes jetons sont:\n" ); while ( tokens.hasMoreTokens() ) zonneTxT.append( tokens.nextToken() + "\n" ); } catch(IOException e){ JOptionPane.showMessageDialog( this, "Nom de fichier non valable", "Nom de fichier non valable", JOptionPane.ERROR_MESSAGE); } } -o-o-o-o-o-o-o-o-o-o-o-o-o-oLes professeur Bernard Lanctôt Nabil El Abboudi le 9 septembre 2003