NFA032 : annale Première session 2015 semestre 1

Modérateurs : F. Barthélemy, eric.soutil

Verrouillé
V.B.fod31
Messages : 83
Inscription : 10 févr. 2014 12:58

NFA032 : annale Première session 2015 semestre 1

Message par V.B.fod31 » 28 janv. 2017 17:27

Bonjour,

Exercice 5 : interface/héritage (5 points)
On veut représenter en programmation objet des expressions arithmétiques sur les nombres entiers. Une expression arithmétique peut être soit une valeur littérale (un nombre) soit un opérateur appliqué à deux expressions arithmétiques. Une expression peut être calculée pour donner un résultat qui est un entier.
Question 1
Dans une version simplifiée, un opérateur ne peut être appliqué qu’à deux nombres. Écrivez les classes et interfaces nécessaires pour pouvoir représenter une valeur littérale, les expressions avec opérateurs + et les expressions avec opérateur * (on pourrait faire aussi les autres opérateurs de la même façon).
Écrivez une méthode main qui utilise ces classes. Déclarez dans le main une variable var dans laquelle sont affectées successivement une valeur littérale et une expression arithmétique avec opérateur. Puis le programme affiche le résultat du calcul pour cette expression avec opérateur. Un squelette de cette méthode main est proposé :
public static void main(String[] args) {
XXX var;
var = .... donner le code pour créer un objet représentant
le nombre 17 ...
var = .... donner le code pour créer un objet représentant
l’expression 5 * 3 .....
Terminal.ecrireIntln(... donner le code pour calculer la valeur
de l’expression contenue dans var ....);
}
Question 2
Modifiez les classes des opérateurs pour permettre que les deux opérandes puissent être aussi bien
d’autres expressions avec opérateur que des valeurs littérales. Par exemple, on veut pouvoir représenter 5*3 (comme à la question précédente) mais aussi 5*(3+2) et (5+(2*3))+(3*2).

Est-ce que ceci répond bien aux questions ?
Question 1 :
interface ExpressionArithmetique{public int getResultat();}
class ValeurLitterale implements ExpressionArithmetique{
public int v;
ValeurLitterale(int v){this.v = v;}
public int getResultat(){return v;
}}
class Operation implements ExpressionArithmetique{
public ValeurLitterale val1;
public ValeurLitterale val2;
public int resutat;
Operation(int n1, int n2){
this.val1 = new ValeurLitterale(n1);
this.val2 = new ValeurLitterale(n2);}
public int getResultat(){return resutat;
}}
class Addition extends Operation{
Addition(int n1, int n2){
super(n1,n2);
this.resutat = val1.v + val2.v;
}}
class Multiplication extends Operation{
Multiplication(int n1, int n2){
super(n1,n2);
this.resutat = val1.v * val2.v;
}}
class Exo5{
public static void main(String[] args){
ExpressionArithmetique var;
var = new ValeurLitterale(17);
var = new Multiplication(5,3);
Terminal.ecrireIntln(var.getResultat());
}}

question 2
ExpressionArithmetique et ValeurLitterale sont inchangées
Les classes suivantes changent par rapport à la question 1
class Operation implements ExpressionArithmetique{
public ExpressionArithmetique expression1;
public ExpressionArithmetique expression2;
public int resutat;
Operation(ExpressionArithmetique expression1, ExpressionArithmetique expression2){
this.expression1 = expression1;
this.expression2 = expression2;}
public int getResultat(){return resutat;
}}
class Addition extends Operation{
Addition(ExpressionArithmetique expression1, ExpressionArithmetique expression2){
super(expression1,expression2);
this.resutat = expression1.getResultat() + expression2.getResultat();}
public int getResultat(){return resutat;
}}
class Multiplication extends Operation{
Multiplication(ExpressionArithmetique expression1, ExpressionArithmetique expression2){
super(expression1,expression2);
this.resutat = expression1.getResultat() * expression2.getResultat();// a revoir}
public int getResultat(){return resutat;
}}
class Exo5{
public static void main(String[] args){
//5*(3+2) et (5+(2*3))+(3*2).
//5*(3+2)
ValeurLitterale val2 = new ValeurLitterale(2);
ValeurLitterale val3 = new ValeurLitterale(3);
ValeurLitterale val5 = new ValeurLitterale(5);
Multiplication multiplier2et3 = new Multiplication(val2, val3);
Addition additionner2et3 = new Addition(val2, val3);
ExpressionArithmetique var = new Multiplication(val5,additionner2et3);
Terminal.ecrireIntln(var.getResultat());

//(5+(2*3))+(3*2) = 11 + 6 = 17
//5+(2*3)
ExpressionArithmetique var2 = new Addition(val5, multiplier2et3);
//(5+(2*3))+(3*2)
ExpressionArithmetique var3 = new Addition( var2 ,multiplier2et3);
Terminal.ecrireIntln(var3.getResultat());
}}

Dans le cas où cela répond à l'énoncé : Y-a-t-il plus simple ?
Merci :)

