Notion de priorité
hunter_civ
Messages postés
15
Statut
Membre
-
hunter_civ Messages postés 15 Statut Membre -
hunter_civ Messages postés 15 Statut Membre -
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
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
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
A voir également:
- Notion de priorité
- Comment avoir la priorité sur le wifi - Forum Réseaux sociaux
- Priorité dans la bande passante ! ✓ - Forum Réseau
- Modifier priorité processus windows 10 permanent ✓ - Forum Autoit / batch
- Modifier la priorité d'un processus sous Windows 10 ? - Forum Windows 10
- Commande priorité wifi ✓ - Forum Réseau
5 réponses
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/
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/
oupsi pardon,
voici le main:
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,
C'est donc la méthode toString que je cherche actuellement à modifier.
Désolé d'avoir mal informé sur mon problème.
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.
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.