Notion de priorité

Fermé
hunter_civ Messages postés 9 Date d'inscription jeudi 8 octobre 2020 Statut Membre Dernière intervention 27 octobre 2020 - 19 oct. 2020 à 12:43
hunter_civ Messages postés 9 Date d'inscription jeudi 8 octobre 2020 Statut Membre Dernière intervention 27 octobre 2020 - 19 oct. 2020 à 16:16
Bonjour,

Je bloque sur la dernière question de mon DM. Il s'agissait de programmer les les opérations + et * ainsi que de gérer l'affichage.

J'arrive au stade où il l'on me demande de gérer l'affichage des parenthèses

public String toString(){
        return "(" + left.toString() + ")" + op.getToken() + "(" + right + ")";
    }


getToken est une méthode d'un Enum pour sélectionner l'opération plus ou fois.

Actuellement, voici ce qu le main me retourne ((3)+(1))*(2) = 8

Je dois donc modifier l'affichage de la méthode toString pour tenir compte des priorités des operations. Mais je n'ai vraiment pas d'idée sur comment procéder. Auriez-vous des idées?

Merci pour l'aide apportée


Configuration: Windows / Chrome 86.0.4240.75

5 réponses

yg_be Messages postés 22692 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 avril 2024 1 471
19 oct. 2020 à 13:32
bonjour,
si je vois bien, tu nous montres ce que est retourné, sans nous montrer ce qui es entré.
je pense que ceci t'aidera à progresser: https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
0
hunter_civ Messages postés 9 Date d'inscription jeudi 8 octobre 2020 Statut Membre Dernière intervention 27 octobre 2020
19 oct. 2020 à 14:23
oupsi pardon,

voici le main:

Expr plus = new BinOp(Op.PLUS, new IntLit(3), new IntLit(1));
Expr timesPlus = new BinOp(Op.TIMES, plus, new IntLit(2));
System.out.println(timesPlus + " = " + timesPlus.eval());


La classe InLit permet de renvoyer l'expression ou la valeur d'un entier, la classe Expr est une interface pour évaluer une opération.

Il reste BinOp,
public record BinOp(Op op, Expr left, Expr right) implements Expr {

@Override
public String toString(){
return "(" + left.toString() + ")" + op.getToken() + "(" + right + ")";
}

public int eval(){
return switch (op) {
case PLUS -> left.eval() + right.eval();
case TIMES -> left.eval() * right.eval();
};
}

}


C'est donc la méthode toString que je cherche actuellement à modifier.

Désolé d'avoir mal informé sur mon problème.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 oct. 2020 à 15:40
Bonjour,

Tout d'abord, attention : la dernière version LTS (Long Time Support) de Java est Java 11, la prochaine LTS sera Java 17 (fin 2021), les versions intermédiaires introduisent de nouvelles fonctionnalités qui peuvent être testées mais ne sont pas définitives.
En l’occurrence dans ton code cela concerne les switch expressions de Java 13 et les record de Java 14.

La liste des "preview feature" est disponible dans la documentation :
https://docs.oracle.com/javase/specs/

Ceci étant dit, je pense qu'il faudrait que tu retravailles sur ton enum Op, d'une part pour qu'elle porte l'opération que tu as mis dans ton switch (par exemple à l'aide d'une lambda BinaryOperator), d'autre part pour ajouter une valeur de priorité de chaque opération, sans cela tu ne pourras pas savoir quelle opérateur est plus fort qu'un autre.
Quant à la manière de déterminer s'il faut ou non des parenthèses cela devrait se calculer en comparant la valeur de priorité de l'opérateur avec les valeurs de priorité des expressions.

La liste de priorité des opérateurs est disponible dans la documentation : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
0
hunter_civ Messages postés 9 Date d'inscription jeudi 8 octobre 2020 Statut Membre Dernière intervention 27 octobre 2020
19 oct. 2020 à 15:50
Je vois ce que tu veux dire mais je n'ai pas le droit de modifier autre chose que la méthode ToString ce qui complique les choses. J'ai pensé à ajouter un switch dans cette méthode mais cela gère les parenthèses que pour des cas particuliers
0
yg_be Messages postés 22692 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 avril 2024 1 471
19 oct. 2020 à 16:08
le but du DM n'est-il pas d'évaluer l'apprentissage? à quoi cela peut-il bien servir de se faire ainsi aider, dans ce contexte?
cela ne montre-t'-il pas simplement que tu dois continuer à apprendre?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hunter_civ Messages postés 9 Date d'inscription jeudi 8 octobre 2020 Statut Membre Dernière intervention 27 octobre 2020
19 oct. 2020 à 16:16
Bonjour,
Tu as tout à fait raison, mais je t'avouerais que j'ai pas mal cherché cette dernière question et que je n'ai pas d'idée pour la résoudre. C'est pour ç a que je viens chercher de l'aide ici.

Je comprends tout à fait ton point de vue, je devrais réfléchir et me débrouiller par moi-même.
Merci KX pour ta proposition.
0