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