Sujet corrigé du contrôle de mars 2016

publicité
Licence Informatique 2ème année
Programmation Objet 1
Contrôle continu – 23/03/2016 - 1h
Numéro étudiant :
Nom :
Prénom :
Année dans le diplôme :
Mention :
Les notes de cours, TD et TP sont autorisées.
Question 0 (4 points)
Le code suivant compile t-il? Si non, indiquez les erreurs affichées par le compilateur et proposez
des corrections. A quel affichage conduit l'exécution du programme (éventuellement corrigé)?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
class A{
int i;
A(){
this.i = 0;
}
void m(){System.out.println("A");}
}
class B extends A{
int i = 2;
void m(){System.out.println("B");}
public static void main(String[] toto){
A a = new A();
B b = new B();
System.out.println(b.i);
System.out.println(a.i);
System.out.println(((A) b).i);
b.m();
a.m();
}
}
Question 1 (16 points)
On veut écrire un programme pour représenter le fonctionnement d'un système de fichiers. Un programmeur
a déjà écrit du code dans lequel il utilise l'interface suivante pour manipuler les éléments du système :
interface SystemElement{
abstract boolean open(); //renvoie vrai si l'ouverture se passe bien
}
Il est donc nécessaire que les classes qui représentent les éléments du système implémentent cette
interface. Les éléments du système peuvent être de types variés : répertoire, fichier texte, fichier exécutable,
lien symbolique, ... Tout élément du système a un nom, une taille (en nombre d'octets) et un répertoire qui le
contient.
Un répertoire a aussi une liste des éléments (fichiers, répertoires, ...) qu'il contient. La taille d'un répertoire
est la somme des taille des éléments qu'il contient. Un répertoire possède aussi une méthode boolean
mkdir(String n) qui crée un sous-répertoire de nom n, une méthode boolean touch(String n) qui
crée un fichier texte vide (de taille 0) dans le répertoire et une méthode boolean addFile(File f) qui
ajoute un fichier donné dans le répertoire. Ces méthodes renvoient vrai si l'action se déroule correctement,
faux sinon. Ici, on néglige les problèmes de nommage, c'est-à-dire qu'on peut autoriser l'existence
d'éléments de même nom dans un même répertoire. Les méthodes mkdir, touch et addFile renvoient
donc toujours vrai. Ouvrir un répertoire (méthode open()) consiste à afficher à l'écran la liste des noms et
taille des éléments contenus dans le répertoire.
a- Ecrivez du code objet pour représenter les répertoires. (8 points)
Un fichier a une taille propre (qui n'est pas calculée à partir d'autres tailles), et possède une extension qui
dépend de son type. Les fichiers texte ont tous l'extension ".txt", les fichiers java une extension ".java", etc.
Quand on crée un fichier, si le nom fourni ne finit pas par l'extension prévue, le constructeur doit ajouter
l'extension au nom du fichier. Pour tester si une chaine de caractère finit par une certaine autre chaine, on
peut utiliser la méthode boolean endsWith(String s) de la classe String. Ouvrir un fichier consiste à
appeler un programme sur le fichier, à l'aide d'un objet de type Runtime.
Exemple : java.lang.Runtime.getRuntime().exec("gedit toto.txt").exitValue() va ouvrir
le fichier toto.txt dans l'éditeur Gedit et retourner un code d'exécution qui vaut 0 si tout se passe bien.
b- Ecrivez du code objet pour représenter les fichiers en général et les fichiers texte en particulier. (8 points)
Question 0
Le code compile et affiche 2,0,0,B,A
Question 1
interface SystemElement{
abstract String getDescription();
abstract boolean open();
}
abstract class Element implements SystemElement{
String name;
Directory parent;
Element(String n, Directory d) throws java.lang.IllegalArgumentException{
if(d.containsElement(n)) throw new java.lang.IllegalArgumentException("Name
already used in the directory");
else{
this.name = n; this.parent = d;
}
}
abstract int getSize();
}
class Directory extends Element{
java.util.LinkedList<Element> children;
Directory(String n, Directory d) throws java.lang.IllegalArgumentException{
super(n,d);
this.children = new java.util.LinkedList<Element>();
}
boolean containsElement(String n){
for(Element e:this.children){
if(e.name.equals(n)) return true;
}
return false;
}
boolean mkdir(String n){
try{
Directory d = new Directory(n,this);
this.children.add(d);
return true;
}
catch(java.lang.IllegalArgumentException e){return false;}
}
boolean touch(String n){
try{
TextFile f = new TextFile(n,this,0);
this.children.add(f);
return true;
}
catch(java.lang.IllegalArgumentException e){return false;}
}
int getSize(){
int s = 0;
for(Element e:this.children) s += e.getSize();
return s;
}
boolean addFile(File f){
if(this.containsElement(f.name)) return false;
else{
this.children.add(f);
return true;
}
}
public String getDescription(){
return this.name + ":" + this.getSize() + ":" + this.children.size();
}
public boolean open(){
for(Element e:this.children){
System.out.println(e.getDescription());
}
return true;
}
}
abstract class File extends Element{
int size;
File(String n, Directory d, int s) throws java.lang.IllegalArgumentException{
super(n,d);
this.size = s;
if(!n.endsWith(this.getExtension())) this.name += this.getExtension();
}
int getSize(){
return this.size;
}
public String getDescription(){
return this.name + ":" + this.size;
}
static String getExtension(){return "";}
}
class TextFile extends File{
TextFile(String n, Directory d, int s) throws java.lang.IllegalArgumentException{
super(n,d,s);
}
static String getExtension(){return ".txt";}
public boolean open(){
try{
return java.lang.Runtime.getRuntime().exec("gedit
"+this.name).exitValue()==0;
}
catch(java.io.IOException e){return false;}
}
}
class Link extends Element{
Element e;
Link(String n, Directory d, Element e) throws java.lang.IllegalArgumentException{
super(n,d);
this.e = e;
}
int getSize(){
return 0;
}
public String getDescription(){
return this.name + "->" + this.e.name;
}
public boolean open(){
return this.e.open();
}
}
Téléchargement