Сборка функций в одну программу calculator
Для оптимизации кода и его легкой поддержки создадим три основные функции:
operation() для запроса операции от пользователя;
calc() для выполнения математических операций;
run() — главная функция, вызывающая остальные и управляющая ходом программы.
Функции operation() и calc():
def operation(): mes = input('Выберите операцию (Введите +, -, * или /): ') if mes == '+': print('Вы выбрали сумму') elif mes == '-': print('Вы выбрали разность') elif mes == '*': print('Вы выбрали умножение') elif mes == '/': print('Вы выбрали деление') return mes def calc(first, second, oper): result = None if oper == '+': result = summa(first, second) elif oper == '-': result = sub(first, second) elif oper == '*': result = mult(first, second) elif oper == '/': result = div(first, second) else: print('Некорректная операция!') return result
В функции operation() пользователь выбирает операцию, которая затем возвращается. В calc() мы используем словарь для упрощения выбора операции и выполнения соответствующей математической функции.
def run(): first = int(input('Введите первое число: ')) second = int(input('Введите второе число: ')) oper = operation() result = calc(first, second, oper) print(f'Результат: {result}')
Эта функция интегрирует все предыдущие:
вызывает operation() для выбора операции;
вызывает calc() для вычисления результата, который затем выводится.
Чтобы запустить программу, нужно вызвать функцию run().
Введите первое число: 7
Введите второе число: 10
Выберите операцию (Введите +, -, * или /): +
Вы выбрали сумму
Результат: 17
Введите первое число: 7
Введите второе число: 10
Выберите операцию (Введите +, -, * или /): *
Вы выбрали умножение
Результат: 70
Введите первое число: 7
Введите второе число: 10
Выберите операцию (Введите +, -, * или /): er
Некорректная операция!
Результат: None
Настройка окружения
Определимся, что нам потребуется:
Хост с установленной Windows. В моем случае Windows 10.
Qt. Я использую как QtCreator, так и порт GCC для Windows MinGW-64. Устанавливал оба с помощью Qt Maintanance Tool. После установки компилятор необходимо добавить в Path.
Собирать будем с помощью
Makefile
. Для этого надо установить утилитуmake
.
Дисклеймер
Все действия, описанные автором в статье, сделаны исключительно в исследовательских и образовательных целях. Windows является зарегистрированным товарным знаком Microsoft.
Обработка ввода данных
Перейдем к работе с пользовательским вводом. Обработка ввода в Python осуществляется функцией input(), которая позволяет написать строку-подсказку для пользователя. Она учитывает введенную информацию до нажатия клавиши Enter.
Рассмотрим на примере имени и фамилии два результата — без ввода строки и с ним.
name = input() #Иван surname = input() #Петров print('Ваше имя и фамилия:') print(name) print(surname)
Иван
Петров
Ваше имя и фамилия:
Иван
Петров
Если в программе много вводимых данных, строковый аргумент в input() помогает пользователю понять, какую именно информацию нужно написать.
На практике пример с вводом выглядит следующим образом:
name = input('Укажите имя: ') #Иван surname = input('Укажите фамилию: ') #Петров print('Ваше имя и фамилия: ') print(name) print(surname)
Укажите имя: Иван
Укажите фамилию: Петров
Ваше имя и фамилия:
Иван
Петров
По умолчанию каждый вызов print() разделяет текст переходом на новую строку. Это можно изменить, используя параметр end с аргументом «пробел»:
name = input('Укажите имя: ') #Иван surname = input('Укажите фамилию: ') #Петров print('Ваше имя и фамилия: ', end = ' ') print(name, end = ' ') print(surname)
В результате имя и фамилия будут отображены в одной строке:
Укажите имя: Иван
Укажите фамилию: Петров
Ваше имя и фамилия: Иван Петров
Вместо множественных вызовов print() можно эффективно управлять выводом текста с помощью методов объединения и форматирования строк.
Управление потоком выполнения
Условные операторы (if-операторы) в Python позволяют управлять потоком выполнения программы.
Основной оператор if работает по простому принципу:
if условие_верно: # Выполняется данный блок кода
Простое сравнение чисел:
num1 = int(input('Введите первое число: ')) num2 = int(input('Введите второе число: ')) if num1 == num2: print('Одинаковые числа')
Введите первое число: 9
Введите второе число: 9
Одинаковые числа
Если написать разные числа, то не будет никакого результата, так как нет инструкций для этого случая:
Введите первое число: 9
Введите второе число: 7
Для выполнения разных блоков кода в зависимости от условия используется конструкция if-else:
if условие_верно: # Выполняется данный блок кода else: # Выполняется данный блок кода
Чтобы перебрать несколько инструкций, можно использовать ветвь if-elif-else:
if условие_1: # Блок кода 1 elif условие_2: # Блок кода 2 # ... else: # Блок кода n
Пример с if-else — сравнение чисел:
num1 = int(input('Введите первое число: ')) num2 = int(input('Введите второе число: ')) if num1 == num2: print('Одинаковые числа') else: print('Числа разные')
Введите первое число: 10
Введите второе число: 20
Числа разные
Пример выбора операции:
oper = input('Выберите операцию (Введите +, -, * или /): ') if oper == '+': print('Вы выбрали сумму') elif oper == '-': print('Вы выбрали разность') elif oper == '*': print('Вы выбрали умножение') elif oper == '/': print('Вы выбрали деление') else: print('Некорректная операция!')
Выберите операцию (Введите +, -, * или /): *
Вы выбрали умножение
Выберите операцию (Введите +, -, * или /): Y
Некорректная операция!
Таким образом, можно управлять потоком выполнения программы, предлагая пользователю выбор операций и обрабатывая их соответствующим образом.
Расширение функционала калькулятора
Чтобы улучшить калькулятор, можно добавить в него больше функций.
Например:
возведение в степень;
вычисление логарифма (потребуется импортировать библиотеку math).
Обновим функцию calc() следующим образом:
import math def calc(first, second, oper): result = None if oper == '+': result = first + second elif oper == '-': result = first - second elif oper == '*': result = first * second elif oper == '/': result = first / second elif oper == '%': result = (first / second) * 100 elif oper == '**': result = first ** second elif oper == 'log': result = math.log(first, second) else: print('Неизвестная операция!') return result
Теперь обновим функцию operation():
def operation(): mes = input('''Выберите операцию (Введите +, -, *, /, %, **, log): + - Сложение - - Вычитание * - Умножение / - Деление % - Процент первого числа от второго ** - Возведение в степень log - Логарифм первого числа по основанию второго\n''') if mes == '+': print('Вы выбрали сложение') elif mes == '-': print('Вы выбрали вычитание') elif mes == '*': print('Вы выбрали умножение') elif mes == '/': print('Вы выбрали деление') elif mes == '%': print('Вы выбрали нахождение процента первого числа от второго') elif mes == '**': print('Вы выбрали возведение в степень') elif mes == 'log': print('Вы выбрали логарифм') else: print('Неизвестная операция!') return mes
Теперь в калькуляторе доступен более широкий набор операций, и пользователь четко понимает, что делает каждая из них, благодаря информативному вводу.
Для иллюстрации рассмотрим пример вычисления 30% от 100.
Введите первое число: 30
Введите второе число: 100
Выберите операцию (Введите +, -, *, /, %, **, log):
+ – сложение двух чисел
– – вычитание двух чисел
* – произведение двух чисел
/ – деление двух чисел
% – процент первого числа от второго
** – возведение первого числа в степень второго
log – логарифм первого числа по основанию второго
%
Вы выбрали процент
Результ: 30
Функциональная архитектура калькулятора
Вместо того чтобы писать все арифметические операции в одном большом коде, мы разобьем их на отдельные функции. Это сделает код более модульным, удобным для тестирования и последующего расширения.
Сначала определим функции для базовых арифметических операций калькулятора:
Каждая функция примет два аргумента: first и second.
def summa(first, second): return first + second
def sub(first, second): return first - second
def mult(first, second): return first * second
def div(first, second): return first / second
После определения функций проверим их работу:
num1 = int(input('Введите первое число: ')) num2 = int(input('Введите второе число: ')) print(f'Сумма двух чисел: {summa(num1, num2)}, разность: {sub(num1, num2)}, ' f'умножение: {mult(num1, num2)}, частное: {div(num1, num2)}')
Введите первое число: 10
Введите второе число: 5
Сумма двух чисел: 15, разность: 5, умножение: 50, частное: 2.0
Таким образом, каждая функция выполняет свою задачу, и можно их комбинировать для решения более сложных задач.
Функции калькулятора
Созданный калькулятор будет иметь все базовые арифметические функции:
Также в калькуляторе будут предусмотрены расширенные функции:
расчет процента от числа;
возведение числа в степень;
Например, программа сможет выполнять такие вычисления:
20 + 30 = 50;
40 – 8 = 32;
9 * 5 = 45;
25 / 5 = 5.
Определив функции программы, можно приступать к написанию кода.
Отображение результата в коде
Для отображения текста и результатов мы будем использовать функцию print().
В качестве примера можно написать в консоли произвольный текст:
print ('Создаем калькулятор на Python!')
Создаем калькулятор на Python!
print 795
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Обработка исключений и улучшение кода
Чтобы сделать калькулятор более надежным и удобным, нужно доработать четыре задачи:
ошибку «деление на ноль»;
ввод нечисловых данных;
некорректный ввод символа операции;
работа программы calculator после завершения (по желанию пользователя).
Чтобы решить проблему с делением на ноль, нужно модифицировать функцию calc() следующим образом:
if (second == 0): print('Деление на ноль запрещено!') return
Теперь, если пользователь попытается разделить на ноль, программа выдаст предупреждение и прекратит выполнение операции.
Для обработки ошибок ввода и некорректных символов операции будем использовать циклы и исключения.
Работа с ошибками
При вводе данных, которые не могут быть преобразованы в целое число, программа выдаст ошибку. Например, если вместо числа вставить буквы.
first = int(input('Укажите первое число: ')) #abc
Укажите первое число: abc
ValueError: invalid literal for int() with base 10: ‘abc’
Это связано с тем, что функция int() не может преобразовать произвольный текст в число. Чтобы избежать таких ситуаций, целесообразно организовать механизм повторного ввода, пока пользователь не внесет корректные данные. Детально разберем этот аспект ниже, при обсуждении циклов.
Конвертация строк в числа
При использовании функции input() вводимые данные по умолчанию считываются как строки. Это может привести к неожиданным результатам при выполнении арифметических операций.
first = input('Укажите первое число: ') #70 second = input('Укажите второе число: ') #300 summ = first + second print(f'Сумма чисел: {summ}')
Укажите первое число: 70
Укажите второе число: 300
70300
Здесь произошла конкатенация (объединение) строк, а не сложение чисел. Чтобы калькулятор корректно выполнял сложение, строки нужно преобразовать в числа с помощью функции int().
first = int(input('Укажите первое число: ')) #70 second = int(input('Укажите второе число: ')) #300 summ = first + second print(f'Сумма чисел: {summ}')
Укажите первое число: 70
Укажите второе число: 300
Сумма чисел: 370
Работа с переменными
Аналогично предыдущему примеру, рассмотрим сценарий с сохранением результата в переменную.
Это позволит проводить вычисления:
result = 7 * 6 print(result)