Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.51.3] |
|
Сообщ.
#1
,
|
|
|
Может тема должна называться чуть не так , но извенитею
и так подскажите пожалуйста как мне реализовать вычесление формулы , то есть например пользователь вводит ряд типа 2+5*(2+7) без никаких переменных и тд ... Я понимаю что вопрос довольно грамосткия для ответа , поэтому ,если можно, дайте ссылку на статью |
Сообщ.
#2
,
|
|
|
Цитата osa @ Причем тут ряд?пользователь вводит ряд типа 2+5*(2+7) Поищи про алгоритм Рутисхаузера например (IMHO самый простой для реализации). |
Сообщ.
#3
,
|
|
|
Выделение лексем, далее построение дерева, а затем - подсчет.
|
Сообщ.
#4
,
|
|
|
Это отлично организовывается с помощью бинарного дерева, если числа могут двух и более разрядными, и можно обойтись стеком, если числа могут быть только одноразрядными. Алгоритм хорошо описан в первом томе Д.Кнута.
|
Сообщ.
#5
,
|
|
|
Или рекурсивно можно.
|
Сообщ.
#6
,
|
|
|
Рекурсивно проще и быстрее программу написать. Что-то типа:
double eval(char *str) { return expr(&str); } // Пропуск пробелов skipblanks(char **str) { while (**str == ' ') ++*str; } // Вычисление суммы double expr(char **str) { double value = prod(str); while (**str == '+' || **str == '-') { if (**str == '+' ) { ++*str; value += prod(str); } else if (**str == '-') { ++*str; value -= prod(str); } } return value; } // Вычисление произведения double expr(char **str) { double value = prim(str); while (**str == '*' || **str == '/') { if (**str == '*' ) { ++*str; value *= prim(str); } else if (**str == '/') { ++*str; value /= prim(str); } } } // Вычисление констант и выражений в скобках double prim(char **str) { if (isdigit(**str)) { double value = *(*str)++ - '0'; while (isdigit(**str)) value = value * 10 + *(*str)++ - '0'; return value; } if (**str == '(') { ++*str; double value = expr(str); if (**str == ')') ++*str else error(); return value; } error(); } |
Сообщ.
#7
,
|
|
|
На сайте sources.ru есть готовый пример с применением рекурсии. Очень понятный.
|