JAVA MIASHS 1/2017 – TP 1

NB : Vous devez faire un rapport de TP dans lequel vous répondrez aux questions, avec notamment des copies des exécutions de vos programmes (ce qui s’affiche quand vous exécutez un programme).

Exercice 1. Premiers pas

Le but de cet exercice est de se familiariser avec la méthode main pour le lancement de programmes, les sorties standard System.out.println et avec la classe Console, qui vous est fournie pour permettre des entrées de données simplifiées.

  1. Écrivez une classe, appelée PremiersPas, qui ne contient qu’une méthode, la méthode main, dans laquelle vous afficherez une chaîne de caractères quelconque (par exemple le classique « Hello, world »). Tapez le code dans un fichier au nom approprié, compilez et exécutez.
  2. En utilisant la classe Console écrivez un programme pour afficher la question « Fait-il beau ? », attendre une réponse « oui » ou « non ». Si la réponse est « oui », le programme affichera « Tant mieux ! », si c’est « non », il affichera « Espérons que ce soit mieux demain », et si ce n’est ni l’un ni l’autre, « je ne comprends pas ! ».
  3. Modifiez le programme précédent pour que, tant que la saisie de l’utilisateur est incorrect, le programme affiche « merci de répondre par oui ou par non » et redemande une réponse (accepter aussi « o » et « n » comme réponses valides

Exercice 2. Une classe pour manipuler des heures

Voici l’ébauche d’une classe que nous allons appeler Times, destinée à manipuler des heures. Une heure sera représentée par une instance de la classe Times. Celle-ci aura en interne 3 attributs entiers, un pour la valeur de l’heure représentée par cette instance, un pour celle de la minute et un pour celle de la seconde.

2.1 Constructeurs

public class Times {

    private int hours, mins, secs;

    public Times() {
        java.time.LocalDateTime now = java.time.LocalDateTime.now();
        hours=now.getHour();
        mins=now.getMinute();
        secs=now.getSecond();
    }

    public Times(int hours, int mins, int secs) {
        this.hours = hours;
        this.mins = mins;
        this.secs = secs;
    }

    public Times(Times source) {
        this(source.hours, source.mins, source.secs);
    }
}

Il y a ici 3 constructeurs. Le premier, sans arguments, initialise l’heure à l’heure courante du système (pour cela elle utilise une librairie, java.time.LocalDateTime). Le troisième est ce qu’on appelle un constructeur par copie. Il crée un nouvel objet, dont le contenu est une copie de l’original fourni en argument (on a donc bien 2 objets différents en mémoire, ayant les mêmes valeurs).

  1. Implémentez un constructeur n’ayant que 2 arguments, un pour l’heure et un pour les minutes. Que mettre pour les secondes ? Pour cela il est préférable d’utiliser le constructeur ayant 3 arguments (observez le constructeur par copie pour trouver la syntaxe). Quel sont les avantages d’une telle méthode ?
  2. Pourquoi ne peut-on pas faire la même chose avec le constructeur sans arguments ? Y a-t-il une façon de contourner le problème pour que tous les objets soient construits par le même code ?

2.2 Méthodes

On donne maintenant 3 méthodes : toString() permettant de créer une chaîne de caractères pour représenter l’objet, equals(Times t)pour vérifier si 2 heures correspondent au même instant, et addMinutes(int n) pour ajouter n minutes à l’objet.

    public String toString() {
        return hours+":"+mins+":"+secs;
    }

    public boolean equals(Times other) {
        return (this.hours == other.hours)
                && (this.mins == other.mins)
                && (this.secs == other.secs);
    }

    public void addMinutesInit(int n) {
        this.mins+=n;
    }

Pour tester cette classe, il faut écrire une fonction main dans laquelle on va pouvoir faire appeler les différentes constructeurs et méthodes avec des valeurs variées, afin de repérer les problèmes éventuels.

  1. Que mettre dans une telle fonction ?
  2. Implémentez cette méthode de test.
  3. Que se passe t’il si on ajoute 90 minutes à une heure donnée (il faudra essayer en affichant le résultat).
  4. Quels sont les différents problèmes rencontrés?
  5. Corrigez les méthodes pour lesquelles des problèmes ont été rencontrés.

Revenons aux constructeurs.

  1. Que se passe-t-il si on exécute la ligne suivante
        Times t=new Times(1,65,99);
    
  2. Pouvez vous imaginer une façon de régler ce problème ?

2.3 De nouvelles méthodes

  1. Implémenter deux méthodes pour tester si une heure est avant ou après une autre:
    • public boolean isBefore(Times t)
    • public boolean isAfter(Times t)
  2. Implémentez une méthode pour ajouter des secondes.
  3. Pouvez vous proposer d’autres méthodes utiles pour manipuler des heures ?

2.4 Une alarme

L’une des utilisations possibles d’une telle classe est de créer un minuteur.

  1. Imaginez une méthode permettant de lancer un minuteur en lui donnant le nombre de secondes. Le minuteur affichera un message après le bon nombre de secondes. Attention: on utilisera plutôt des secondes pour ne pas avoir à attendre des minutes le test, attention à le lancer au début avec de toutes petites valeurs – 1 ou 2 secondes.
  2. Quels sont les problèmes rencontrés

Exercice 3. Modélisation – Autopartage

Pour une activité de d’autopartage, nous souhaitons faire une application permettant de gérer le parc de voitures et les conducteurs. Ces derniers peuvent prendre un voiture à n’importe quel site, et les rendre à un autre site (on considère qu’il n’y a pas de problème de place, chaque site peut stocker autant de voitures que nécessaire).

On souhaite stocker les informations suivantes :

  • Pour les voitures : immatriculation, marque, modèle, nombre de portes, nombre de passagers, clim ou non, boite manuelle ou automatique (ces informations permettront au client de mieux cibler leur recherche).
  • Pour les sites d’autopartage : nom du site, localisation.
  • Pour les conducteurs : prénom, téléphone, voiture en cours d’utilisation.

Analyse

  1. De combien de classes avons nous besoin ?
  2. Quels sont les attributs de ces classes ?
  3. Quelles sont les méthodes nécessaires ?

Il n’est pas demandé d’implémenter ces classes pour l’instant (mais vous pouvez le faire pour vous entraîner).