• Aucun résultat trouvé

Licence Informatique 2ème annéeProgrammation Objet 1Contrôle continu – 30/06/2020 - 2h00

N/A
N/A
Protected

Academic year: 2021

Partager "Licence Informatique 2ème annéeProgrammation Objet 1Contrôle continu – 30/06/2020 - 2h00"

Copied!
6
0
0

Texte intégral

(1)

Licence Informatique 2ème année

Programmation Objet 1

Contrôle continu – 30/06/2020 - 2h00

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 permet d'utiliser des files et des piles, mais il respecte pas les principes de la POO. Proposez un nouveau programme qui les respectent.

public class Pile{

int p[], max, top;

public Pile(int max){

this.max = max;

this.p = new int[max];

this.top = -1;

}

public boolean empile(int i){

if(top==max-1) return false;

else{

p[++top] = i;

return true;

} }

public int depile() throws java.util.NoSuchElementException{

if(top==-1) throw new java.util.NoSuchElementException();

else return p[top--];

}

public int taille(){

return top+1;

}

public void vider(){

top = -1;

} }

public class File extends java.util.LinkedList<Integer>{

int max=-1;

// cree une file sans limite public File(){

super();

}

// cree une file de taille limitee public File(int max){

super();

this.max = max;

}

public boolean enfile(int i){

if(max==-1 || this.size()<max) return this.add(i);

else return false;

}

public int defile() throws java.util.NoSuchElementException{

return this.removeFirst();

}

(2)

public int taille(){

return this.size();

}

public void vider(){

this.clear();

} }

Exercice 2 (7 points) : on veut manipuler des arbres binaires qui représentent des expressions numériques dans une calculatrice. Il y a donc deux types de nœuds différents dans l'arbre : les feuilles qui portent une valeur et les nœuds internes qui portent une opération.

L'arbre dessiné ci-contre représente l'expression (5+1)/3.

On veut, pour chaque nœud, pouvoir calculer sa valeur. La valeur d'une feuille est le nombre qu'elle porte. La valeur d'un nœud interne est égale au résultat du calcul représenté par le sous-arbre. Par exemple la valeur du nœud '+' du dessin de droite est 6 (soit 5+1), la valeur de la racine est 2.

On veut aussi, pour chaque nœud, pouvoir récupérer sa représentation sous forme de chaine de caractères correctement parenthèsée. Par exemple la chaine qui représente l'arbre ci- contre est (5+1)/3.

Donnez du code objet permettant de représenter ces arbres, de calculer la valeur d'une expression et d'obtenir la chaine de caractères correctement parenthèsée correspondant à l'expression.

Exercice 3 (7 points) : on veut faire un logiciel qui pilote une machine à fabriquer des cocktails. Chaque ingrédient a un nom et un dosage. Les ingrédients sont en nombre limité, et on ne doit pas pouvoir en créer de nouveaux. Dans le cadre de l'exercice, on suppose qu'il n'y a que 3 ingrédients possibles : vin rouge, crème de cassis et vodka. On peut bien sur prendre n'importe quel dosage d'un de ces ingrédients.

Un cocktail a un nom et est composé de divers ingrédients. Par exemple le Communard est constitué d'1/5ème de crème de cassis et de 4/5ème de vin rouge. On veut aussi pouvoir utiliser les cocktails comme ingrédients, pour créer de nouveaux cocktails. Par exemple créer un cocktail contenant 2/3 de Communard et 1/3 de vodka. Mais les cocktails n'ont pas de dosage, sauf s'ils sont utilisés comme ingrédient.

Proposez du code objet pour représenter les cocktails et les ingrédients.

