Калькулятор
Многие программисты стараются изучать языки программирования с помощью написания достаточно простых программ. Один из вариантов – написание калькулятора. Конечно, можно посчитать в отладчике Python или запустив консоль. Но гораздо лучше написать на python свой калькулятор с графическим интерфейсом.
Считаем в консоле
Чтобы посчитать математические выражения можно запустить консоль. Запустить python. После этого набираем математические выражения и получаем ответ. Для этого даже не надо уметь программировать.

Делаем простой калькулятор
Лучше всего закреплять свои знания по программированию с помощью написания простых программ. Таких приложений можно придумать много – календарь, программа для хранения заметок, получение прогноза погоды.

Можно написать программу, которая делает скриншоты и сохраняет полученные изображения в папку. В любом случае, надо выбрать какое-нибудь не сложное задание, чтобы не закопаться в нем. Потом его можно будет расширить и сделать по-настоящему полезное приложение.
В нашем случае мы разберем, как создать простой графический калькулятор на Python 3. Для реализации графического интерфейса воспользуемся стандартным пакетом Tkinter. Он входит в состав Python 3. Соответственно, если у вас установлен Python, то дополнительно не надо ничего устанавливать.
В первых строках файла calculator.py подключаем библиотечные функции:
- Tkinter для графического интерфейса;
- Decimal для вычислений с большей точность, так как точности float не достаточно.
Импорт библиотек и исходные данные
Создаем окно приложения — объект Tk с заголовком Calculator. Во вложенном кортеже buttons будут храниться обозначения для кнопок. В список stack будем добавлять введенные числа и операции, которые надо совершить. activeStr предназначен для хранения набираемого числа.
from tkinter import * from decimal import * root = Tk() root.title('Calculator') buttons = (('7', '8', '9', '/', '4'), ('4', '5', '6', '*', '4'), ('1', '2', '3', '-', '4'), ('0', '.', '=', '+', '4') ) activeStr = '' stack = []
Вычисление результата
Функция calculate получает из списка stack операнды и операцию которую над ними надо произвести. Результат отображается в надписи label. Получать из списка строки будем с помощью метода pop.
def calculate(): global stack global label result = 0 operand2 = Decimal(stack.pop()) operation = stack.pop() operand1 = Decimal(stack.pop()) if operation == '+': result = operand1 + operand2 if operation == '-': result = operand1 - operand2 if operation == '/': result = operand1 / operand2 if operation == '*': result = operand1 * operand2 label.configure(text=str(result))
Обработка нажатия
В функции click выполняется обработка нажатой клавиши. В качестве ее аргумента передается текст, отображаемый на кнопке, которую нажали. Хотелось бы хранить вводимое значение прямо в надписи, а не создавать для этого отдельную переменную. Но так не получается из-за алгоритма работы. После того как посчитан результат, он записывается в надписи. При попытке после этого начать вводить новое число, оно бы дописывало прежний результат.
В списке с операторами и командами для калькулятора не обязательно их будет 3. Но при обработке с помощью метода pop, будут рассматриваться 3 последних введенных значения. А после проведения расчета список очистится. Далее в него добавляется полученный результат, на случай если пользователь нажмет на калькуляторе клавишу операции сразу, а не будет вводить новое число.
def click(text): global activeStr global stack if text == 'CE': stack.clear() activeStr = '' label.configure(text='0') elif '0' = 2: stack.append(label['text']) calculate() stack.clear() stack.append(label['text']) activeStr = '' if text != '=': stack.append(text) else: if text != '=': stack.append(label['text']) stack.append(text) activeStr = '' label.configure(text='0')
Внешний вид
Теперь займемся оформлением внешнего вида калькулятора и зададим обработку нажатия кнопок. Создаем надпись для вывода набираемых значений и результатов. В цикле создаем кнопки. Расположение кнопок и надписи осуществляется в табличном виде с помощью упаковщика grid. И в завершении запускаем цикл обработки событий mainloop.
label = Label(root, text='0', width=35) label.grid(row=0, column=0, columnspan=4, sticky="nsew") button = Button(root, text='CE', command=lambda text='CE': click(text)) button.grid(row=1, column=3, sticky="nsew") for row in range(4): for col in range(4): button = Button(root, text=buttons[row][col], command=lambda row=row, col=col: click(buttons[row][col])) button.grid(row=row + 2, column=col, sticky="nsew") root.grid_rowconfigure(6, weight=1) root.grid_columnconfigure(4, weight=1) root.mainloop()
У надписи выставлена ширина 35, для того, чтобы оформление кнопок подстраивалось под надпись. И в результате кнопки при этом значении лучше выглядят.
Для того, чтобы кнопки правильно работали, пришлось для каждой из кнопок создать свою функцию с помощью lambda.
По аналогии приведенного кода python калькулятора можно сдель, допустим, календарь. Для этого надо будет запрашивать текущую дату у операционной системы. Открывать нужный месяц, рассчитывать какие числа выпадут на понедельники, какой год високосный. Сделать возможность менять год и месяцы.
Калькулятор, блокнот и программирование

