Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Калькулятор на Java

Slime Lime Ученик (95), на голосовании 1 месяц назад
Я изучаю java, хотел написать калькулятор для андроида, написал дизайн и т.д. И когда пришол к вычислению примера, у меня возникли вопросы, а как вобще все вычислется? Думал както через ArrayList и for сделаю, но нихера, помогите как сделать вычисление примера? Например : 2*2/9+5-8
Голосование за лучший ответ
odins Искусственный Интеллект (394257) 2 месяца назад
калькуляторы реализуются несколькими способами
1 это когда программа сама считает1+1+1 и тд
2 способ на котором основаны почти все калькуляторы это через память когда все возможные в нем решения уже посчитаны и набирая пример - открывается соответствующая ячейка памяти
odinsИскусственный Интеллект (394257) 2 месяца назад
вспомни таблицу пифагора, что печатали на обложках тетрадок в клетку это пример реализации калькулятора, а в логарифмах есть таблицы брадиса в которых даны все результаты мх вычислений
Сан Санов Искусственный Интеллект (107227) 2 месяца назад
Сделай метод, который парсит строку и делает первое вычисление * или / пока оно есть и давать на выход строку. Он будет работать, пока все операторы * / не выполнятся. Потом такая же хрень с + -.
Типа 2*2/9+5-8 в 4/9+5-8 и т.д.
Red Мастер (1002) 2 месяца назад
 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())
Neon modeГуру (3064) 2 месяца назад
Ладно...
Андрей Панарин Искусственный Интеллект (229644) 2 месяца назад
В универе нас учили превращать традиционное математическое выражение в польскую постфиксную запись, а потом работать с этой записью при помощи стека.

Например, 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.

А вот как на основе выражения построить польскую запись - это отдельная история :)
Похожие вопросы