0

ユーザー入力から方程式を取得して評価するプログラムを C# で作成しています。現時点では、ユーザー入力を計算し、x などの格納された変数から値を取得する方法があります。が入る方程式は のようなものになります2.0 * 78 * 4X / 3

現時点ではX、それに関連付けられた値に置き換えることができます。ただし、文字列を検索して見つける方法が必要です。その前に数字があるX場合は、その回数をX掛けます。X * X上記の例では、それは 4 回になります。

IndexOfメソッドを使用するか、文字列をサブ文字列に分割するのが最善でしょうか?

私が望むのは、天気Xの前に数字があることを見つけることだけです。Xそうでない場合Xは、 の値を出力するだけX*Xです。

Xこれは、渡されたデータを見つけるためのコードです。理想的には、次のコードを含めたいと思います。

if (name == "x" || name == "X")
{
    args.Result = x; // Returns value of x
}

これはすべての残りのコードです

var e = new Expression(input);

// Set up a custom delegate so NCalc will ask you for a parameter's value
// when it first comes across a variable
e.EvaluateParameter += delegate(string name, ParameterArgs args)
{
    if (name == "x" || name == "X")
    {
        args.Result = x; // Returns value of x
    }
    else if (name == "y" || name == "Y")
    {
        //....
    }
    else if (name == "z" || name == "Z")
    {
        //....
    }

    // Or if the names match up you might be able to something like:
    //  args.Result = dataRow[name];
};

//var result =  
return e.Evaluate();
4

2 に答える 2

0

式ツリーを作成する「本物の」パーサーを作成する必要があると思います。

これを手動で行うこともできます。たとえば、 http: //www.codeproject.com/Articles/88435/Simple-Guide-to-Mathematical-Expression-Parsingを参照してください。

または、単純な文法をフィードする ANTLR などの市販のパーサー ジェネレーターを使用することもできます

いずれにせよ、変数値については、おそらくそれらをDictionary<string, double>

public double GetVariableValue(string varName)
{
    double val;
    if (!variables.TryGetValue(varName, out val))
       throw new InvalidOperationException("Undefined variable "+varName);
    return val;
}
于 2013-03-24T18:51:36.117 に答える
0

これは RegEx で行うことができます。簡単な例:

class MainClass
{
    private static int X = 3, Z = 5, Y = 10;

    public static void Main (string[] args)
    {
        string eqn = "2.5Y * 78Z * 4X / 3 + H * 3N";

        string regex = "(?<var>[a-z])|(?<int>(\\d+(\\.\\d+))|(\\d+))(?<var>[a-z])";

        Regex r = new Regex (regex, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);
        MatchCollection m = r.Matches (eqn);
        if (m.Count > 0) 
        {
            foreach (Match ma in m) {
                MatchVar (ma);
            }
        }
    }

    private static void MatchVar (Match m)
    {
        string stringValue = string.IsNullOrEmpty (m.Groups ["int"].ToString ()) ? "1" : m.Groups ["int"].ToString ();
        double value = double.Parse (stringValue);
        string var = m.Groups ["var"].ToString ();
        switch (m.Groups ["var"].ToString ()) 
        {
            case "X":
                Console.WriteLine ("Result for {0}: {1}", var, value * X);
                break;
            case "Z":
                Console.WriteLine ("Result for {0}: {1}", var, value * Z);
                break;
            case "Y":
                Console.WriteLine ("Result for {0}: {1}", var, value * Y);
                break;
            default: 
                Console.WriteLine ("No value defined for {0}", var);    
                break;
        }
    }
}
于 2013-03-24T20:08:22.853 に答える