Считывание выражений из файла - C#

Узнай цену своей работы

Формулировка задачи:

То есть мы имеем некие выражения записанные в файле в виде строк: 5+3(4/5)*3.141 456/4(3.654+3)-3 и далее в подобном роде, как их считать так чтобы выражения считывались и соблюдался приоритет операций, т.е. сначала возведение в степень, потом умножение, деление, сложение и вычитание?

Решение задачи: «Считывание выражений из файла»

textual
Листинг программы
class Parser
{
    string _input;
    int _index;
    
    private char Current => _input[_index];
    
    public Parser(string input)
    {
        _input = input + "$";
    }
    
    public Complex Parse()
    {
        var result = ParseSum(1);
        if (Current != '$')
            throw new Exception();
        return result;
    }
    
    public Complex ParseGroup()
    {
        if (!Match("("))
            throw new Exception();
        var result = ParseSum(1);
        if (!Match(")"))
            throw new Exception();
        return result;
    }
    
    public Complex ParseSum(int sign)
    {
        var first = sign * ParseProduction(1);
        int op = Match("+","-");
        if (op == -1)
            return first;
        return first + ParseSum(op == 0 ? 1 : -1);
    }
    
    private Complex ParseProduction(int power)
    {
        Complex first;
        if (Current == '(')
            first = ParseGroup();
        else if (char.IsDigit(Current) || Current == 'i')
            first = ParseComplex();
        else
            throw new Exception();
        first = Complex.Pow(first, power);
        
        int op = Match("*", "/", "(");
        
        if (op == -1)
            return first;
            
        if (op == 2)
            _index--;
        
        return (op == 0 || op == 2) ? first * ParseProduction(1) : first * ParseProduction(-1);
    }
    
    private Complex ParseComplex()
    {
        var sb = new StringBuilder();
        while (char.IsDigit(Current) || Current == '.')
        {
            sb.Append(Current);
            _index++;
        }
        var component = sb.Length > 0 ? double.Parse(sb.ToString(), System.Globalization.CultureInfo.InvariantCulture) : 1;
        if (Match("i"))
            return new Complex(0, component);
        return new Complex(component, 0);
    }
    
    private int Match(params string[] words)
    {
        for (int i = 0; i < words.Length; i++)
            if (Match(words[i]))
                return i;
        return -1;
    }
    
    private bool Match(string word)
    {
        if (word.Length > _input.Length - _index + 1)
            return false;
        bool matched = _input.Substring(_index, word.Length) == word;
        if (matched)
            _index += word.Length;
        return matched;
    }
}
 
static void Main()
{
    var expression = "456/4(3.654+3)-3";
    expression = expression.Replace(" ", "");
    var parser = new Parser(expression);
    var result = parser.Parse();
    Console.WriteLine(result);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы