Table des matières

TP noté - 1h45

Vous allez coder un ensemble de classes pour la gestion d’une entreprise de transport.

Rendu de vos sources

Règles du TP

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.

Description de l’exercice

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 :

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 :