Téléchargement

publicité
É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
Téléchargement