achabe
Messages : 21
Inscription : 20 oct. 2016 18:09

Re: NFA032 : annale Première session 2015 semestre 1

Message par achabe » 06 avr. 2017 12:01

Salut,

Voici ma solution, que je trouve un chouillat plus simple, mais c'est une question de point de vue :

Question 1

Code : Tout sélectionner

interface ExpressionArithmetique{
	int calculer();
}

public class ValeurLitterale implements ExpressionArithmetique{
	int val;
	public ValeurLitterale(int v){val=v;}
	public int calculer(){return val;}
}

public class ExpressionPlus implements ExpressionArithmetique{
	ValeurLitterale val1, val2;
	public ExpressionPlus(int v1, int v2){
		val1 = new ValeurLitterale(v1);
		val2 = new ValeurLitterale(v2);
	}
	public int calculer(){
		return val1.calculer() + val2.calculer();
	}
}

public class ExpressionFois implements ExpressionArithmetique{
	ValeurLitterale val1, val2;
	public ExpressionFois(ValeurLitterale v1, ValeurLitterale v2){
		val1 = new ValeurLitterale(v1);
		val2 = new ValeurLitterale(v2);
	}
	public int calculer(){
		return val1.calculer() * val2.calculer();
	}
}

public static void main(String[] args) {
	ExpressionArithmetique var;
	var = new ValeurLitterale(17);
	var = new ExpressionFois(5, 3);
	Terminal.ecrireIntln(var.calculer());
}
Question 2
On n'a qu'à remplacer dans les classes ExpressionXXX ValeurLitterale par ExpressionArithmetique :

Code : Tout sélectionner

interface ExpressionArithmetique{
	int calculer();
}

public class ValeurLitterale implements ExpressionArithmetique{
	int val;
	public ValeurLitterale(int v){val=v;}
	public int calculer(){return val;}
}

public class ExpressionPlus implements ExpressionArithmetique{
	ExpressionArithmetique val1, val2;
	public ExpressionPlus(ExpressionArithmetique v1, ExpressionArithmetique v2){
		val1=v1;
		val2=v2;
	}
	public int calculer(){
		return val1.calculer() + val2.calculer();
	}
}

public class ExpressionFois implements ExpressionArithmetique{
	ExpressionArithmetique val1, val2;
	public ExpressionFois(ExpressionArithmetique v1, ExpressionArithmetique v2){
		val1=v1;
		val2=v2;
	}
	public int calculer(){
		return val1.calculer() * val2.calculer();
	}
}

public static void main(String[] args) {
	ExpressionArithmetique var;
	var = new ExpressionFois(new ValeurLitterale(5), new ExpressionPlus(new ValeurLitterale(3), new ValeurLitterale(2)));
	Terminal.ecrireIntln(var.calculer());
}

public static void main(String[] args) {
	ExpressionArithmetique var, temp;
	temp = new ExpressionFois(new ValeurLitterale(3), new ValeurLitterale(2));
	var = new ExpressionPlus(new ExpressionPlus(5, temp), temp);
	Terminal.ecrireIntln(var.calculer());
}

achabe
Messages : 21
Inscription : 20 oct. 2016 18:09

Re: NFA032 : annale Première session 2015 semestre 1

Message par achabe » 06 avr. 2017 12:28

Pour l'exercice 4, voici ma proposition :
Pour répondre à la question 3, la méthode renvoie la boite si elle appartient à la tournée, et null sinon, et non pas un booléen, ceci parce que cela nous sera utile à la question 4.
Pour répondre à la question 4, on insère la nouvelle boite que si on trouve dans la tournée la boite passée en paramètre, sinon on ne fait rien.

Code : Tout sélectionner

public class Boite{
	int numRue;
	String nomRue;
	String nomTit;
	Boite suivante;
	
	public Boite(int num, String nr, String nt, Boite suiv){
		numRue = num;
		nomRue = nr;
		nomTit = nt;
		suivante = suiv;
	}
	
	public void afficher(){
		Boite tmp = this;
		while (tmp != null){
			Terminal.ecrireStringln(tmp.numRue + " " + tmp.nomRue + " : " + tmp.nomTit);
			tmp = tmp.suivante;
		}
	}
	
	public Boite appartientTournee(int num, String nr, String nt){
		boolean test = (num == numRue) && nr.equals(nomRue) && nt.equals(nomTit);
		if (test)
			return this;
		else {
			if (suivante == null)
				return null;
			else
				return suivante.appartientTournee(num, nr, nt);
		}
	}
	
	public void ajouterBoite(int num, String, nr, String nt, String newTit){
		Boite boitePrecedente = appartientTournee(num, nr, nt);
		if (boitePrecedente != null){
			Boite newBoite = new Boite(num+2, nr, newTit, boitePrecedente.suivante);
			boitePrecedente.suivante = newBoite;
		} /* else on ne fait rien ... */
	}
}

Verrouillé

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité