Ex 5
Ex 5
Ex 5
Corriges semaine 3
Les corrigés proposés correspondent à l'ordre des apprentissages : chaque corrigé correspond à la solution à laquelle vous pourriez
aboutir au moyen des connaissances acquises jusqu'à la semaine correspondante.
import java.util.Calendar;
import java.util.ArrayList;
/**
* Classe principale
*/
class Direction
{
public static void main(String[] args) {
Ecole epfl = new Ecole(5);
epfl.add(new EtudiantRegulier("Gaston Peutimide", 2013, "SSC", 6.0));
epfl.add(new EtudiantRegulier("Yvan Rattrapeur", 2011, "SSC", 2.5));
epfl.add(new EtudiantEchange("Bjorn Borgue", 2012, "Informatique", "KTH"));
epfl.add(new Enseignant("Mathieu Matheu", 1998, "LMEP", 10000, "Physique"));
epfl.add(new Secretaire("Sophie Scribona", 2005, "LMT", 5000));
epfl.afficherStatistiques();
epfl.afficherEPFLiens();
}
/**
* La direction
*/
class Ecole {
private ArrayList<EPFLien> gens;
/**
* Cette méthode affiche l'ancienneté moyenne des personnes fréquentant l'école
* et le nombre d'étudiants parmi eux
*/
public void afficherStatistiques() {
int anneeCourante = Calendar.getInstance().get(Calendar.YEAR);
int nbAnneesTotal = 0;
int nbEtudiants = 0;
for (EPFLien epflien : gens) {
nbAnneesTotal = nbAnneesTotal + (anneeCourante - epflien.getAnnee());
if (epflien.estEtudiant()){
++nbEtudiants;
}
}
System.out.println("Parmi les " + gens.size() + " EPFLiens, " +
nbEtudiants + " sont des etudiants.");
double moyen = nbAnneesTotal;
moyen /= gens.size();
System.out.println("Ils sont ici depuis en moyenne " + moyen + " ans");
}
// Cette méthode affiche les caractéristiques des personnes fréquentant l'école
public void afficherEPFLiens() {
System.out.println("Liste des EPFLiens: ");
for (EPFLien epflien : gens)
epflien.afficher();
}
}
/**
* Les personnes fréquentant l'EPFL
*/
class EPFLien {
private String nom;
private int annee;
/**
* Les étudiants
*/
class Etudiant extends EPFLien {
private String section;
/**
* Les étudiants régulier
*/
class EtudiantRegulier extends Etudiant {
private double moyenne;
/**
* Les étudiants d'échange
*/
class EtudiantEchange extends Etudiant {
private String uniOrigine;
/**
* Le personnel de l'EPFL
*/
class Personnel extends EPFLien {
private String labo;
private int salaire;
public Enseignant(String nom, int annee, String labo, int salaire, String section) {
super(nom, annee, labo, salaire);
this.section = section;
}
class Courrier {
// retourne le montant n'ecessaire pour affranchir le courrier
// en mode d'exp'edition normal
@Override
public String toString() {
String s = "";
if (!valide())
{
s+= "(Courrier invalide)\n";
}
s+= " Poids : " + poids + " grammes\n";
s+= " Express : " + (express ? "oui" : "non") + "\n";
s+= " Destination : " + adresse + "\n";
s+= " Prix : " + affranchir() + " CHF\n";
return s;
}
// red'efinit affranchirNormal()
public double affranchirNormal() {
double montant = 0;
if (format.equals("A4")){
montant = 2.0;
} else {
montant = 3.5;
}
montant += getPoids()/1000.0;
return montant;
}
@Override
public String toString() {
String s = "Lettre\n";
s += super.toString();
s += " Format : " + format + "\n";
return s;
}
}
/* Une classe pour repr'esenter les publicit'es
*/
// redéfinit affranchirNormal()
public double affranchirNormal() {
return getPoids()/1000.0 * 5.0;
}
@Override
public String toString() {
String s = "Publicité\n";
s += super.toString();
return s;
}
// redéfinit affranchirNormal();
public double affranchirNormal() {
// affranchit les colis selon une formule pr'ecise
return 0.25 * volume + getPoids()/1000.0;
}
@Override
public String toString() {
String s = "Colis\n";
s += super.toString();
s += " Volume : " + volume + " litres\n";
return s;
}
class Boite {
// constructeur
public Boite(int max) {
contenu = new Courrier[max];
index = 0;
}
// la méthode demand'ee
public double affranchir() {
double montant = 0.0;
for(int i=0; i < index; ++i){
Courrier c = contenu[i];
montant += c.affranchir();
}
return montant;
}
Publicite pub1 = new Publicite(1500, true, "Les Moilles 13A, 1913 Saillon");
Publicite pub2 = new Publicite(3000, false, ""); // invalide
Colis colis1 = new Colis(5000, true, "Grand rue 18, 1950 Sion", 30);
Colis colis2 = new Colis(3000, true, "Chemin des fleurs 48, 2800 Delemont", 70); //Colis invalide !
boite.ajouterCourrier(lettre1);
boite.ajouterCourrier(lettre2);
boite.ajouterCourrier(pub1);
boite.ajouterCourrier(pub2);
boite.ajouterCourrier(colis1);
boite.ajouterCourrier(colis2);
Une version simple du Puissance4 vous est fournie. Une bonne extension consiste à essayer de coder des stratégies de jeu un peu plus
élaborées.
import java.util.Scanner;
/**
* Classe principale
*/
class Puissance4 {
protected static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Entrez votre nom: ");
String nom = scanner.nextLine();
System.out.println("--");
class Partie {
if (jeu.cherche4()) {
vainqueur = cJoueur;
}
class Jeu {
// final static est une bonne maniere de
// definir des constantes (voir aux cours prochains)
public final static int VIDE = 0;
public final static int BLEU = 1;
public final static int ROUGE = 2;
public Jeu() {
initJeu(8);
}
/**
* Cette méthode vérifie toutes les lignes, colonnes et diagonales pour une série de 4 pions
* de la même couleur. Si une telle série existe, retourne true.
*
* Notez qu'il n'est pas nécessaire de retourner la couleur des 4 pions alignés,
* puisqu'il s'agit de celle de celui qui vient de jouer.
* @return true si le jeu contient 4 pions alignés
*/
public boolean cherche4() {
// Vérifie les horizontales ( - )
for (int ligne = 0; ligne < taille; ligne++) {
if (cherche4alignes(0, ligne, 1, 0)) {
return true;
}
}
/**
* Cette méthode cherche 4 pions alignés sur une ligne. Cette ligne est définie par
* le point de départ, ou origine de coordonnées (oCol,oLigne), et par le déplacement
* delta (dCol,dLigne). En utilisant des valeurs appropriées pour dCol et dLigne
* on peut vérifier toutes les directions:
* - horizontale: dCol = 0, dLigne = 1
* - vérticale: dCol = 1, dLigne = 0
* - 1ère diagonale: dCol = 1, dLigne = 1
* - 2ème diagonale: dCol = 1, dLigne = -1
*
* @param oCol Colonne d'origine de la recherche
* @param oLigne Ligne d'origine de la recherche
* @param dCol Delta de déplacement sur une colonne
* @param dLigne Delta de déplacement sur une ligne
* @return true si on trouve un alignement
*/
private boolean cherche4alignes(int oCol, int oLigne, int dCol, int dLigne) {
int couleur = VIDE;
int compteur = 0;
while ((curCol >= 0) && (curCol < taille) && (curRow >= 0) && (curRow < taille)) {
if (grille[curRow][curCol] != couleur) {
// Si la couleur change, on réinitialise le compteur
couleur = grille[curRow][curCol];
compteur = 1;
} else {
// Sinon on l'incrémente
compteur++;
}
/**
* Vérifie s'il est encore possible de placer des pions
* @return true si le tableau est plein
*/
public boolean estPlein() {
// On cherche une case vide. S'il n'y en a aucune, le tableau est plein
for (int col = 0; col < taille; col++) {
for (int ligne = 0; ligne < taille; ligne++) {
if (grille[col][ligne] == VIDE) {
return false;
}
}
}
return true;
}
class Joueur {
private String nom;
private int couleur;
/**
* Cette méthode joue un coup avec le tableau reçu en paramètre.
* La méthode est vide car les sous-classes doivent l'implémenter.
* (Vous verrez prochainement comment gérer ce genre de cas plus proprement)
* @param jeu Le Jeu avec lequel jouer.
*/
public void joue(Jeu jeu) {}
boolean valide;
do {
System.out.println("Joueur " + this.getNom() + ", entrez un numéro de colonne" +
" (entre 1 et " + jeu.getTaille() + ") : ");
//======================================================================