Vous allez coder un ensemble de classes pour la gestion d’une entreprise de transport.
Tous les attributs d’une classe seront private
autant que possible. Toute classe disposera de la méthode toString
ainsi que d’un ou de plusieurs constructeurs. Lorsque cela sera nécessaire, vous ajouterez à vos classes des getter, des setter et la méthode equals
.
Tous les attributs correspondant à des quantités seront des entiers : vitesse en kilomètres/heure, coût en euros, distance en kilomètres, durée en heures.
Vous travaillerez de la manière suivante :
À tout moment, votre code devra compiler. Au cas où vous ne seriez pas en mesure d’implémenter certaines méthodes, vous incluerez des commentaires expliquant les difficultés rencontrées, aux endroits incriminés du code.
Une compagnie de transport souhaite gérer les trajets qu’elle propose, les véhicules dont elle dispose et calculer le bénéfice attendu par jour. Vous devez écrire les classes suivantes :
Un véhicule (Vehicle
) peut être un train (Train
) ou un autobus (Bus
).
Un train (Train
) a un nom (name
), une capacité maximale de passagers (passengers
), une vitesse moyenne (speed
) et un coût au kilomètre (kmCost
).
Un autobus (Bus
) a un nom (name
), une capacité maximale de passagers (passengers
), une vitesse moyenne (speed
) et un coût au kilomètre (kmCost
).
Une ville (City
) a un nom (name
) et dispose ou non d’une gare (station
).
Tout véhicule pourra calculer le nombre de voyages qu’il peut effectuer chaque jour (en 24h) sur une distance donnée (méthode nbJourneyPerDay(int distance)
). Attention, ce nombre de voyage doit être un nombre entier. On suppose que les véhicules voyagent sans pause pendant 24h.
On veut également savoir si un véhicule peut partir/arriver d’une ville donnée (méthode compatibleWith(City c)
) : un train ne peut relier que des villes qui disposent d’une gare, un bus n’a aucune contrainte.
Les différents véhicules ont des attributs et méthodes en commun, il est donc possible de factoriser du code. La classe Vehicle
n’a pas à être instanciée et sera donc abstraite. Les classes Vehicle
, Train
et Bus
feront partie du même package vehicle
.
Un trajet (Journey
) a deux villes (city1
et city2
), une distance en kilomètres (distance
), un prix par passager (passengerTicket
) et une liste de véhicules affectés (vehicles
). Comme nous n’avons pour l’instant vu que des tableaux, vous simulerez cette liste par un tableau de taille fixe (100) et l’indice maximal utilisé. Il n’est pas demandé de traiter un éventuel dépassement de tableau. Les classes Journey
et City
feront partie du même package journey
.
En plus des méthodes citées ci-dessus, un trajet disposera :
addVehicle
) pour ajouter un véhicule au trajet. Il faut vérifier que les deux villes du trajet peuvent accueillir le véhicule. Si c’est possible, le véhicule est ajouté et la méthode renvoie true
. Si ce n’est pas possible, le véhicule n’est pas ajouté et la méthode renvoie false
.passengersPerDay
) pour calculer le nombre de passagers transportés sur une journée. On suppose que tous les véhicules sont pleins.contains
) pour tester si un véhicule appartient au trajet.costPerDay
) pour calculer le coût de tous les véhicules du trajet pendant une journée.incomePerDay
) pour calculer le chiffre d’affaire du trajet pendant une journée.benefitPerDay
) pour calculer le revenu du trajet par jour.La classe principale est fournie :
import vehicle.*;
import journey.*;
public class Transportation {
public static void main(String[] args) {
Vehicle[] vehicles = new Vehicle[5];
vehicles[0] = new Train("tgv", 1032, 300, 100);
Train ter = new Train ("ter", 500, 100, 50);
vehicles[1] = ter;
Bus ouibus = new Bus("ouibus", 40, 70, 10);
vehicles[2] = ouibus;
vehicles[3] = new Bus(ouibus);
vehicles[4] = new Train(ter);
for (Vehicle v : vehicles)
System.out.println(v);
System.out.println();
City paris = new City("Paris", true);
City bordeaux = new City ("Bordeaux", true);
City saucats = new City("Saucats", false);
Journey[] journeys = new Journey[2];
journeys[0] = new Journey(paris, bordeaux, 600, 50);
journeys[1] = new Journey(bordeaux, saucats, 20, 4);
for (Vehicle v: vehicles){
for (Journey j : journeys){
if (j.addVehicle(v))
System.out.println(v.getName() + "[speed : "+ v.getSpeed() +
", kmCost : " + v.getKmCost()+", passengers : " + v.getPassengers()+"] added to " + j);
}
}
System.out.println();
int benefit = 0;
for (Journey j : journeys) {
System.out.println(j + " -> passagers/day:" + j.passengersPerDay() +
" income/day:" + j.incomePerDay() + " cost/day:" + j.costPerDay());
benefit += j.benefitPerDay();
}
System.out.println("benefit : "+ benefit );
}
}
Vous devez obtenir le résultat suivant :
Train tgv - nb passengers:1032 - speed:300 km/h - cost:100 euros/km
Train ter - nb passengers:500 - speed:100 km/h - cost:50 euros/km
Bus ouibus - nb passengers:40 - speed:70 km/h - cost:10 euros/km
Bus ouibus - nb passengers:40 - speed:70 km/h - cost:10 euros/km
Train ter - nb passengers:500 - speed:100 km/h - cost:50 euros/km
tgv[speed : 300, kmCost : 100, passengers : 1032] added to Paris-Bordeaux
ter[speed : 100, kmCost : 50, passengers : 500] added to Paris-Bordeaux
ouibus[speed : 70, kmCost : 10, passengers : 40] added to Paris-Bordeaux
ouibus[speed : 70, kmCost : 10, passengers : 40] added to Bordeaux-Saucats
ouibus[speed : 70, kmCost : 10, passengers : 40] added to Paris-Bordeaux
ouibus[speed : 70, kmCost : 10, passengers : 40] added to Bordeaux-Saucats
ter[speed : 100, kmCost : 50, passengers : 500] added to Paris-Bordeaux
Paris-Bordeaux -> passagers/day:16544 income/day:827200 cost/day:984000
Bordeaux-Saucats -> passagers/day:6720 income/day:26880 cost/day:33600
benefit : -163520
Modifiez le programme principal :
Créez un véhicule de votre choix et ajoutez le au trajet Paris-Bordeaux. Avez-vous augmenté le bénéfice? Modifiez si nécessaire le nouveau véhicule de façon à ce que le bénéfice devienne positif.
Ajoutez des tests de la méthode contains
de la classe Journey
.