Не секрет что каждый из нас хоть раз открывал com или exe файлы блокнотом, видел письмена подобные этим:
В целях приподнятия завесы тайны странного наречия и написана эта статья.
Сразу стоит отметить, что символы, приведенные выше, по большей части, не несут смысловой нагрузки в своем начертании. Они являются визуальной формой числового представления. В свою очередь, числовое представление является операционным кодом машинного языка, и хранителем сакрального смысла этих тайных знаков.
Практика
Перейдем к более детальному изучению. Для этого нам понадобится книга написанная в недрах корпорации intel (intel 80386 Programmer’s Reference Manual). Где детально рассказывается о формате инструкций процессора.
Обычно первой программой на любом языке программирования является вывод сообщения «Hello World!». Чтож… Не будем отступать от классики и приступим.
На первом этапе, нам придется опустится как можно ближе к опкодам и написать программу на языке Ассемблера
Язык ассемблера, или просто ассемблер — низкоуровневый язык программирования, использующий мнемоники, инструкции и операнды для представления машинного кода
Википедия
org 100h mov ah,9h mov dx,message int 21h int 20h message db 'Hello World$'
Теперь, имея на руках готовую программу, можно перейти к этапу трансляции.
Трансляция
org 100h
Это просто смещение и код для него не генерируется. Будем использовать 100h для будущего расчета адресов.
mov ah,9h — заносим в регистр ah число 9h.
Переведем в машинные коды. Открываем второй том интеловской книги на странице с инструкцией mov. И видим…
| Opcode | Instruction | Clocks | Description |
| 88 /r | MOV r/m8,r8 | 2/2 | Move byte register to r/m byte |
| 89 /r | MOV r/m16,r16 | 2/2 | Move word register to r/m word |
| 89 /r | MOV r/m32,r32 | 2/2 | Move dword register to r/m dword |
| 8A /r | MOV r8,r/m8 | 2/4 | Move r/m byte to byte register |
| 8B /r | MOV r16,r/m16 | 2/4 | Move r/m word to word register |
| 8B /r | MOV r32,r/m32 | 2/4 | Move r/m dword to dword register |
| 8C /r | MOV r/m16,Sreg | 2/2 | Move segment register to r/m word |
| 8D /r | MOV Sreg,r/m16 | 2/5,pm=18/19 | Move r/m word to segment register |
| A0 | MOV AL,moffs8 | 4 | Move byte at (seg:offset) to AL |
| A1 | MOV AX,moffs16 | 4 | Move word at (seg:offset) to AX |
| A1 | MOV EAX,moffs32 | 4 | Move dword at (seg:offset) to EAX |
| A2 | MOV moffs8,AL | 2 | Move AL to (seg:offset) |
| A3 | MOV moffs16,AX | 2 | Move AX to (seg:offset) |
| A3 | MOV moffs32,EAX | 2 | Move EAX to (seg:offset) |
| B0 + rb | MOV reg8,imm8 | 2 | Move immediate byte to register |
| B8 + rw | MOV reg16,imm16 | 2 | Move immediate word to register |
| B8 + rd | MOV reg32,imm32 | 2 | Move immediate dword to register |
| C6 | MOV r/m8,imm8 | 2/2 | Move immediate byte to r/m byte |
| C7 | MOV r/m16,imm16 | 2/2 | Move immediate word to r/m word |
| C7 | MOV r/m32,imm32 | 2/2 | Move immediate dword to r/m dword |
Как же выбрать из всего этого множества необходимую команду? Регистр ah является байтным регистром. Плюс нам необходимо занести в регистр число 9. Поэтому выбираем опкод для MOV reg8, imm8, это B0+rb, где rb номер регистра, который можно взять из следующей таблицы.
| rb | rb | rd | |
| 0 | AL | AX | EAX |
| 1 | CL | CX | ECX |
| 2 | DL | DX | EDX |
| 3 | BL | BX | EBX |
| 4 | AH | SP | ESP |
| 5 | CH | BP | EBP |
| 6 | DH | SI | ESI |
| 7 | BH | DI | EDI |
Номер регистра ah равен 4. Отсюда B0+4=B4. Число, которое будет занесено в регистр, пишется следом за опкодом инструкции. Таким образом, mov ah, 9h превращается в B4, 9 (запятая поставлена лишь для визуального отделения чисел).
Следующая инструкция mov dx, message . В регистр dx заносим адрес строки message. Пока рассчитать его мы не можем, поэтому поставим временную заглушку. Пользуясь двумя приведенными выше таблицами, получаем опкод для mov dx — BA,100, где 100 является временной мерой.
Теперь транслируем int 21h и int 20h , из приведенной ниже таблицы можно получить нужные опкоды — это CD,21 и CD,20.
| Opcode | Instruction | Clocks | Description |
| CD ib | INT imm8 | 37 | Interrupt numbered by immediatebyte |
| CD ib | INT imm8 | pm=59 | Interrupt—Protected Mode, same privilege |
| CD ib | INT imm8 | pm=99 | Interrupt—Protected Mode, moreprivilege |
| CD ib | INT imm8 | pm=119 | Interrupt—from V86 mode to PL 0 |
| CD ib | INT imm8 | ts | Interrupt—Protected Mode, via task |
Запишем полученную программу: B4, 09, BA, 100, CD, 21, CD, 20 .
Вернемся к нашей заглушке потому, как нам все еще необходимо рассчитать адрес нашей строки для вывода. Теперь это сделать достаточно просто. Посчитаем все пары цифр по порядку. Их девять (число 100h не входит в один байт. Поэтому требуется два). Таким образом, адрес строки будет равен 100h+9h=109h. Заменяем 100h на 109h. Число 109h, по понятным причинам, не может быть помещено в один байт, поэтому понадобиться двухбайтовое значение 09,01 таким образом, получаем следующую программу: B4, 09, BA, 09, 01, CD, 21, CD, 20.
Кодинг

Для простоты кодирования приведем числа к десятичной системе счисления (для оправдания заголовка, на калькуляторе)
180, 9, 186, 9, 1, 205, 33, 205, 32 .
Вооружаемся блокнотом и вставляем нужные ASCII символы.
Не забываем ввести в конце Hello World!$ .
Все что осталось это сохранить наш файл с расширением com и запустить.
- Блокнот
- Assembler
- операционные коды
Как подружить Блокнот с Калькулятором Windows, чтобы облегчить расчёты?
Как подружить Блокнот с Калькулятором Windows, чтобы облегчить расчёты?

Меня периодически просят помочь сделать те или иные расчёты, необходимые для постройки самоделок, описанных на сайте. Попытался найти нормальный мануал по калькулятору Windows, чтобы можно было его добавить к соответствующим статьям, но как всегда ничего не нашёл. То ли его вообще не существует, то ли я не умею искать.
Самые интересные ролики на Youtube
Единственным вменяемым учебником, который удалось отыскать, был самоучитель «Работа с калькулятором» В. В. Пупышева. Правда, в этом хелпе автор описал только «Стандартный» (Standard) калькулятор и не затронул «Инженерный» (Science). А между тем, именно в Инженерном калькуляторе имеется возможность вводить данные в текстовом виде.
О чём речь?
Дело в том, что при вводе в калькулятор длинных дробных чисел, очень легко допустить ошибку, которую, к тому же, ещё и сложно обнаружить, так как в окошке ввода можно увидеть только последнее введённое число, не говоря уже о произведённых операциях.
Есть масса мудрёных калькуляторов, которые позволяют видеть одновременно все вводимые числа и действия, произведённые над ними. Но, иногда кажется, что проще написать новую программу-калькулятор, чем изучить одну из существующих.
В то же время, в ОС Windows уже имеется простой, интуитивно понятный калькулятор, единственным недостатком которого является отсутствие внятного туториала.
В общем, чтобы устранить этот пробел, решил показать на примерах, как можно выполнять простые расчёты на Windows-овском Инженерном калькуляторе, путём прямого ввода текста из текстового редактора.
На картинке показано, как переключить калькулятор из режима «Стандартный» в режим «Инженерный».
Пример 1.
Предположим, нам нужно сделать следующее вычисление для расчёта мощности силового трансформатора:
P = 1,5 * 6,25² / 1,69 =
Набираем в Блокноте:
Количество и расположение пробелов роли не играет. Но, знак «=» необходим.
Копируем эту строчку в буфер обмена Windows (Ctrl+C) и вставляем в окно Инженерного калькулятора (Ctrl+V).
Получаем ответ: ≈34,671
Ответ можно скопировать обратно в Блокнот.

