P. TRAU, Décembre 2006
Mettez vous à 2 par poste. Vous me rendrez un petit rapport (un seul par binôme) dans une semaine maximum (=604 800 s). Le sujet est long, vous devez essayer d'aller le plus loin possible. Vous devez également me montrer l'avancement du TP. Vous pouvez m'envoyer votre rapport et votre programme par mail à patrick(à)trau.fr (cette adresse fonctionne mieux que celle donnée au 1er TP). A propos d'adresse, le cours est à http://genie-info.trau.fr
Ce TP nous permettra (une nouvelle fois) de mettre en oeuvre des objets. Nous allons gérer des "dates" (objets contenant 6 attributs entiers : jour, mois, année, heure,minute, seconde). Vous les testerez dans une application simulant une montre – réveil – chronomètre.
1) Pour commencer, vous allez définir la classe « date ». . Vous allez également créer les méthodes suivantes, et les tester dans un programme main : saisir (permet de demander les 6 attributs d'une date), afficher (permet d'afficher la date, par exemple : « le 25/11/2004 à 17h59:59 »). A ce moment, votre programme main doit comporter quelque chose qui ressemble à :
{ date d1; d1.saisir(); d1.afficher(); }
2) continuez à rajouter des méthodes (aujourd'hui je ne vous demande pas d'accesseurs, on n'en aura pas besoin ici)
a) "comparer_a" : on lui donne en argument une autre date, et retourne un entier valant 1 si cette autre date est postérieure, -1 si antérieure, 0 si égale. Je vous conseille une suite de "if - else if - ...- else"
b) "ajouter" : avec un argument entier positif que l'on considérera comme un nombre de secondes, modifie la date en lui ajoutant le nombre de secondes donné. Je vous rappelle que pour des entiers, l'opération / donne le quotient de la division euclidienne (entier), et % donne le reste. Donc si n vaut 133, alors n/60 vaut 2 et n%60 vaut 13 (133s=2mn+13s). Pour simplifier, vous pouvez supposer qu'on ne change jamais de mois, ou que tous les mois font exactement 30 jours.
c) ecart : c'est une fonction à qui l'on donne en argument une autre date, et retourne un entier valant le nombre de secondes la séparant de notre objet (positif ou négatif comme pour « comparer_a »)
d) modifiez « ajouter » pour qu'il puisse aussi prendre en compte des nombres de secondes négatifs
e) surchargez les opérateurs <<, + (j'ai relu vos notes de cours, on en a parlé au 4ème cours, le 31/10, à propos des complexes)
f) en incluant <time.h>, la déclaration « time_t t=time(NULL); » met dans la variable locale t le nombre de secondes écoulées entre le 1/1/1970 et l'instant actuel. Ecrivez la méthode « maintenant » qui mette dans l'objet la date actuelle.
g) Si vous avez le temps, surchargez = =, !=, <, >, <=, >= (ce sont des opérateurs qui retournent l'entier 1 (si vrai) ou 0 (si faux). Surchargez l'opérateur -
3) Passons (enfin) au programme utilisant notre classe. Il contiendra plusieurs dates, l'une d'elles correspondant à la date actuelle. Il comprendra un boucle qui demande ce que l'on veut faire :
pour commencer, si l'on répond 'q' comme quitter, le programme s'arrête. Pour tous les autres cas, la date actuelle est remise à jour et affichée.
rajoutez les options : 'f' pour fixer une date d'alarme, 'a' pour activer l'alarme, un autre appui sur 'a' pour l'arrêter. A chaque affichage de l'heure actuelle, si l'alarme est activée (mais pas encore passée), on affiche un 'A', si c'est l'heure de l'alarme (et jusqu'à 5 mn après) on affiche « DRING !!!!!!!!!!!!!!!!!!!!!! »
rajoutez une option « chrono » : à l'option 't' on donne le top départ (on stocke l'heure de départ), puis à chaque affichage on donne la durée écoulée. Un nouvel appui sur 't' arrête le chrono. L'option 'r' réinitialise le chrono (et on n'affiche plus le chrono).
Il serait peut-être intéressant de définir une classe nommée « horloge »? tant pis, ce sera pour une autre fois.
remarques : une minute contient 60 secondes, une heure 60 mn, un jour 24h. Puis c'est plus dur. Le nombre de jours d'un mois peut être connu en écrivant (en déclaration globale) :
int lng_mois[12]={31,28,31,30,31,30,31,31,30,31,30,31};
C'est un tableau. La longueur du mois de janvier est lng_mois[0]. Mais je serais déjà bien content si vous avancez dans ce TP en supposant que tous les mois font 30 jours. Pour au moins ce siècle et le précédent, toutes les années multiples de 4 sont bissextiles, mais ici aussi, vous pouvez supposer que toutes font 365 jours.
(c) P. TRAU IPST - ULP