2013-03-24 4 views
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(); 
+0

FYI, '4X' не' X * X' 4 раза; это будет 'X^4'. '4X' -' X + X + X + X'. – joce

ответ

0

Я думаю, что вы должны сделать «реальный» парсер, который создает дерево выражения.

Вы можете сделать это вручную, см., Например, http://www.codeproject.com/Articles/88435/Simple-Guide-to-Mathematical-Expression-Parsing

Или вы можете использовать встроенный генератор синтаксического анализатора, такой как ANTLR, который вы кормите простой грамматикой, см., Например, http://www.codeproject.com/Articles/18880/State-of-the-Art-Expression-Evaluation

В любом случае, для значений переменных вы должны, вероятно, просто держать их в Dictionary<string, double>

public double GetVariableValue(string varName) 
{ 
    double val; 
    if (!variables.TryGetValue(varName, out val)) 
     throw new InvalidOperationException("Undefined variable "+varName); 
    return val; 
} 
0

Вы могли бы сделать это с помощью регулярных выражений. Простой пример:

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; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^