Откуда взялся знак «@»?
Если кликнуть по любой клавише калькулятора правой кнопкой мыши, то можно узнать какая клавиша быстрого доступа соответствует тои или иной кнопке калькулятора.
В данном случае, кнопке калькулятора «x^2» (квадрат числа) соответствует клавиатурная клавиша «@».
Пример 2.
1007*50 / 50*422,8 –50 –1007 =
Калькулятор «знает», что деление и умножение нужно производить перед сложением и вычитанием, поэтому, если знак «/», это дробная черта, а не знак деления, то нужно добавить скобки, чтобы калькулятор это понял.
Копируем эту строчку из Блокнота в окно Инженерного калькулятора Windows:
1007*50 / (50*422,8 –50 –1007) =
Получаем ответ: ≈2,507
Пример 3.
Вычисление корня произвольной степени:
9 √1953125 =
Набираем в Блокноте:
1953125 y9r =
Где, «y», это кнопка «x^y», а «r», это кнопка «1/x». То есть, возводим в дробную степень.
Или набираем в Блокноте:
1953125 iy9 =
Где «i». это чекбокс «Inv», , а «y», это кнопка «x^y». То есть, вместо возведения в степень производим извлечение корня
Копируем строчку из Блокнота в окно ввода Калькулятора.
В обоих случаях получаем ответ: =5
Порядок записи подобных выражений в текстовом редакторе соответствует порядку набора с использованием кнопок калькулятора. Только вместо названий кнопок, в текстовый редактор нужно вводить соответствующие им названия горячих клавиш.
8 Апрель, 2012 (11:53) в Мой компьютер
Жить становится всё труднее, цены растут, доходы падают. Иногда кажется, что впереди нас ждут одни разочарования. Попробуйте оглядеться вокруг, может быть не всё ещё потеряно… Если объявление не в теме, не обессудьте! Честно пытался выбрать самые интересные.

Нашли ошибку в тексте? Выделите ошибочный текст мышкой и нажмите Ctrl + Enter
Спасибо за помощь!
Комментарии (45)
Страниц: « 1 2 3 4 [5] Показать все
admin Декабрь 6th, 2016 at 01:41
Павел, в последних версиях Windows калькулятор совсем испортился. Я перешёл на портативный Калькулятор-блокнот [46.92 Кб]. Понимает переменные и умеет решать уравнения. При этом весь хелп поместился в десяток фраз. То есть, разобраться со всеми функциями можно за одну минуту. Качайте отсюда>>>
Успехов в вычислениях!
zoog Март 26th, 2018 at 15:56
портативный Калькулятор-блокнот
Не понимает ,123 (только 0,123)
не понимает *enter, приходится вводить ^2
фри-софт, он такой.
admin Март 26th, 2018 at 16:47
Zong, кроме необходимости вводить 0, я других недостатков не вижу. Главное что он понимает переменные, что обычно на первом месте в любых вычислениях.
zoog Март 26th, 2018 at 17:04
Не могу спорить, у всех разные потребности, но вот я попробовал перейти с calc и в 1м же вычислении 2 раза споткнулся. То есть идея классная, но есть и досадные мелочи. Даже в вин-калькуляторе есть горячие клавиши для квадрата и куба, а тут — увы. Для быстрых вычислений встроенный зачастую удобнее.
admin Март 26th, 2018 at 17:20
Zong, Калькулятору блокноту не нужны клавиши. Там в настройках их можно отключить и тогда окно ввода растягивается как вам удобно. Все формулы можно набирать в любом текстовом редакторе с помощью клавиатуры ПК, а потом просто копировать в окно калькулятора. Там ещё есть очень удобная функция, калькулятор показывает в какой строке и в каком по счёту месту совершена ошибка ввода.
А для быстрых вычислений, согласен, удобнее самый калькулятор Windows. К тому же он быстрее загружается.
Страниц: « 1 2 3 4 [5] Показать все
Оставить комментарий
Вы должны войти для отправки комментария.
Как сделать калькулятор в блокноте
Программа Калькулятор позволяет производить вычисления, используя те же приемы, что и при работе с обычным настольным калькулятором.

