0

次のブラックボックスを使用して、evalとtoStringの2つのメソッドで算術式を表現することをサポートするクラスをJavaで作成する必要があります。

Expression e = 
new Multiplication( 
    new Addition( 
        new Double(2.5), 
        new Double(3.5)), 
    new UnaryMinus( 
        new Integer(5))); 
System.out.println(e.eval());   // should print out -30.0 
System.out.println(e.toString());   // should print out ((2.5 + 3.5) * (-(5))) 

どうすればそのようなクラスを設計できますか?どのツールですか?どのデザインパターン?

4

5 に答える 5

2

toString各オペレーターを適切に実装する必要がありevalます。次に、独自の部分を適用する前に、必要に応じて各呼び出しtoStringまたは各コンポーネントを実行します。eval

だからAddition.eval()実行しますreturn left.eval() + right.eval();

同様に、Addition.toString()実行しますreturn "(" + left.toString() + " + " + right.toString() + ")";

これを実現するには、Robが提案した複合パターンのインターフェイスを使用して、これらのメソッドをオーバーライドする適切なクラスを作成します。

于 2013-01-25T01:02:57.150 に答える
2

どうすればそのようなクラスを設計できますか?

与えられたブラックボックスのサンプルコードにはたくさんの手がかりがあります。

  • メソッドを持つと呼ばれるinterface(または場合によっては)が必要です。このメソッドは、ある種の数値型を返す必要があります。これは良い選択ですが、他のオプションもあります。abstract classExpressionevalevalDouble

  • Multiplication、、Additionなどのいくつかの式クラス(Expressionを実装または拡張する)が必要ですUnaryMinusevalこれらは、メソッドの実装を提供する必要があります。また、式を出力するためにデフォルトのメソッドをオーバーライドする必要があります。toString()

  • 式クラスには、例で示されているパラメーター型を持つコンストラクターも必要です。

両方を処理する方法を理解するために必要な少し考え抜かれたものがあります

new Multiplication( 
    new Addition( 
        new Double(2.5), 
        new Double(3.5)), 
    new UnaryMinus( 
        new Integer(5))); 

new Multiplication( 
    new Double(2.5), 
    new Double(3.5)); 

...しかし、それはあなたが解決するためのものです。そして、自分でそれを解決することによって学びます。(または、厳密に言えば、あなたが私たちに示した例を実装することは必須ではないので、気にしないでください。)

どのツールですか?

必要ありません...JavaJDKのインストールを除いて(明らかに)。お気に入りの/推奨されるJavaIDE、または単純なテキストエディタとJDKコマンドラインツールを使用します。

どのデザインパターン?

必要ありません。ほんの少しの「一般的または庭の多様性」の多型。通常のOOクラスとインターフェース。

于 2013-01-25T01:40:59.617 に答える
2

お役に立てれば

setp 1:

public abstract class Expression
{
    public abstract decimal Evaluate();
    public abstract string toString();
}

ステップ2:

public abstract class ValueNode:Expression
{
    public int intvalue;
    public decimal decvalue;
    public abstract decimal TEvaluate();
    public abstract string TtoString();

    public override decimal Evaluate()
    {
        return TEvaluate();
    }

    public override string toString()
    {
        return TtoString();
    }
}

ステップ2.1:

public abstract class OperationNode:Expression
{
   public Expression left;
   public Expression right;
   public override decimal Evaluate()
    {
        return this.EEvaluate();
    }
    public override string toString()
    {
        return this.EtoString();
    }
    public abstract decimal EEvaluate();
    public abstract string EtoString();

}

ステップ3:

public class UnaryMinus:OperationNode
{
    public UnaryMinus(Expression Left)
     {
        this.left = Left;

    }
    public override decimal EEvaluate()
    {
        return -(this.left.Evaluate());
    }

    public override string EtoString()
    {
        return string.Format("(-({0}))",left.toString()); ;
    }

}

ステップ4:

public class DecimalClass:ValueNode
{
    public DecimalClass(decimal decimalValue)
    {
        this.decvalue = decimalValue;
    }

    public override decimal TEvaluate()
    {
        return this.decvalue;
    }

    public override string TtoString()
    {
        return this.decvalue.ToString();
    }
}

ステップ5:

public class Integer : ValueNode
{
    public Integer(int decimalValue)

    {
        this.intvalue = decimalValue;
    }

 public override decimal TEvaluate()

    {
        return this.intvalue;
    }

    public override string TtoString()

    {
        return this.intvalue.ToString();
    }
}

ステップ6:

