Licence Informatique 2ème année Programmation Objet 1
Contrôle continu – 05/05/2020 - 1h30
Numéro étudiant : Nom :
Prénom :
Les notes de cours, TD et TP sont (forcément) autorisées.
Exercice 1 (6 points) : le programme suivant a été écrit pour gérer des logements, mais il ne respecte pas les principes de la POO. Proposez un nouveau programme qui les respectent.
public interface Commune{
public int prixMetreCarre();
}
public class Logement{
private String type;
private int surface;
public int getSurface(){
return this.surface;
}
public int prix(Commune c){
if(type.equals("Appartement")) return this.surface*c.prixMetreCarre();
if(type.equals("Maison")) return this.surface*c.prixMetreCarre()*1.2;
} }
Exercice 2 (7 points) : on veut représenter les numérotations de sections de documents, du genre 1.2.3, A-a-1 ou I.B.a Comme il existe plusieurs systèmes de numérotations (avec des chiffres arabes, des chiffres romains, des lettres, etc), on factorise tous ces systèmes dans l'interface suivante :
public interface Numero{
// passe au numéro suivant au même niveau (2 si on est sur 1, ou 1.2 si on est sur 1.1) public void suivant();
// passe a la sous-section suivante (1.1 si on est sur 1, ou 1.2.1 si on est sur 1.2) public void sousSection() throws java.lang.UnsupportedOperationException;
// passe a la sur-section suivante (1.2 si on est sur 1.1.3 ou 2 si on est sur 1.5) public void surSection() throws java.lang.UnsupportedOperationException;
// renvoie la chaine representant le numero public String toString();
}
On suppose qu'il n'existe que 3 niveaux de numérotations. Si on appelle la méthode sousSection sur un numéro de 3e niveau (comme 1.3.4), la méthode lance une UnsupportedOperationException. Si on appelle la méthode surSection sur un numéro de premier niveau (comme 1), le même genre d'exception est levée.
NB : pour lancer une exception de type UnsupportedOperationException, il faut utiliser l'instruction throw new UnsupportedOperationException();
Proposez du code respectant les principes de la POO pour représenter les différents systèmes de numérotations en général, sachant que tout objet représentant une numérotation doit implémenter l'interface Numero. Le code proposé doit comporter une classe Chiffres qui représente la numérotation avec uniquement des chiffres arabes (du genre 1.2.2) et implémente toutes les méthodes de l'interface Numero.
Exercice 3 (7 points) : on veut représenter les personnes dans un programme, avec un prénom, un père, une mère et un sexe.
a- Écrivez une classe Personne qui respecte les principes objet et une méthode main qui crée une personne masculine nommée "Ouranos" (qui n'a pas de parent), une personne féminine nommée "Gaia" (qui n'a pas de parent non plus) et une personne masculine nommée "Cronos" qui a Ouranos et Gaia pour parents. (3 points)
On veut représenter les jumeaux. Un jumeau est une personne qui a un lien avec une autre personne ayant les mêmes parents et le même sexe. L'appel au constructeur de la classe Jumeau doit entrainer la création des deux objets qui représentent les jumeaux, et seulement ces deux objets.
b- Proposez du code objet pour représenter les jumeaux. (4 points)
Exercice Bonus (pouvant rapporter jusqu'à 4 points, dans la limite de 20 points au total bien sur) :
On veut réaliser un programme qui permet de jouer à trouver un nombre entre 0 et 100 et dont l'interface ressemble à l'image suivante. Quand on saisit un nombre dans la zone de texte à gauche et qu'on appuie sur le bouton "soumettre", le texte à droite affiche "Trop petit", "Trop grand" ou "Vous avez gagné".
Écrivez une classe qui correspond à ce jeu.
CO RR
EC TIO N
Exercice 1
public abstract class Logement{
protected int surface;
protected Commune com;
public Logement(int s, Commune c){
this.surface = s;
this.com = c;
}
public int getSurface(){
return this.surface;
}
public abstract int prix();
}
public class Appartement extends Logement{
public Appartement(int s, Commune c){
super(s,c);
}
public int prix(){
return this.surface*this.com.prixMetreCarre();
} }
public class Maison extends Logement{
public Maison(int s, Commune c){
super(s,c);
}
public int prix(){
return (int) (this.surface*this.com.prixMetreCarre()*1.2);
} }
Exercice 2
public abstract class Section implements Numero{
protected int a,b,c;
public Section(){
this.a=1; this.b=0; this.c=0;
}
public void suivant(){
if(this.c==0){
if(this.b==0) this.a = this.a+1;
else this.b = this.b+1;
}
else this.c = this.c+1;
}
public void sousSection() throws java.lang.UnsupportedOperationException{
if(this.b==0) this.b = 1;
else{
if(this.c==0) this.c = 1;
else throw new java.lang.UnsupportedOperationException();
} }
public void surSection() throws java.lang.UnsupportedOperationException{
if(this.c!=0){ this.b = this.b+1; this.c = 0; } else{
if(this.b!=0){ this.a = this.a+1; this.b = 0; }
else throw new java.lang.UnsupportedOperationException();
} } }
public class Chiffres extends Section{
public Chiffres(){
CO RR
EC TIO N
super();
}
public String toString(){
String s = ""+a;
if(b!=0) s = s+"."+b;
if(c!=0) s = s+"."+c;
return s;
} }
Exercice 3
class Personne{
protected String n;
private Personne pere, mere;
private char sexe; // M ou F
public Personne(String n, char sexe, Personne pere, Personne mere){
this.n=n; this.pere=pere; this.mere=mere; this.sexe = sexe;
}
public static void main(String[] t){
Personne o = new Personne("Ouranos",'M',null,null);
Personne g = new Personne("Gaia",'F',null,null);
Personne c = new Personne("Cronos",'M',o,g);
} }
class Jumeau extends Personne{
private Jumeau j;
public Jumeau(String n1, String n2, char sexe, Personne pere, Personne mere){
super(n1,sexe,pere,mere);
this.j = new Jumeau(n2,sexe,pere,mere);
}
private Jumeau(String n, char sexe, Personne pere, Personne mere){
super(n,sexe,pere,mere);
} }
Exercice Bonus
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Jeu extends JFrame implements ActionListener{
private JTextField nb;
private JLabel message;
private int n; // entre 0 et 100 public Jeu(){
super("Deviner un nombre");
this.n = (int) (Math.random()*101);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.nb = new JTextField(10);
this.message = new JLabel("Proposez un nombre entre 0 et 100");
JButton jb = new JButton(" soumettre ");
jb.setSize(new java.awt.Dimension(100,30));
jb.addActionListener(this);
Box b = new Box(BoxLayout.X_AXIS);
b.setBorder(javax.swing.BorderFactory.createEmptyBorder(10,10,10,10));
b.add(this.nb);
b.add(b.createHorizontalStrut(10));
b.add(jb);
CO RR
EC TIO N
b.add(b.createHorizontalStrut(10));
b.add(this.message);
this.add(b,java.awt.BorderLayout.NORTH);
this.pack();
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
try{
int i = Integer.parseInt(this.nb.getText());
if(i==n) this.message.setText("Bravo, vous avez trouv\u00e9 !");
else{
if(i<n) this.message.setText("Trop petit !");
else this.message.setText("Trop grand !");
} }
catch(NumberFormatException ex){ ex.printStackTrace(); } }
public static void main(String[] t){
new Jeu();
} }