Exercice Java : Interfaces et Classes Abstraites

EXERCICE + CORRIGE EN JAVA :  Expressions arithmétiques

On considère maintenant des expressions arithmétiques formées à partir de constantes réelles (nombres flottants) et utilisant les quatre opérations arithmétiques usuelles (addition, soustraction, multiplication et division). Un telle expression est par exemple 3 + (4.7 + 2.3) * 5 .

Ces expressions arithmétiques sont représentés par des arbres binaires. Les nœuds internes de l'arbre contiennent les opérateurs alors que Les feuilles de l'arbre contiennent les constantes. Les fils gauche et droit d'un nœud interne représentent les deux sous-expressions gauche et droite. L'expression 3 + (4.7 + 2.3) * 5 par l'arbre de la figure ci-dessous.


FIG 1. L'arbre de l'expression 3 + (4.7 + 2.3) * 5

L'organisation en interfaces et classes

1) ---------

Définir une interface ArithExpr qui déclare les fonctionnalités d'une expression arithmétique. La seule fonctionnalité requise est de pouvoir être évaluée. Déclarer en conséquence une méthode eval du bon type.

Pour représenter l'expression, on va créer des objets pour chacun des nœuds. Ces objets vont bien sûr être des instances de classes différentes suivant qu'il s'agisse de nœuds internes ou de feuilles.

2) -------

Définir une classe Constant pour représenter les constantes des expressions.

3)-------

Définir quatre classes Addition, Soustraction, Multiplication et Division pour les opérations arithmétique. On remarque que ces quatre classes partagent beaucoup de propriétés. Comment faut-il faire pour partager le code ?

4)-------

Redéfinir la méthode toString afin d'afficher les expressions en notation infixe. Écrire des méthodes prefix et suffix permettant d'afficher les expressions en notation préfixe et suffixe.

5)-------

Écrire une methodes prefix et suffix permettnat d'afficher  les expressions arithmétique en notation prefix et suffix.

Solution

// Interface for arithmetic expressions
interface ArithExpr {
    double eval();
    String toString();
    String prefix();
    String suffix();
}

// Class representing constants
class Constant implements ArithExpr {
    private double value;

    public Constant(double value) {
        this.value = value;
    }

    @Override
    public double eval() {
        return value;
    }

    @Override
    public String toString() {
        return Double.toString(value);
    }

    @Override
    public String prefix() {
        return Double.toString(value);
    }

    @Override
    public String suffix() {
        return Double.toString(value);
    }
}

// Classes representing arithmetic operations
class Addition implements ArithExpr {
    private ArithExpr left;
    private ArithExpr right;

    public Addition(ArithExpr left, ArithExpr right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public double eval() {
        return left.eval() + right.eval();
    }

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

    @Override
    public String prefix() {
        return "(+ " + left.prefix() + " " + right.prefix() + ")";
    }

    @Override
    public String suffix() {
        return "(" + left.suffix() + " " + right.suffix() + " +)";
    }
}

public class ArithExprTest {
    public static void main(String[] args) {
        // Create constant values
        ArithExpr constant1 = new Constant(3.0);
        ArithExpr constant2 = new Constant(4.7);
        ArithExpr constant3 = new Constant(2.3);
        ArithExpr constant4 = new Constant(5.0);


// Create expression tree: 3 + (4.7 + 2.3) * 5
        ArithExpr expression = new Addition(
                constant1,
                new Multiplication(
                        new Addition(constant2, constant3),
                        constant4
                )
        );

        // Test evaluation
        System.out.println("Evaluation result: " + expression.eval());

        // Test infix, prefix, and suffix notations
        System.out.println("Infix Notation: " + expression.toString());
        System.out.println("Prefix Notation: " + expression.prefix());
        System.out.println("Suffix Notation: " + expression.suffix());
    }
}
    

Si vous avez trouvé les exercices corrigés en Java de Mr JoëlYk intéressants et utiles, pourquoi ne pas les partager avec d'autres personnes qui pourraient également en bénéficier ? Partagez ce lien sur les réseaux sociaux ou envoyez-le à vos amis et collègues. Vous pourriez aider quelqu'un à améliorer ses compétences en programmation ou à trouver des solutions à des problèmes complexes. N'oubliez pas que la connaissance doit être partagée pour grandir. Merci pour votre soutien et votre partage !

Contact WhatsApp : +237 652027193 | Réaliser Par Joël_Yk

  • 2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam