Собираем и запускаем калькулятор из windows xp в среде windows 10 c помощью gcc x 64

Сборка функций в одну программу calculator

Для оптимизации кода и его легкой поддержки создадим три основные функции:

  • operation() для запроса операции от пользователя;

  • calc() для выполнения математических операций;

  • run() — главная функция, вызывающая остальные и управляющая ходом программы.

Функции operation() и calc():

def operation(): mes = input('Выберите операцию (Введите +, -, * или /): ') if mes == '+': print('Вы выбрали сумму') elif mes == '-': print('Вы выбрали разность') elif mes == '*': print('Вы выбрали умножение') elif mes == '/': print('Вы выбрали деление') return mesdef 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

Настройка окружения

Определимся, что нам потребуется:

  1. Хост с установленной Windows. В моем случае Windows 10.

  2. Qt. Я использую как QtCreator, так и порт GCC для Windows MinGW-64. Устанавливал оба с помощью Qt Maintanance Tool. После установки компилятор необходимо добавить в Path.

  3. Собирать будем с помощью 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: # Блок кода 1elif условие_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 mathdef 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

Теперь в калькуляторе доступен более широкий набор операций, и пользователь четко понимает, что делает каждая из них, благодаря информативному вводу.

:/>  Сценарий powershell для очистки всех очередей rabbit mq для всех vhosts

Для иллюстрации рассмотрим пример вычисления 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.

Определив функции программы, можно приступать к написанию кода.

:/>  Как навсегда отключить обновления в Windows 10

Отображение результата в коде

Для отображения текста и результатов мы будем использовать функцию 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('Укажите первое число: ') #70second = input('Укажите второе число: ') #300summ = first + secondprint(f'Сумма чисел: {summ}')

Укажите первое число: 70
Укажите второе число: 300
70300

Здесь произошла конкатенация (объединение) строк, а не сложение чисел. Чтобы калькулятор корректно выполнял сложение, строки нужно преобразовать в числа с помощью функции int().

first = int(input('Укажите первое число: ')) #70second = int(input('Укажите второе число: ')) #300summ = first + secondprint(f'Сумма чисел: {summ}')

Укажите первое число: 70
Укажите второе число: 300
Сумма чисел: 370

Работа с переменными

Аналогично предыдущему примеру, рассмотрим сценарий с сохранением результата в переменную. 

Это позволит проводить вычисления:

result = 7 * 6print(result)