1. C# / Говнокод #25527

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    static class MathParser
    {
        static double getFunc(char op, double a, double b)
        {
            switch (op)
            {
                case '+': return a + b;   case '-': return a - b;
                case '*': return a * b;   case '/': return a / b;   case '%': return a % b;
                case '^': return Pow(a, b);   default: return double.NaN;
            }       
        }
        static char[][] ops = { new char[] { '+', '-' }, new char[] { '*', '/', '%' }, new char[] { '^' } };
        public static double Eval(string str) => Eval(ref str, 0, str.Length);
        private static double Eval(ref string str, int z, int l, int i = 0)
        {
            for (; i < 3; i++)
                for (int v = l - 1; v >= z; v--)
                    for (int j = ops[i].Length - 1; j >= 0; j--)
                        if (str[v] == ops[i][j])
                            return getFunc(str[v], 
                                Eval(ref str, z, v, i),
                                Eval(ref str, v + 1, l, i + 1));
            return double.Parse(str.Substring(z, l - z));
        }
    }

    Какой-то укуренный калькулятор получился...
    MathParser.Eval("3,1346") => 3.1346
    MathParser.Eval("3+2*5") => 13
    MathParser.Eval("2^5-1") => 31
    MathParser.Eval("1/2^3") => 0.125
    MathParser.Eval("2^2^2^2") => 256
    MathParser.Eval("7,2%3") => 1.2

    Запостил: groser, 09 Апреля 2019

    Комментарии (182) RSS

    Добавить комментарий