INF 103 – Langage JAVA Contrôle du 7 janvier 2015 Durée : 1h30

Transcription

INF 103 – Langage JAVA Contrôle du 7 janvier 2015 Durée : 1h30
INF 103 – Langage JAVA Contrôle du 7 janvier 2015 Durée : 1h30 Nom : ……………………….…………………………………………………………. Prénom : ………………….………………………………………………………………. Casier : ….…….… Groupe : ………….. Écrire les réponses directement sur les feuilles du sujet dans les cases prévues à cet effet. Le barème est sur 20 points mais la note compte pour 10 points dans la note finale. Le barème est donné à titre indicatif et pourra être revu au moment de la correction si les correcteurs l’estiment nécessaire. Le sujet comporte 10 pages. Pas de documents autorisés, téléphones éteints. 1 / 10 1. (2 points) Écrire une classe MathConstant où l’on déclarera la constante e=2,71828. Faites en sorte que l’on puisse accéder à cette constante sans instancier la classe. Comment accède-­‐t-­‐on à cette constante ? public class MathConstant
{
public final static float e = 2.71828 ;
}
On y accède grâce à la notation : MathConstant.e . 2. (2 points) Soit une classe A, soit m une méthode de la classe A déclarée avec static, sans argument et sans résultat, soit a un objet de la classe A, a-­‐t-­‐on le droit d’écrire a.m() ? La méthode m a-­‐t-­‐elle le droit d’accéder aux attributs de a ? SI oui, lesquels ? On a le droit même si la notation A.m() est préférable pour des raisons de lisibilité du code. Oui, uniquement les attributs déclarés static. 3. (2 points) Qu’appelle-­‐t-­‐on le polymorphisme en programmation orienté objet ? Le polymorphisme en POO est le fait pour un objet de pouvoir avoir plusieurs types. Si une classe B hérite d’une classe A, alors tout objet de type B a aussi le type A. 2 / 10 4. (4 points) On considère la fonction suivante. On suppose que le reste du code de la classe est correct et qu’elle importe java.io.*. Expliquer ce que fait cette fonction. Pour cela, on explicitera chacune des instructions, ligne par ligne. Que manque-­‐t-­‐il à cette fonction ? float load(String fileName)
{
FileInputStream
fis = new FileInputStream(fileName) ;
BufferedInputStream bis = new BufferedInputStream(fis) ;
DataInputStream
dis = new DataInputStream(bis) ;
float f = dis.readFloat() ;
dis.close() ;
return f ;
} (3 points) FileInputStream fis = new FileInputStream(fileName) ;
Cette instruction ouvre un flux d’octet entrant correspondant au fichier de nom fileName. BufferedInputStream bis = new BufferedInputStream(fis) ;
Cette instruction bufferise le flux précédent. Cela est nécessaire car le flux précédent correspond à un fichier sur disque (matériel). DataInputStream dis = new DataInputStream(bis) ; Cette instruction crée un flux de données binaires en entrée à partir du flux d’octets bufferisés. float f = dis.readFloat() ; Cette instruction lit un nombre flottant dans le flux de données binaires. dis.close() ;
Cette instruction clôt le flux de données binaires, ce qui a pour effet de clore tous les autres flux ouvert. (1 points) Il manque soit une déclaration que la fonction peut lever une exception de type IOException, (voire même de FileNotFoundException) ou bien il manque une structure try-catch. 3 / 10 On désire programmer un logiciel qui calcule des taxes pour des véhicules. On considère des automobiles, des camions et des motos. Une automobile est caractérisée par sa marque (une chaîne de caractères) et sa puissance en chevaux fiscaux (un entier). Un camion est caractérisé par sa marque (une chaîne de caractères) et son nombre d’essieux (un entier). Une moto est caractérisée par sa marque (une chaîne de caractères) et sa cylindrée (un entier). On se propose de programmer cela avec une classe mère abstraite Vehicule et trois classes filles Voiture, Camion and Moto. 5. (1,5 point) Écrire les quatre classes Vehicule, Voiture, Camion et Moto avec leurs constructeurs. On fera bien attention à mettre dans Vehicule ce qui est commun aux différents types de véhicules. Dans la classe Vehicule, on ne mettra que la marque qui est commune aux différents types de véhicules. Cette marque sera déclarée final car elle ne changera pas après initialisation. On programme un getter car nous en aurons besoin pour calculer la taxe. La classe Vehicule est abstraite car on ne créera jamais d’instance directe de cette classe. public abstract class Vehicule
{
private final String marque ;
public Vehicule(String marque)
{
this.marque = marque ;
}
}
public final String getMarque()
{
return marque ;
}
La classe Voiture aura un attribut qualifié de final. Elle peut elle-­‐même être qualifié de final car elle n’aura pas de classe fille. public final class Voiture extends Vehicule
{
private final int chevauxFiscaux ;
}
public Voiture(String marque, int chevauxFiscaux)
{
super(marque) ;
this.chevauxFiscaux = chevauxFiscaux ;
}
4 / 10 Les classes Camion et Moto sont sur le même modèle : public final class Camion extends Vehicule
{
private final int nbEssieux ;
public Camion(String marque, int nbEssieux)
{
super(marque) ;
this.nbEssieux = nbEssieux ;
}
}
public final class Moto extends Vehicule
{
private final int cylindree ;
public Moto(String marque, int cylindree)
{
super(marque) ;
this.cylindree = cylindree ;
}
}
5 / 10 6. (1,5 points) La taxe est bien entendu libellée en euros. On a une classe : public final class Euros
{
private final amount ;
public int getAmount()
{
return amount ;
}
public Euros(int amount)
{
this.amount = amount ;
}
}
Supposons que l’on ait une variable e de type Euros et on désire que l’instruction : System.out.print(e) ;
affiche la chaîne <amount> euros où <amount> est la valeur de l’attribut amount de e. Que faut-­‐il faire ? Il suffit de redéfinir la méthode toString() de la classe Euros en : @Override
public final String toString()
{
return "" + amount + " euros" ;
}
7. (1 points) La taxe sur les véhicules se calcule de la manière suivante : • pour une automobile, on multiplie la puissance en chevaux fiscaux par 10 euros ; • pour un camion, on prend le nombre d’essieux et on le multiplie par 50 euros ; • pour une moto, on multiplie la cylindrée par 0,3 euros et on prendra la partie entière. Dans chacune des classes filles de Vehicule, écrire une méthode de signature Euros tax()
qui calcule la taxe selon les formules ci-­‐dessus. 6 / 10 Pour Voiture : public final Euros tax()
{
return new Euros(10 * chevauxFiscaux) ;
}
Pour Camion : public final Euros tax()
{
return new Euros(50 * nbEssieux) ;
}
Pour Moto (la conversion en int est pas nécessaire car sinon, Java envoie des warnings) : public final Euros tax()
{
return new Euros((int)(0.3 * cylindree)) ;
}
7 / 10 8. (2 points) Pour chaque futur contributeur de la taxe sur les véhicules, on considèrera une structure contenant l’ensemble de ses véhicules. Programmer une classe UserVehicules qui sera cette structure. En plus du constructeur, on s’attachera à pouvoir ajouter des véhicules à cette structure. import java.util.ArrayList ;
public final class UserVehicules
{
private final ArrayList<Vehicule> vehicules ;
public UserVehicules()
{
vehicules = new ArrayList<Vehicule>() ;
}
public final void add(Vehicule vehicule)
{
vehicules.add(vehicule) ;
}
} On remarquera que l’on aurait pu faire: public final class UserVehicules extends ArrayList<Vehicule>
car on peut dire que UserVehicules est une liste de Vehicule dans laquelle on rajoutera des methodes. 8 / 10 9. (3 points) Programmer dans la classe UserVehicules une méthode de signature Euros tax()
qui calcule la somme des taxes sur les véhicules que la structure contient. Dans la classe UserVehicules : public final Euros tax()
{
int somme = 0 ;
for (Vehicule vehicule : vehicules)
somme += vehicule.tax().getAmount() ;
return new Euros(somme) ;
}
mais il ne faut pas oublier de déclarer la méthode abstraite tax dans la classe Vehicule : public abstract Euros tax() ;
et de déclarer la classe Vehicule abstraite : public abstract class Vehicule { … }
et on mettra l’assertion @Override
devant chacune des redéfinitions de tax(). 9 / 10 10. (1 point) Programmer une classe Main avec une méthode statique main qui déclare une variable de type UserVehicules, y ajoute quelques voitures, quelques camions et quelques motos, puis calcule et affiche la taxe totale. public class Main
{
public static void main(String args[])
{
UserVehicules userVehicules = new UserVehicules() ;
userVehicules.add(new Voiture("Kia Rio",5)) ;
userVehicules.add(new Moto("Kawasaki",1800)) ;
userVehicules.add(new Camion("Renault",3)) ;
} System.out.println(userVehicules.tax()) ;
}
FIN DU SUJET 10 / 10