TP8

Transcription

TP8
Université de Versailles
IUT de Vélizy - Algorithmique
Vanessa Vitse
2007/2008
TP n˚8
(2 séances)
Premiers pas en programmation objet
On considère la déclaration de la classe Date suivante :
public class Date {
//Les variables d’instances
int jour ;
int mois ;
int annee ;
//Un premier constructeur
public Date(){
this.jour = 1 ;
this.mois = 1 ;
this.annee = 1 ;
}
//Un second constructeur
public Date(int j, int m, int a){
this.jour = j ;
this.mois = m ;
this.annee = a ;
}
//Une methode d’affichage de la date courante
public void afficherDate(){
System.out.println(this.jour+" / "+this.mois+" / "+ this.annee) ;
}
}
Cette classe regroupe les données caractéristiques communes à toutes les dates sous la
forme de 3 variables d’instances : jour, mois et annee. Elle comprend également deux
constructeurs qui permettent d’initialiser des objets Date lors de leur création et une
méthode d’instance afficherDate qui permet d’afficher la date courante.
Le but du TP est d’enrichir cette classe en spécifiant le comportement des objets Date.
Plusieurs méthodes que l’on pourra invoquer sur les objets vont ainsi être définies.
Un premier exemple d’utilisation de la classe Date
Exercice 1. Recopier cette définition de classe dans un fichier Date.java. Ecrire dans
un fichier TestDate.java un programme qui déclare un tableau de 31 dates (contenant
par exemple toutes les dates depuis le 1er Mai 2008 jusqu’au 31 Mai 2008) puis qui les
affiche à l’écran.
Egalité structurelle et physique
Exercice 2. Dans la classe Date, définir une méthode d’instance estEgal qui a pour
argument un objet de type Date et qui retourne un booléen égal à vrai si la date courante
est la même que celle passée en paramètre. Cette méthode devra tester l’égalité des deux
instances de la classe Date suivant la valeur de leurs variables d’instances.
Exercice 3. Dans le programme TestDate, rajoutez les instructions suivantes :
Date d1 = new Date(25,3,2007) ;
Date d2 = new Date(16,4,2007) ;
Date d3 = d1 ;
Date d4 = new Date(16,4,2007) ;
System.out.println("d1.estEgal(d2) : "+d1.estEgal(d2)) ;
System.out.println("d1 == d2 : "+ (d1==d2)) ;
System.out.println("d1.estEgal(d3) : "+d1.estEgal(d3)) ;
System.out.println("d1 == d3 : "+ (d1==d3)) ;
System.out.println("d2.estEgal(d4) : "+d2.estEgal(d4)) ;
System.out.println("d2 == d4 : "+ (d2==d4)) ;
Compiler et exécuter. Que peut-on en conclure ?
Est-il possible d’avoir deux instances de la classe Date telles que la méthode estEgal les
considère différentes et == égales ?
Méthode d’instance et méthode de classe
Le mot clé static permet de distinguer les méthodes statiques (méthodes de classe) des
méthodes non statiques (méthodes d’instance) :
– Les méthodes non statiques définissent un comportement de l’objet courant auquel
elles font référence, dans leur corps, au moyen du mot clé this (ex : les méthodes
afficherDate et estEgal de la classe Date).
– Les méthodes statiques ne connaissent pas l’objet courant. Elles ne peuvent faire
référence ni à this, ni aux variables d’instances de l’objet courant (ex : la méthode
principale main).
Exercice 4. Ecrire une méthode d’instance qui détermine si la date courante est une
date antérieure à une autre. Quelle sera la signature de cette méthode ?
Exercice 5. Ecrire une méthode d’instance qui détermine si la date courante est un
anniversaire d’une autre date.
2
Exercice 6. Ecrire dans Date une méthode de classe bissextile (déclarée static) qui
prend en argument un entier et retourne un booléen vrai si l’entier correspond à une
année bissextile, faux sinon.
On rappelle qu’une année bissextile est une année comprenant 366 jours. Sont bissextiles
les années :
1. divisibles par 4 mais non divisibles par 100
2. divisibles par 400
Ainsi 2004 est bissextile (vérifie 1.), 1900 n’est pas bissexile (ne vérifie ni 1., car divisible
par 100, ni 2., car et non divisible par 400) et 2000 est bissextile (vérifie 2.).
Dans le programme TestDate, tester votre méthode avec les appels suivants (on affichera
les résultats des différents appels dans le terminal) :
Date.bissextile(2004) ;
Date.bissextile(1900) ;
Date.bissextile(2000) ;
Exercice 7. Ecrire dans Date une méthode de classe longueur (déclarée static) qui
prend en arguments deux entiers représentant un mois m et une année a et qui retourne
un entier correspondant au nombre de jours du mois m de l’année a. On traitera à part
le cas du mois de février en faisant appel à la méthode bissextile.
Effectuer quelques tests sur des exemples bien choisis dans le programme TestDate.
Exercice 8. A l’aide de la méthode longueur, définir dans Date la méthode d’objet
lendemain qui est sans argument et qui a pour effet de modifier l’état de l’objet courant
en le faisant passer à la date du lendemain. Cette méthode doit-elle être déclarée static ?
Effectuer quelques tests sur des exemples bien choisis dans le programme TestDate.
Calcul du jour correspondant à une date
On souhaite dans cette partie, écrire une méthode d’instance qui retourne le jour de la
semaine correspondant à la date courante.
Le problème peut être résolu grâce à la formule de Kraitchik qui utilise les notations
suivantes :
Soit d = (j, m, a) où j est le jour (1 ≤ j ≤ 31), a l’année et m le numéro du mois
(3 ≤ m ≤ 14) en utilisant la convention que le mois de Janvier est le 13ème mois de
l’année précédente et que le mois de Février est le 14ème mois de l’année précédente. Par
exemple, le 31 Janvier 2007 est codé sous la forme (j = 31, m = 13, a = 2006) et le 25
Mars 1956 est codé sous la forme (j = 25, m = 03, a = 1956).
Les jours de la semaine sont représentés par un entier compris entre 0 et 6 : samedi est
codé par 0, dimanche par 1, etc....
Pour déterminer le jour de la semaine correspondant à la date d = (j, m, a), on calcule
de K définie par la formule suivante :
hai h a i h a i
3(m + 1)
+a+
−
+
+2
K = j + 2m +
5
4
100
400
où [x] désigne la partie entière de x.
3
Le jour de la semaine est alors égal à K modulo 7.
Exemple : Pour la date 31 Janvier 2007, on obtient
K = 31 + 26 + 8 + 2006 + 501 − 20 + 5 + 2 = 2559
dont le reste modulo 7 vaut 4, ce qui correspond bien à un mercredi.
Exercice 9. En utilisant cette formule, définir dans la classe Date une méthode qui
calcule le jour de la semaine de la date courante. Pour le calcul de la partie entière, on
utilisera la méthode static floor de la classe Math.
Tester cette méthode avec quelques dates bien choisies.
Exercice 10. Ecrire dans Date une méthode de signature String toString(), qui renvoie la date courante sous la forme NomDuJour Jour NomDuMois Annee (par exemple
Lundi 26 Mars 2007).
Tester cette méthode avec quelques dates bien choisies.
Remarque :
Le code suivant :
Date d = new Date(24,3,2007) ;
System.out.println(d) ;
est équivalent au code :
Date d = new Date(24,3,2007) ;
System.out.println(d.toString()) ;
4