Table des matières

TP noté - 1h30

Vous allez coder un ensemble de classes pour la gestion financière d’une université.

Code fourni et rendu

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 des accesseurs à vos classes.

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 université souhaite contrôler le coût des formations qu’elle propose. Le coût est ici le nombre d’heures d’enseignement à dispenser.

Vous devez écrire les classes suivantes :

Une formation (Program) est composée d’unités d’enseignement (Course). Une unité d’enseignement est elle même composée d’activités (Activity).

Une activité (Activity) peut être un cours magistral (Lecture) ou un TP (Lab). Le coût d’une activité est calculé par une méthode (getCost) prenant en paramètre le nombre d’étudiants.

Un cours magistral (Lecture) est défini par un nombre d’heures (hours). Le coût d’un cours magistral est simplement son nombre d’heures quel que soit le nombre d’étudiants.

Un TP (Lab) est défini par un nombre d’heures (hours) et un nombre maximum d’étudiants par groupe (nbStudentsMax). Le coût d’un TP dépend du nombre d’étudiants. Il faut en effet tenir compte du nombre de groupes nécessaires pour un nombre d’étudiants donné. Le coût est ensuite le nombre de groupes multiplié par le nombre d’heures.

Il est possible de factoriser du code entre les deux types d’activités. La classe Activity n’a pas à être instanciée et sera donc abstraite. Les classes Activity, Lecture et Lab feront partie du même package activity.

Une unité d’enseignement (Course) a un nom (title) et est composée d’une ou deux activités. Toute unité d’enseignement pourra calculer son coût (getCost) en fonction du nombre d’étudiants (somme des coûts de ses activités).

Une formation (Program) est définie par un nom (title), un coût maximal autorisé (maxCost), le nombre d’étudiants inscrits à cette formation (nbStudents) et la liste de ses unités d’enseignement. Une formation pourra calculer son coût c’est-à-dire le nombre total d’heures d’enseignement (getTotalCost). L’ajout d’une unité d’enseignement (addCourse) à la liste devra vérifier si le nombre d’heures disponibles est suffisant. Vous simulerez la liste par un tableau de taille fixe (10) et l’indice maximal utilisé. La méthode addCourse doit lever une exception si le nombre maximum de cours qu’on peut stocker dans le tableau est atteint.

Les classes Course et Program feront partie du même package course.

La classe principale est fournie :

import course.*;
import activity.*;

public class University{

	public static void main(String[] args) {

		Activity lect1 = new Lecture(16);
		Activity lect2 = new Lecture(24);
		Activity lab1 = new Lab(32, 20);
		Activity lab2 = new Lab(16, 25);
	
		Course[] courses = new Course[4];
		courses[0] = new Course("Java programming", lect2, lab1);
		courses[1] = new Course("Algorithms", lect1);
		courses[2] = new Course("Open source software", lab1);
		courses[3] = new Course("Web programming", lect2, lab2);

		Program[] programs = new Program[3];
		programs[0] = new Program("Program 1", 200, 180);
		programs[1] = new Program("Program 2", 300, 75);
		programs[2] = new Program("Program 3", 80, 30);

		for (Course c : courses) {
			System.out.println(c);
		}
		System.out.println();

		for (Program p : programs) {
			System.out.println("Making program for " + p.getTitle() + " (" + p.getMaxCost() + " hours for "
					+ p.getNbStudents() + " students)");
			for (Course c : courses) {
				boolean added = false;
				try {
					added = p.addCourse(c);
				}
				catch (MaxSizeExceededException e) {
					System.out.println("Course " + c.getTitle() + " not added - maximum number of courses per program = " + e.getSize());
					break;
				}
				if (added)
					System.out.println("Course '" + c.getTitle() + "' added");
				else {
					System.out.println("Not enough hours left for adding '" + c.getTitle() + "'");
				}
			}
				
			System.out.println();
		}

		for (Program p : programs) {
			int totalCost = p.getTotalCost();
			System.out.println(p.getTitle() + " : cost/student " + totalCost / (double) p.getNbStudents() + " hours, margin = "
					+ (p.getMaxCost() - totalCost));
		}
	}

}

Vous devez obtenir le résultat suivant :

Java programming : Lecture(24h) Lab work(32h) 
Algorithms : Lecture(16h) 
Open source software : Lab work(32h) 
Web programming : Lecture(24h) Lab work(16h) 

Making program for Program 1 (200 hours for 180 students)
Not enough hours left for adding 'Java programming'
Course 'Algorithms' added
Not enough hours left for adding 'Open source software'
Course 'Web programming' added

Making program for Program 2 (300 hours for 75 students)
Course 'Java programming' added
Course 'Algorithms' added
Course 'Open source software' added
Not enough hours left for adding 'Web programming'

Making program for Program 3 (80 hours for 30 students)
Not enough hours left for adding 'Java programming'
Course 'Algorithms' added
Course 'Open source software' added
Not enough hours left for adding 'Web programming'

Program 1 : cost/student 0.9333333333333333 hours, margin = 32
Program 2 : cost/student 3.9466666666666668 hours, margin = 4
Program 3 : cost/student 2.6666666666666665 hours, margin = 0