Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 23.08.2015
Сообщений: 67
1

Калькулятор сложных выражений

11.04.2016, 07:56. Показов 2320. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток. Появилась необходимость реализовать калькулятор сложных выражений для приложения.
Суть: есть некое поле ввода, в которое пользователь вписывает некое выражение, например: 2+6*2/(7-1)^2
Каюсь, искал максимум часа полтора, после этого все-аки решился обратиться сюда.
Быть может есть готовые алгоритмы для решения данной задачи, или есть мысли какие подходящие?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2016, 07:56
Ответы с готовыми решениями:

Калькулятор для расчета сложных выражений
в общем вот что у меня есть Добавлено через 3 минуты #include <iostream> #define PI...

Вычисление сложных выражений
S=\sum_{i=1}^{m}{a}_{i}^{2}+7\sum_{i=1}^{n}\sum_{j=1}^{n}{c}_{ij}-(1+\sum_{i=1}^{n}\sum_{j=1}^{n}{c}...

Вычисления сложных выражений
Где ошибка подскажите пожалуйста https://wampi.ru/image/6Zox2GY #include "pch.h" #include...

Срочно!!! Создание сложных выражений
Помогите пожалуйста!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! У меня...

7
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
11.04.2016, 16:50 2
Зависит от языка и требуемого синтаксиса. В языке может быть готовый метод типа eval в javascript.

Если нет, то есть два наиболее популярных способа это сделать.

1. Использовать lexer generators и parser generators.
Пишете формальную грамматику (описание требуемого языка выражений). Запускаете генераторы. Получаете исходный код. Добавляете его к исходному коду проекта.

2. Используете Monadic Parser Combinators
Находите библиотеку с базовыми комбинаторами. Используя их, пишете парсер для требуемого языка выражений.

Добавлено через 16 минут
Например, вот так на C# выглядит парсер выражений в лямбда-выражения, написанный на основе библиотеки Sprache ("Tiny C# Monadic Parser Framework").
(нагуглил за 5 минут)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void Main()
{
    var lambda = ExpressionParser.ParseExpression(@"2+6*2/(7-1)^2");
    Console.WriteLine(lambda.ToString());
    Console.WriteLine(lambda.Compile()());
}
 
// Define other methods and classes here
 
static class ExpressionParser
{
    public static Expression<Func<double>> ParseExpression(string text)
    {
        return Lambda.Parse(text);
    }
 
    static Parser<ExpressionType> Operator(string op, ExpressionType opType)
    {
        return Parse.String(op).Token().Return(opType);
    }
 
    static readonly Parser<ExpressionType> Add = Operator("+", ExpressionType.AddChecked);
    static readonly Parser<ExpressionType> Subtract = Operator("-", ExpressionType.SubtractChecked);
    static readonly Parser<ExpressionType> Multiply = Operator("*", ExpressionType.MultiplyChecked);
    static readonly Parser<ExpressionType> Divide = Operator("/", ExpressionType.Divide);
    static readonly Parser<ExpressionType> Modulo = Operator("%", ExpressionType.Modulo);
    static readonly Parser<ExpressionType> Power = Operator("^", ExpressionType.Power);
 
    static readonly Parser<Expression> Function =
        from name in Parse.Letter.AtLeastOnce().Text()
        from lparen in Parse.Char('(')
        from expr in Parse.Ref(() => Expr).DelimitedBy(Parse.Char(',').Token())
        from rparen in Parse.Char(')')
        select CallFunction(name, expr.ToArray());
 
    static Expression CallFunction(string name, Expression[] parameters)
    {
        var methodInfo = typeof(Math).GetMethod(name, parameters.Select(e => e.Type).ToArray());
        if (methodInfo == null)
            throw new ParseException(string.Format("Function '{0}({1})' does not exist.", name,
                                                   string.Join(",", parameters.Select(e => e.Type.Name))));
 
        return Expression.Call(methodInfo, parameters);
    }
 
    static readonly Parser<Expression> Constant =
         Parse.Decimal
         .Select(x => Expression.Constant(double.Parse(x)))
         .Named("number");
 
    static readonly Parser<Expression> Factor =
        (from lparen in Parse.Char('(')
         from expr in Parse.Ref(() => Expr)
         from rparen in Parse.Char(')')
         select expr).Named("expression")
         .XOr(Constant)
         .XOr(Function);
 
    static readonly Parser<Expression> Operand =
        ((from sign in Parse.Char('-')
          from factor in Factor
          select Expression.Negate(factor)
         ).XOr(Factor)).Token();
 
    static readonly Parser<Expression> InnerTerm = Parse.ChainOperator(Power, Operand, Expression.MakeBinary);
 
    static readonly Parser<Expression> Term = Parse.ChainOperator(Multiply.Or(Divide).Or(Modulo), InnerTerm, Expression.MakeBinary);
 
    static readonly Parser<Expression> Expr = Parse.ChainOperator(Add.Or(Subtract), Term, Expression.MakeBinary);
 
    static readonly Parser<Expression<Func<double>>> Lambda =
        Expr.End().Select(body => Expression.Lambda<Func<double>>(body));
}
Выводит:
Код
() => (2 + ((6 * 2) / ((7 - 1) ^ 2)))
2,33333333333333
Можно легко подправить, чтобы не строил лямбду, а сразу вычислял.
1
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
22.04.2016, 22:41 3
тут Программа для решения ребуса
в самом конце
в программе основной кусок - это вычисление выражения
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
23.04.2016, 22:51 4
Представление выражения в двоичном дереве
1
1 / 1 / 1
Регистрация: 23.08.2015
Сообщений: 67
11.05.2016, 10:10  [ТС] 5
Спасибо всем. Решил задачу алгоритмом обратной польской нотации.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
12.05.2016, 14:15 6
К этой задаче можно подойти так
1. Вы заключает все выражение в круглые скобки.
2. Далее программа ищет первую Закрывающуюся скобку.
3. А перед ней ищет первую Открывающуюся скобку.
4. Между этими скобками других скобок нет.
5. Программа ищет самую высшую операцию по приоритету
Приоритет:
1) унарный минус и унарный плюс
2) возведение в степень
3) умножение и деление
4) сложение и вычитание
6. Выполняется найденная операция
7. Все повторяется до тех пор, пока есть операции в найденных скобках
8. Итак в скобках остается только число - результат операций
9. Выбрасываем уже не нужную пару скобок
10. Имеем арифметическое выражение, где на пару скобок меньше
11. Используем рекурсию. То есть вновь вызываем данную функцию
12. Рекурсия завершается, когда скобок больше не останется
13. Последнее число и есть окончательный результат
0
1 / 1 / 1
Регистрация: 23.08.2015
Сообщений: 67
16.05.2016, 06:23  [ТС] 7
geh, я так понимаю это рекурсивный спуск?
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
16.05.2016, 08:25 8
MoteX
Да. Вы совершенно правы. Именно рекурсивный
спуск я использовал при написании программ,
вычисляющих арифметическое выражение.
0
16.05.2016, 08:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2016, 08:25
Помогаю со студенческими работами здесь

Объясните устройство сложных вложенных выражений-генераторов
Здравствуйте. Может кто объяснить, как работают сложные выражения-генераторы, вроде...

Функция, расчитывающая значение сложных тригонометрических выражений
В textBox пользователь вводит выражение, напрмер, &quot;cos5 + 2*sin7 + (tg2)/2&quot;. Необходимо найти...

Написать программу для решения сложных выражений.
Написать программу для решения выражений. http://s004.***********/i205/1002/6e/2bd2fa636b69.jpg ...

Калькулятор сложных %
На практике впервые столкнулся с данным языком, может есть знающие люди) Надо посчитать величину...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru