Программа «Простейший калькулятор»
Написать программу, которая выполняет над двумя вещественными числами одну из четырех арифметических операций (сложение, вычитание, умножение или деление). Программа должна завершаться только по желанию пользователя.
Решение задачи на языке программирования Python
Чтобы программа самопроизвольно не завершалась, в ней надо запустить бесконечный цикл. Выход из него будем осуществлять с помощью оператора break , если пользователь вводит определенный символ вместо знака арифметической операции.
Если пользователь ввел знак, который не является ни знаком арифметической операции, ни символом-«прерывателем» работы программы, то вывести сообщение о некорректном вводе.
Если был введен один из четырех знаков операции, запросить ввод двух чисел.
В зависимости от знака операции выполнить соответствующее арифметическое действие.
Если было выбрано деление, необходимо проверить не является ли нулем второе число. Если это так, то сообщить о невозможности деления.
print("0 в качестве знака операции" "\nзавершит работу программы\n") while True: s = input("Знак (+, -, *, /): ") if s == '0': break if s in ('+', '-', '*', '/'): a = float(input("a = ")) b = float(input("b = ")) if s == '+': print("%.2f" % (a + b)) elif s == '-': print("%.2f" % (a - b)) elif s == '*': print("%.2f" % (a * b)) elif s == '/': if b != 0: print("%.2f" % (a / b)) else: print("Деление на ноль!") else: print("Неверный знак операции!")
Пример выполнения программы:
0 в качестве знака операции завершит работу программы Знак (+, -, *, /): / a = -9.34 b = 3.215 -2.91 Знак (+, -, *, /): & Неверный знак операции! Знак (+, -, *, /): - a = 4005 b = 1358 2647.00 Знак (+, -, *, /): 0
Вариант решение задачи с помощью оператора match (появился в Python 3.10):
print("0 в качестве знака - выход из программы\n") while True: s = input("Знак (+, -, *, /): ") if s in ('+', '-', '*', '/'): a = float(input("a = ")) b = float(input("b = ")) match s: case '+': print("%.2f" % (a + b)) case '-': print("%.2f" % (a - b)) case '*': print("%.2f" % (a * b)) case '/': if b != 0: print("%.2f" % (a / b)) else: print("Деление на ноль!") case '0': break case _: print("Неверный знак операции!")
X Скрыть Наверх
Решение задач на Python
Делаем свой кредитный калькулятор на Python
Сегодня поставим Python на практические рельсы — сделаем простой кредитный калькулятор. В приложении будут поля для годовой процентной ставки, срока и суммы кредита, чтобы рассчитывать ежемесячные платежи и общую сумму. В будущем его можно допилить — добавить возможность досрочного погашения, пересчёт процентов и всё остальное.
Если вы ни разу не программировали на Python, почитайте сначала это:
Устанавливаем и подключаем библиотеку
Чтобы создать графический интерфейс нашего кредитного калькулятора, используем библиотеку tkinter. Для этого установим её в систему командой в терминале:
pip install tkinter
Если pip не работает, используйте pip3
pip3 install tkinter

После этого импортируем библиотеку и подключаем её:
from tkinter import *
Мы уже использовали библиотеку tkinter в других проектах, почитайте, если интересно:
Пишем игру на Python
Без донатов!
Делаем своё приложение для ведения бюджета
Базовая версия
Делаем свой загрузчик видео с Ютуба
Независимый и автономный
Рисуем интерфейс
Нашему кредитному калькулятору нужны поля для ввода данных и кнопка, по нажатию которой он будет производить расчёты. Для этого мы нарисуем:
- поле для ввода годовой процентной ставки;
- поле для ввода количества лет в сроке кредита;
- поле для ввода суммы кредита;
- кнопку «Рассчитать».
Получится несложный интерфейс и самый простой калькулятор, но для старта этого достаточно. Разместим эти элементы на форме.
# создаём класс для калькулятора class LoanCalculator: # инициализируем класс def __init__(self): # стартуем tkinter, чтобы создать окно графического интерфейса root=Tk() # задаём размеры окна root.geometry("500x300") # задаём название окна калькулятора root.title("Кредитный калькулятор") # задаём цвет окна калькулятора, например пыльно-серый root.config(bg='#a39ea0') # задаём расположение, стиль шрифта и пояснительный текст для поля годовой процентной ставки Label(root,text="Годовая ставка, %", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=10) # задаём расположение, стиль шрифта и пояснительный текст для поля срока кредита Label(root, text="Срок, лет", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=50) # задаём расположение, стиль шрифта и пояснительный текст для поля суммы кредита Label(root, text="Сумма кредита", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=90) # задаём расположение, стиль шрифта и пояснительный текст для вывода ежемесячного платежа Label(root, text="Ежемесячный платёж:", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=150) # задаём расположение, стиль шрифта и пояснительный текст для вывода общей суммы выплаты Label(root, text="Общая сумма выплаты:", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=190) # добавляем поле для ввода годовой процентной ставки self.annualinterestVar=StringVar() Entry(root, textvariable=self.annualinterestVar,font=('Arial,15,bold')).place(x=220,y=10) # добавляем поле для ввода количества лет кредит self.numberofyearsVar=StringVar() Entry(root, textvariable=self.numberofyearsVar,font=('Arial,15,bold')).place(x=220,y=50) # добавляем поле для ввода суммы кредита self.loanamountVar=StringVar() Entry(root, textvariable=self.loanamountVar,font=('Arial,15,bold')).place(x=220,y=90) # добавляем строку вывода расчёта ежемесячного платежа self.monthlypaymentVar=StringVar() Label(root, textvariable=self.monthlypaymentVar,font=('Arial,15,bold'),bg='#a39ea0').place(x=220,y=150) # добавляем строку вывода расчёта общей суммы выплаты self.totalpaymentVar=StringVar() Label(root, textvariable=self.totalpaymentVar,font=('Arial,15,bold'),bg='#a39ea0').place(x=220,y=190) # добавляем кнопку, задаём её расположение, надпись и стиль шрифта Button(root, text="Рассчитать",font=('Arial,15,bold'),command=self.calculateloan).place(x=180,y=240) # запускаем окно root.mainloop()
Теперь для запуска проекта нам нужно использовать только что созданный класс, чтобы он сработал и форма появилась на экране. Для этого добавляем команду:
# вызываем класс калькулятора, чтобы запустить программу
LoanCalculator()
Запускаем скрипт и видим готовую форму. Она пока ничего не умеет, но туда уже можно что-то писать:

Программируем расчёты
Чтобы наш калькулятор работал, нужно указать в коде, что программа должна делать с нашими данными.
Определим функцию для расчёта общей суммы выплаты и переменной ежемесячного платежа. Тут мы будем использовать введённые значения годовой процентной ставки, срока и суммы кредита.
общая сумма выплаты = ежемесячный платёж × 12 × срок
В коде мы используем две команды — float и int. Они работают так: float возвращает значения в десятичном формате, а int — целочисленные. Ещё мы используем форматирование вывода: format(10.2f) , так мы получим 10 символов: семь цифр перед запятой, восьмой символ — десятичная и две цифры после неё.
# определяем функцию расчёта общей суммы выплаты def calculateloan(self): # определяем формулу, по которой будет рассчитываться ежемесячный платёж по кредиту monthlypayment=self.getmonthlypayment (float(self.loanamountVar.get()),float(self.annualinterestVar.get()) / 1200, int(self.numberofyearsVar.get())) self.monthlypaymentVar.set(format(monthlypayment, '10.2f')) # определяем формулу, по которой будет рассчитываться общая сумма выплаты по кредиту totalpayment=float(self.monthlypaymentVar.get()) * 12 * int(self.numberofyearsVar.get()) self.totalpaymentVar.set(format(totalpayment, '10.2f'))
Для расчёта ежемесячного платежа используем формулу:
ежемесячный платёж = [сумма кредита × ежемесячная процентная ставка / (1 − 1 / 1 + ежемесячная процентная ставка) ^ количество лет × 12].
# определяем функцию расчёта ежемесячного платежа def getmonthlyPayment(self,loanamount,monthlyinterestrate,numberofyears): # определяем формулу, по которой будет рассчитываться ежемесячный платёж monthlypayment=loanamount * monthlyinterestrate / (1-1 / (1 + monthlyinterestrate) ** (numberofyears * 12)) return monthlypayment
Запускаем калькулятор
Проверим программу в деле: введём конкретные значения во все поля и посмотрим, какой у нас получится ежемесячный платёж и сколько денег нам в итоге придётся заплатить.
Вот что будет на старте до нажатия кнопки «Рассчитать»:

Теперь нажимаем и смотрим на результат:

Что дальше
Этот калькулятор можно доработать, например добавить такие штуки:
- кнопку очистки полей;
- подсчёт переплаты сверх суммы кредита;
- расчёт по месяцам, а не по годам;
- расчёт платежей и остатка при досрочном погашении части кредита.
А самое главное — проверку на правильность введённых данных. Например, чтобы программа сообщала, если мы вместо цифр введём что-то другое, и подсвечивала поля с ошибочными данными.
Попробуйте сделать это сами, мы в вас верим!
Готовый код
# импортируем библиотеку tkinter from tkinter import * # создаём класс для калькулятора class LoanCalculator: # инициализируем класс def __init__(self): # стартуем tkinter, чтобы создать окно графического интерфейса root=Tk() # задаём размеры окна root.geometry("500x300") # задаём название окна калькулятора root.title("Кредитный калькулятор") # задаём цвет окна калькулятора, например пыльно-серый root.config(bg='#a39ea0') # задаём расположение, стиль шрифта и пояснительный текст для поля годовой процентной ставки Label(root,text="Годовая ставка, %", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=10) # задаём расположение, стиль шрифта и пояснительный текст для поля срока кредита Label(root, text="Срок, лет", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=50) # задаём расположение, стиль шрифта и пояснительный текст для поля суммы кредита Label(root, text="Сумма кредита", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=90) # задаём расположение, стиль шрифта и пояснительный текст для вывода ежемесячного платежа Label(root, text="Ежемесячный платёж:", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=150) # задаём расположение, стиль шрифта и пояснительный текст для вывода общей суммы выплаты Label(root, text="Общая сумма выплаты:", font=('Arial,15,bold'),bg='#a39ea0').place(x=10,y=190) # добавляем поле для ввода годовой процентной ставки self.annualinterestVar=StringVar() Entry(root, textvariable=self.annualinterestVar,font=('Arial,15,bold')).place(x=220,y=10) # добавляем поле для ввода количества лет кредит self.numberofyearsVar=StringVar() Entry(root, textvariable=self.numberofyearsVar,font=('Arial,15,bold')).place(x=220,y=50) # добавляем поле для ввода суммы кредита self.loanamountVar=StringVar() Entry(root, textvariable=self.loanamountVar,font=('Arial,15,bold')).place(x=220,y=90) # добавляем строку вывода расчёта ежемесячного платежа self.monthlypaymentVar=StringVar() Label(root, textvariable=self.monthlypaymentVar,font=('Arial,15,bold'),bg='#a39ea0').place(x=220,y=150) # добавляем строку вывода расчёта общей суммы выплаты self.totalpaymentVar=StringVar() Label(root, textvariable=self.totalpaymentVar,font=('Arial,15,bold'),bg='#a39ea0').place(x=220,y=190) # добавляем кнопку, задаём её расположение, надпись и стиль шрифта Button(root, text="Рассчитать",font=('Arial,15,bold'),command=self.calculateloan).place(x=180,y=240) # запускаем окно root.mainloop() # определяем функцию расчёта общей суммы выплаты def calculateloan(self): # определяем формулу, по которой будет рассчитываться ежемесячный платёж по кредиту monthlypayment=self.getmonthlypayment (float(self.loanamountVar.get()),float(self.annualinterestVar.get()) / 1200, int(self.numberofyearsVar.get())) self.monthlypaymentVar.set(format(monthlypayment, '10.2f')) # определяем формулу, по которой будет рассчитываться общая сумма выплаты по кредиту totalpayment=float(self.monthlypaymentVar.get()) * 12 * int(self.numberofyearsVar.get()) self.totalpaymentVar.set(format(totalpayment, '10.2f')) # определяем функцию расчёта ежемесячного платежа def getmonthlyPayment(self,loanamount,monthlyinterestrate,numberofyears): # определяем формулу, по которой будет рассчитываться ежемесячный платёж monthlypayment=loanamount * monthlyinterestrate / (1-1 / (1 + monthlyinterestrate) ** (numberofyears * 12)) return monthlypayment # вызываем класс калькулятора, чтобы запустить программу LoanCalculator()
Калькулятор на python
Здравствуйте, в предыдущей статье я показывал как сделать игру на python, а сейчас мы посмотри как сделать простой калькулятор на python tkinter.

Создаём окно 485 на 550. Размеры не важны, мне понравились такие. Так же указываем, что окно не будет изменяться.
from tkinter import * class Main(Frame): def __init__(self, root): super(Main, self).__init__(root) self.build() def build(self): pass def logicalc(self, operation): pass def update(): pass if __name__ == '__main__': root = Tk() root["bg"] = "#000" root.geometry("485x550+200+200") root.title("Калькулятор") root.resizable(False, False) app = Main(root) app.pack() root.mainloop()
Отлично, идём дальше.
Делаем кнопочки
В методе build создаём такой список:
btns = [ "C", "DEL", "*", "=", "1", "2", "3", "/", "4", "5", "6", "+", "7", "8", "9", "-", "+/-", "0", "%", "X^2" ]
Он отвечает за все кнопки, отображающиеся у нас в окне.
Мы создали список, теперь проходимся циклом и отображаем эти кнопки. Для этого в том же методе пишем следующее:
x = 10 y = 140 for bt in btns: com = lambda x=bt: self.logicalc(x) Button(text=bt, bg="#FFF", font=("Times New Roman", 15), command=com).place(x=x, y=y, width=115, height=79) x += 117 if x > 400: x = 10 y += 81
Замечательно, у нас есть кнопочки. Добавляем надпись с выводом результата. Я хочу что бы текст был слева, следовательно, аттрибутов выравнивания текста писать не нужно.
self.formula = "0" self.lbl = Label(text=self.formula, font=("Times New Roman", 21, "bold"), bg="#000", foreground="#FFF") self.lbl.place(x=11, y=50)
Пишем логику
def logicalc(self, operation): if operation == "C": self.formula = "" elif operation == "DEL": self.formula = self.formula[0:-1] elif operation == "X^2": self.formula = str((eval(self.formula))**2) elif operation == "=": self.formula = str(eval(self.formula)) else: if self.formula == "0": self.formula = "" self.formula += operation self.update() def update(self): if self.formula == "": self.formula = "0" self.lbl.configure(text=self.formula)
Так, как у нас нет ввода с клавиатуры, мы можем позволить себе сделать так, просто проверить на спец. кнопки (C, DEL, =) и в остальных случаях просто добавить это к формуле.
У этого калькулятора множество недочетов, но мы и не стремились сделать его идеальным.
Прошу прощения за ошибки в статье. Пишите, я исправлюсь.
Полный код моей версии калькулятора:
from tkinter import * class Main(Frame): def __init__(self, root): super(Main, self).__init__(root) self.build() def build(self): self.formula = "0" self.lbl = Label(text=self.formula, font=("Times New Roman", 21, "bold"), bg="#000", foreground="#FFF") self.lbl.place(x=11, y=50) btns = [ "C", "DEL", "*", "=", "1", "2", "3", "/", "4", "5", "6", "+", "7", "8", "9", "-", "(", "0", ")", "X^2" ] x = 10 y = 140 for bt in btns: com = lambda x=bt: self.logicalc(x) Button(text=bt, bg="#FFF", font=("Times New Roman", 15), command=com).place(x=x, y=y, width=115, height=79) x += 117 if x > 400: x = 10 y += 81 def logicalc(self, operation): if operation == "C": self.formula = "" elif operation == "DEL": self.formula = self.formula[0:-1] elif operation == "X^2": self.formula = str((eval(self.formula))**2) elif operation == "=": self.formula = str(eval(self.formula)) else: if self.formula == "0": self.formula = "" self.formula += operation self.update() def update(self): if self.formula == "": self.formula = "0" self.lbl.configure(text=self.formula) if __name__ == '__main__': root = Tk() root["bg"] = "#000" root.geometry("485x550+200+200") root.title("Калькулятор") root.resizable(False, False) app = Main(root) app.pack() root.mainloop()
Калькулятор
Многие программисты стараются изучать языки программирования с помощью написания достаточно простых программ. Один из вариантов – написание калькулятора. Конечно, можно посчитать в отладчике 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 калькулятора можно сдель, допустим, календарь. Для этого надо будет запрашивать текущую дату у операционной системы. Открывать нужный месяц, рассчитывать какие числа выпадут на понедельники, какой год високосный. Сделать возможность менять год и месяцы.