0

文字列表現「1プラス1マイナス2プラス2マイナス2マイナス5プラス10」を区切って文字列[]にトークンを集めて、専門用語のコーディングを開始しました。1 プラス 1 マイナス 2 プラス 2 マイナス 2 マイナス 5 プラス 10=5

    public int Calculate(string expression)
    {
        //TODO: implement this
        if (string.IsNullOrEmpty(expression))
            return 0;
        //expression = "100 plus 100 minus 200";

        string[] tokens = expression.Split();

        int i= 0;
        int result=0;

        for (; i < tokens.Length; )
        {

            int a = 0;
            int b = 0;
            if (i < 1)
            {
                a = int.Parse(tokens[i]);
                i++;
            }
            else if (i % 2 != 0 && tokens[i].ToString() == "plus")
            {
                i++;
                b = int.Parse(tokens[i]);
                a = result;
                result = a + b;
                i = i + 2;


            }

            if (tokens[i].ToString() == "plus")
            {
                i++;
                b = int.Parse(tokens[i]);
                result += a + b;
                i = i + 2;

            }
            else if(i>1)
            {
                a = result;

                b = int.Parse(tokens[i]);
                result = a - b;
                i=i+1;

            }

            else
            {
                i++;
                //a = result;
                b = int.Parse(tokens[i]);
                result += a - b;
                i++;

            }



        }


            return result;

    }

いくつかの基本的な計算操作を計算しましたが、上記の文字列操作に固執しました。計算を実行して、トークン化された文字列から整数値を返す必要があります。より良い解決策を教えてください。

4

3 に答える 3

4

この文字列に対して操作を実行したいと思いますが、演算子は、マイナス-またはプラスのような文字列の形式になっています+

基本的にあなたの文字列

string expression="1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10";

と同等でなければなりません

string myExpression= "1 + 1 - 2 + 2 - 2 - 5 + 10"

あなたの結果は、これの数学計算になるはずです。5

そのためにはDataTable.Computeが便利で、このソリューションを試すことができます

public int Calculate()
{
    string expression = "1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10";
    string mathExpression = expression.Replace("plus", "+").Replace("minus", "-");
    DataTable dt = new DataTable();
    var value = dt.Compute(mathExpression, "");
    return (int)value;
}
于 2013-10-16T17:36:08.163 に答える
0

あなたは多くのことをやっています。

最初の数字は常に出発点であり、最初の結果です。
次に、すべてのトークンを 2 のステップでループする必要があります。
各ループで、最初の項目は演算子で、2 番目の項目は数値です。
最初の項目 [i] に応じて、値 [i+1] を結果に割り当てます。

// This assume perfect parameter
public int Calculate(string expression)
{

 int result = 0;
 string[] tokens = null;

 tokens = expression.Split(" ");
 result = Int32.Parse(tokens[0]);

 for (int i = 1; i <= tokens.Length - 1; i += 2) {
   if (tokens[i] == "plus")
     result += Int32.Parse(tokens[i + 1]);
   else if (tokens[i] == "minus")
     result -= Int32.Parse(tokens[i + 1]);
 }

 return result;

}

于 2013-10-16T17:47:42.367 に答える
0

LinqAggregateメソッドを使用して、これを試すことができます。もちろん、式がうまく形成されていないと、失敗する可能性があります。

    var expression = "1 plus 1 minus 2 plus 2 minus 2 minus 5 plus 10";

    var exp = expression.Split(' ');

    var count = 0;
    var result = exp.Aggregate(Convert.ToInt32(exp[0]), (acc, next) =>
        {
            count++;
            if (next == "plus")
                return acc + Convert.ToInt32(exp[count]);
            if (next == "minus")
                return acc - Convert.ToInt32(exp[count]);
            return acc;
        });
于 2013-10-16T17:43:57.213 に答える