Exercice Bonus (peut rapporter jusqu'à 4 points de plus dans la limite de 20/20) : écrivez un programme qui permet de saisir des notes dans des cases et d'obtenir la moyenne des notes en cliquant sur un bouton, comme dans l'image ci-dessous. La moyenne s'affiche dans une fenêtre de message.

(3)

CO RR

EC TIO N

Exercice 1 : il faut factoriser le code commun (les en-têtes des méthodes taille et vider) dans une interface, découper la classe File en deux classes et mettre les attributs en privé.

public interface StructureLineaire{

public int taille();

public void vider();

}

public class Pile implements StructureLineaire{

private int p[], max, top;

... // le reste ne change pas }

public class File extends java.util.LinkedList<Integer> implements StructureLineaire{

public File(){

super();

}

public boolean enfile(int i){

return this.add(i);

}

public int defile() throws java.util.NoSuchElementException{

return this.removeFirst();

}

public int taille(){

return this.size();

}

public void vider(){

this.clear();

} }

public class FileLimite extends File{

private int max;

public FileLimite(int max){

super();

this.max = max;

}

public boolean enfile(int i){

if(this.size()<max) return this.add(i);

else return false;

} }

Exercice 2

public interface Expression{

public String toString();

public float getVal();

}

public class Valeur implements Expression{

private float val;

public Valeur(float val){

this.val = val;

}

public float getVal(){

return this.val;

}

public String toString(){

(4)

CO RR

EC TIO N

return this.val+"";

} }

public class Operation implements Expression{

private char ope; // +, -, *, / private Expression gauche, droit;

public Operation(char ope){

this.ope = ope;

}

public void addGauche(Expression exp){

this.gauche = exp;

}

public void addDroit(Expression exp){

this.droit = exp;

}

public Expression getGauche(){

return this.gauche;

}

public Expression getDroit(){

return this.droit;

}

public float getVal(){

if(this.ope=='+') return this.gauche.getVal()+this.droit.getVal();

if(this.ope=='-') return this.gauche.getVal()-this.droit.getVal();

if(this.ope=='*') return this.gauche.getVal()*this.droit.getVal();

if(this.ope=='/') return this.gauche.getVal()/this.droit.getVal();

return 0.0f;

}

public String toString(){

return "("+this.gauche.toString()+" "+this.ope+" "+this.droit.toString()+")";

} }

Exercice 3

public interface Ingredient{

public String getNom();

public float getDosage();

}

public class IngredientBasique implements Ingredient{

private String nom;

private float dosage;

private static String[] dispos = {"Vin rouge","Creme de cassis","Vodka"};

private IngredientBasique(String s, float p){

this.nom = s; this.dosage = p;

}

public String getNom(){ return nom; } public float getDosage(){ return dosage; }

public static Ingredient vinRouge(float p){ return new

IngredientBasique(dispos[0],p); } public static Ingredient cremeCassis(float p){ return new

IngredientBasique(dispos[1],p); }

public static Ingredient vodka(float p){ return new IngredientBasique(dispos[2],p);

} }

import java.util.ArrayList;

(5)

CO RR

EC TIO N

public class Cocktail{

private String nom;

private ArrayList<Ingredient> ing;

public Cocktail(String nom){

this.nom = nom;

this.ing = new ArrayList<Ingredient>();

}

public String getNom(){ return this.nom; }

public void addIngredient(Ingredient i){ this.ing.add(i); } }

public class IngredientCocktail extends Cocktail implements Ingredient{

private float dosage;

private IngredientCocktail(String s, float p){

super(s);

this.dosage = p;

}

public float getDosage(){ return dosage; } }

Exercice Bonus import javax.swing.JFrame;

import javax.swing.Box;

import javax.swing.JButton;

import javax.swing.JTextField;

import javax.swing.BoxLayout;

import javax.swing.BorderFactory;

import javax.swing.JOptionPane;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class GUI extends JFrame implements ActionListener{

private JTextField[] notes;

public GUI(int nb){

super("Notes");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.notes = new JTextField[nb];

Box b = new Box(BoxLayout.X_AXIS);

for(int i=0;i<nb;i++){

this.notes[i] = new JTextField(7);

b.add(this.notes[i]);

}

JButton moy = new JButton("moyenne");

moy.addActionListener(this);

b.add(moy);

b.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));

this.add(b);

this.pack();

this.setVisible(true);

}

public void actionPerformed(ActionEvent e){

float f = 0.0f;

try{

for(int i=0;i<this.notes.length;i++) f =

f+Float.parseFloat(this.notes[i].getText());

JOptionPane.showMessageDialog(this,"La moyenne est "+(f/this.notes.length));

}

(6)

CO RR

EC TIO N

catch(NumberFormatException ex){

JOptionPane.showMessageDialog(this,"Note mal saisie");

} }

public static void main(String[] t){

new GUI(3);

} }

Références

Documents relatifs

Faire un programme qui demande d’entrer 4 notes et d’afficher ensuite la moyenne de ces

[r]

[r]

Par exemple, pour trouver un entier dans un arbre, on devra faire un parcours exhaustif dans le cas d'un arbre général, alors qu'un parcours dichotomique suffira pour un arbre

Chaque partie peut être une chaine de caractères, mais aussi une histoire en elle-même : les 1001 Nuits racontent l'histoire de Shéhérazade, qui elle-même raconte des histoires

En outre, les acronymes doivent avoir une méthode String getSigle() qui renvoie la chaine de caractères constituée par les premières lettres de chacun des mots (NB : la méthode

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

 une séquence vidéo montrant des élèves en train de présenter le lycée..  des graphiques représentant les taux de réussite par section des cinq