Регистрация
16 Ноя 2012
Сообщения
102
Репутация
4
Спасибо
0
Монет
0
Я изучаю java, хотел написать калькулятор для андроида, написал дизайн и т.д. И когда пришол к вычислению примера, у меня возникли вопросы, а как вобще все вычислется? Думал както через ArrayList и for сделаю, но нихера, помогите как сделать вычисление примера? Например : 2*2/9+5-8
 
Сделай метод, который парсит строку и делает первое вычисление * или / пока оно есть и давать на выход строку. Он будет работать, пока все операторы * / не выполнятся. Потом такая же хрень с + -.
Типа 2*2/9+5-8 в 4/9+5-8 и т.д.
 
EXPR = ['(','5','-','2',')','/','5']

def get(): return EXPR[0] if EXPR else False

def ch(p, c: str) -> bool: return [True, EXPR.pop(0)][0] if p == c else False

def un() -> float:
if(ch(get(),'(')):
ex = eval()
if(not ch(get(),')')): print("expected ')'\n")
return ex
else:
res = EXPR.pop(0)
return float(res)

def muls() -> float:
ex = un()
while(True):
if(ch(get(),"*")): ex *= un()
elif(ch(get(),"/")): ex /= un()
else: return ex

def eval() -> float:
ex = muls()
while(True):
if(ch(get(), "+")): ex += muls()
elif(ch(get(), "-")): ex -= muls()
else: return ex

if __name__ == "__main__":
print(eval())
 
В универе нас учили превращать традиционное математическое выражение в польскую постфиксную запись, а потом работать с этой записью при помощи стека.

Например, 2*2/9+5-8 в польской записи будет так: 2 2 * 9 / 5 + 8 - Операнды идут в том же порядке, что и в исходном выражении.
А операции - в порядке их выполнения, причем всегда после своих операндов.

Разбор идет слева направо.
Если видим операнд - кладем его в стек.
Если видим операцию - достаем из стека два операнда, применяем к ним операцию, результат кладем в стек.
По окончании разбора в стеке будет одно число - значение выражения.

Для примера разберем польскую запись в вашем случае: 2 2 * 9 / 5 + 8 - 2 - кладем в стек. [ 2 2 - тоже кладем в стек. [ 2 2 * - достаем из стека 2 и 2, считаем 2 * 2 = 4, кладем в стек. [ 4 9 - кладем в стек [ 4 9 / - достаем из стека 9 и 4, считаем 4 / 9 = 0,4444, кладем в стек. [ 0,4444 5 - кладем в стек. [ 0,4444 5 + - достаем из стек 5 и 0,4444, считаем 0,4444 + 5 = 5,4444, кладем в стек. [ 5,4444 8 - кладем в стек. [ 5,4444 8 - - достаем из стека 8 и 5,4444, считаем 5,4444 - 8 = -2,5556, кладем в стек. [ -2,5556 Разбор окончен. Ответ: -2,5556.

А вот как на основе выражения построить польскую запись - это отдельная история :)
 
калькуляторы реализуются несколькими способами
1 это когда программа сама считает1+1+1 и тд
2 способ на котором основаны почти все калькуляторы это через память когда все возможные в нем решения уже посчитаны и набирая пример - открывается соответствующая ячейка памяти
 
Назад
Сверху