public  class Addition:OperationNode
 {

   public Addition(Expression Left, Expression Right)

    {
        this.left = Left;
        this.right = Right;
    }
    public override decimal EEvaluate()
    {
        return left.Evaluate()+ right.Evaluate();
    }
    public override string EtoString()
    {
        return string.Format("({0}+{1})",left.toString(),right.toString()); ;
    }
}

ステップ7:

public class Multiplication : OperationNode

{
    public Multiplication(Expression Left, Expression Right)
    {
        this.left = Left;
        this.right = Right;
    }
    public override decimal EEvaluate()
    {
        return left.Evaluate()* right.Evaluate();
    }

    public override string EtoString()
    {
        return string.Format("({0}*{1})",left.toString(),right.toString()); ;
    }
}

ステップ8:

public class Substraction:OperationNode
{
   public Substraction(Expression Left, Expression Right)
    {
        this.left = Left;
        this.right = Right;
    }
    public override decimal EEvaluate()
    {
        return left.Evaluate()- right.Evaluate();
    }

    public override string EtoString()
    {
        return string.Format("({0}-{1})",left.toString(),right.toString()); ;
    }
}

ステップ9:

public  class Division: OperationNode
{
   public Division(Expression Left, Expression Right)
    {
        this.left = Left;
        this.right = Right;
    }
    public override decimal EEvaluate()
    {
        return left.Evaluate()/ right.Evaluate();
    }

    public override string EtoString()
    {
        return string.Format("({0}/{1})",left.toString(),right.toString()); ;
    }
}

ステップ10:

class Program
{
    static void Main(string[] args)
    {

        callComposit();
        Console.ReadKey();
    }

    private static void callComposit()
    {
        //Expression ((2.5+3.5)*(-(5)))
        Multiplication multiplication = new Multiplication(new Addition(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5)));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication.toString(), multiplication.Evaluate()));



        //Expression (5/6)
        Division division = new Division(new Integer(5), new Integer(6));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", division.toString(), division.Evaluate()));
        //Expression ((2.5-3.5)*(-(5)))
        Multiplication multiplication2 = new Multiplication(new Substraction(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5)));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication2.toString(), multiplication2.Evaluate()));
        //Expression ((2.5/3.5)*(-(5)))
        Multiplication multiplication3 = new Multiplication(new Division(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5)));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication3.toString(), multiplication3.Evaluate()));

        //Expression ((2.5/3.5)*(-(5))* 3.5)
        Multiplication multiplication4 = new Multiplication(new Multiplication(new Division(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5))), new DecimalClass(3.5m));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication4.toString(), multiplication4.Evaluate()));


        //Expression ( 3.5*(2.5/3.5)*(-(5)))
        Multiplication multiplication5 = new Multiplication(new Multiplication(new DecimalClass(3.5m), new Division(new DecimalClass(2.5m), new DecimalClass(3.5m))), new UnaryMinus(new Integer(5)));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication5.toString(), multiplication5.Evaluate()));

        //Expression ( 3.5*(2.5/3.5)+ 3.5 *(-(5)))
        Multiplication multiplication6 = new Multiplication(new Addition(new Multiplication(new DecimalClass(3.5m), new Division(new DecimalClass(2.5m), new DecimalClass(3.5m))), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5)));
        Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication6.toString(), multiplication6.Evaluate()));
    }
}

この方法よりも優れた方法を実行するために何かを行う必要がある場合は、コメントしてください。ハッピーコーディング

于 2014-02-28T15:21:20.520 に答える
1

Expressionクラスが必要で、次にaCompoundExpressionと。が必要TerminalExpressionです。それはどのようなパターンに聞こえますか?コンポジット。次に、必要に応じて、Visitorを使用して解析できます。

算術コマンドであろうと他の解釈されたコマンドのセットであろうと、小さな言語を提供すると、複合コマンドがあります。たとえば、式4 +(5 * 2)は複数のコマンドに解析され、CompoundExpressionに追加されます。 evalを呼び出すと、式ツリーを反復処理して回答を計算します。(デザインパターンはあなたにとって良いものです、ところで、それらを学ぶことはあなたをより良いコーダーにするでしょう。)

于 2013-01-25T00:57:32.640 に答える
1

ブラックボックスの使用法を少し変更することが許可されている場合は、ビルダーパターンが良いアプローチになる可能性があります。それはもっと似ているかもしれません:

ビルダービルダー=新しいMathBuilder(); 式e=builder.add(new Double(2.5))。add(new Double(3.5).multiply(-5);

操作の順序に関する詳細を理解する必要がありますが、一般的にはパターンの良い使い方のようです。すばやく検索すると、多くの例が見つかります。

于 2013-01-25T01:11:09.753 に答える