Рис. 2 «Калькулятор»
Возможности калькулятора можно увеличить, переключившись в меню Вид с режима Стандартный на режим Инженерный (рисунок 3). В этом режиме используется расширенный набор вычислительных операций, вычисления могут производиться в различных системах счисления, имеется возможность обработки статистики.
Рис. 3 «Калькулятор»

Программа «Блокнот»
Блокнот — это простейший текстовый редактор , который можно использовать в качестве удобного средства просмотра текстовых файлов (формат .ТХТ и некоторые другие).
Для создания текстовых документов его применяют редко (только для небольших записок), но данную программу удобно использовать для отработки навыков работы с клавиатурой. Программа запускается командой Пуск —> Программы —> Стандартные —> Блокнот. На примере программы Блокнот мы познакомимся с некоторыми приемами создания, редактирования и сохранения документов, типичными для большинства приложений Windows.

Рис. 4 «Блокнот»
Ввод текста с помощью клавиатуры.
Текст вводят с помощью алфавитно-цифровых клавиш. Для ввода прописных букв используют клавишу SHIFT. Если нужно ввести длинный ряд (поток) прописных символов, клавиатуру можно переключить с помощью клавиши CAPS LOCK.
Когда текст достигает правой границы окна, он может автоматически перетекать на новую строку, но может продолжаться далее, пока не будет нажата клавиша ENTER. Чтобы включить (или отключить) режим автоматического перетекания текста, используют команду Правка > Перенос по словам.
Понятие курсора. Место документа, в которое происходит ввод текста (точка ввода), отмечается на экране вертикальной чертой, которую называют курсором. Не надо путать курсор с указателем мыши — это два разных понятия. Указатель мыши — это активный элемент управления, а курсор — это только маркер, не выходящий за пределы документа.
Переключение между русскими и латинскими символами. При наборе текста иногда приходится переключаться между русскими и латинскими символами. Это делается общесистемным способом, то есть метод переключения между символьными наборами не зависит от конкретной программы, а выполняется во всех программах одинаково. Это функция операционной системы.
Для того чтобы узнать, какой комбинацией клавиш на данном компьютере выполняется переключение раскладок клавиатуры, надо посмотреть, как настроены свойства (Пуск —> Настройка —> Панель управления —> Клавиатура, вкладка Язык).
Выбор шрифта. Размер и форма символов языка определяются использованным шрифтом. Редактор Блокнот слишком прост для того, чтобы позволить использование разных шрифтов в документе, но выбрать один шрифт, используемый для отображения документа, он позволяет. Это выполняется командой Правка —> Шрифт, после которой открывается системное диалоговое окно Выбор шрифта.
В списке Начертание можно задать начертание для избранного шрифта. Обычно используют четыре основных типа начертания: прямое светлое (обычное), наклонное (курсив), полужирное и полужирный курсив.
В списке Размер выбирают размер шрифта. Размеры шрифтов измеряются в пунктах. Пункт — это типографская единица измерения, равная 1/72 дюйма (0,353 мм). Для того чтобы документ хорошо читался на экране, обычно используют шрифт размером 12 пунктов.
Сохранение созданного документа. Созданный документ сохраняют на жестком или гибком магнитном диске в виде нового файла. При сохранении следует указать имя файла. Если этого не сделать, он сохранится под именем Безымянный.txt. Для сохранения нового документа служит команда Файл —> Сохранить как. По этой команде открывается диалоговое окно Сохранение.
В этом окне выбирают папку, в которую будет сохраняться файл, и дают ему имя. Приемы сохранения файлов одинаковы для всех приложений Windows. В качестве папки, в которую редактор Блокнот сохраняет документы по умолчанию, служит папка Мои документы. Большинство приложений Windows предлагают по умолчанию использовать для сохранения документов именно эту папку. В ней можно создать несколько папок для раздельного хранения документов, относящихся к разным темам (проектам) или пользователям.
Если предложенная папка Мои документы соответствует желанию автора, то остается только ввести имя файла в поле Имя файла и щелкнуть на кнопке Сохранить.
Чтобы ранее сохраненный документ сохранить в другой папке, либо под другим именем необходимо пользоваться командой Сохранить как.