Форум сайта python.su
0
Скрипт прикладываю.
Приветствую!Новичок кодить на Питоне(да и вообще кодить). Накидал первым приложением небольшой калькулятор на Python3+QT. Работал с выражениями как со строкой, разделяя по операторам и уже выполняя операции с числами через переменные. Пока не заметил одну неприятную печаль. Отрицательные числа по такому алгоритму совершенно не вычисляются, ибо в выражении могут присутствовать до трех знаков минус. Т.к. с остальным кодом проблем нет, вопрошаю совета, ибо переписывать не хочется, хочется добить.Тем более хочу в дальнейшем додумать и рассчитывать более сложные выражения,например:8*9+5-3.
Отредактировано Hjort (Окт. 12, 2015 10:07:32)
Прикреплённый файлы:
calc.py (12,2 KБ)
Офлайн
186
1) Используй дизайнер!
2) Калькулятор я бы делал через стек.
> Тем более хочу в дальнейшем додумать и рассчитывать более сложные выражения,например:8*9+5-3.
event тебе в помощь.
Офлайн
0
Rodegast
1)Хотел писать через код научиться, чтоб было.С дизайнером познакомился уже 
2)Про стек почитаю, в принципе отделаться можно меньшим злом.
Вот хочется найти лазейку в том алгоритме, который в коде.
Отредактировано Hjort (Окт. 12, 2015 11:24:14)
Офлайн
186
> Хотел писать через код научиться, чтоб было.
Не учись плохому 
> Вот хочется найти лазейку в том алгоритме, который в коде.
Лучше переписать.
Офлайн
0
Rodegast
Так.Пробую стеками.Вышло с расчетами, например -5+2, но всплывает проблема когда -5-2(а еще может быть -5- -2, но тут можно знак - - менять автоматом на +).
Делал так:
queue.append(self.ent.text())
#добавил первое число из EditLine в момент нажатия операции
и тут же добавил знак операции:
queue.append(“+”)
но вот третье число получаю split'ом по оператору и не могу сообразить как его выдернуть по другому
Находит первый минус и все, беда.
Можно было бы сделать так:обновлять EditLine.После нажатия на оператор делать его пустым и потом уже брать оттуда вторую переменную(как в ХР) , но как-то не наглядно.
Отредактировано Hjort (Окт. 12, 2015 14:02:15)
Офлайн
186
>>> minus = lambda s: reduce(lambda x, y: x - y, s) >>> stek = [] >>> stek.append(-2) >>> stek.append(-5) >>> minus(stek) 3 >>> sum(stek) -7
Офлайн
186
Вот тут чел. сделал калькулятор на ###. На его примере можеш посмотреть как со стеком работать http://forum.ubuntu.ru/index.php?topic=205778.0
Офлайн
0
Rodegast
Не, я не о том. 
Со стеками разобрался.
Проблема вот в чем: я записываю в QEditLine выражение, например, -5+6
в стек закидываю первое число -5 таким образом:stek.append(self.ent.text()), после нажатия кнопки +, а также после нажатия кнопки в стек закидываю оператор:stek.append(“+”).
Вот проблема со вторым числом,я бы мог сделать вот так:
y = self.ent.get()
y = y.split('+')
y = y*квадратные скобки*1*квадратные скобки*
Но это работает с любым оператором, кроме ‘-’, т.к. вхождения в строку начинаются уже с первого символа.
Выход пока вижу только один.
Вводит пользователь первое число в QlineEdit, после нажатия оператора записывать в стек первое число и оператор(но тут можно и простыми переменными обойтись), очищать QLineEdit, вводит пользователь второе число,после нажатия ‘=’, записывать в стек второе число и тогда уже производить расчеты, но тогда наглядного выражения не получаю.
В примере калькуляторы, что скинули, есть один момент: он вводит сначала цифры,а потом оператор, у меня же все по порядку и проблема кроется именно в минусе, мне бы как-то игнорировать первый минус вхождения и делать split со второго минуса, вот в чем вопрос! Посчитать .count можно количество вхождений, но всеравно не получается сделать split именно со второго вхождения символа ‘-’
Отредактировано Hjort (Окт. 13, 2015 06:19:04)
Офлайн
253
HjortВам надо прочитать http://static.my-shop.ru/product/pdf/128/1278676.pdf
мне бы как-то игнорировать первый минус вхождения и делать split
Отредактировано doza_and (Окт. 13, 2015 09:42:03)
Офлайн
0
doza_and
С чего же мне начать?Мне показалось разумным, не выдумывать, а сделать свой аналог ПО, повторить пройденное.Тем более я не начал с консольных программок вычисления квадратного корня…
Насчет ресурсов: Parsing выглядит любопытно, спасибо, попробую.
Отредактировано Hjort (Окт. 13, 2015 09:52:11)
Офлайн