Простой калькулятор на Python | Блог Timeweb Cloud
В последние годы цифровой мир всё больше использует облачные системы. Сервисы вродеtimeweb.cloud доказали своё удобство и надёжность, мгновенно обрабатывая гигантские объёмы информации. Но сегодня мы вспомним основы современных технологий и расскажем вам, как написать программу-калькулятор своими руками.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
В начале работы над калькулятором вспомним, из чего он состоит и как он работает. Мы будем писать аналог простого настольного калькулятора, который есть у каждого школьника. Прочитав эту статью и выполнив все задания, вы получите готовый код на питоне простейшего калькулятора.
У настольного калькулятора есть:
- Кнопки с цифрами
- Кнопки с математическими операциями
- Дисплей
- Микросхемки внутри
В функции настольного калькулятора входит:
- Сложение
- Вычитание
- Деление
- Умножение
- Сброс операции
- Сохранение результата
- Вычисление процента
- Взятие корня числа
Для понимания принципа написания калькулятора возьмем из этого списка минимальный набор функций:
- Ввод чисел
- Вывод результата
- Сложение
- Вычитание
- Деление
- Умножение
Код можно писать прямо в онлайн-редакторе.
Например:
- https://www.online-python.com/
- https://replit.com/languages/python3
Математические операции, которые будем использовать:
2+2Вывод значения
410-5
53*3
912/4
3.0
Чтобы видеть результат, его нужно вывести на экран. Для этого существует функция print(), которая выводит аргументы в скобках в консоль.
print(4 * 4)
16
Эта функция будет аналогом дисплея нашего калькулятора.
Сохранение результата в переменнуюЧтобы не производить вычисления внутри функции print(), будем хранить их в переменной.
result = 16 / 8
Далее мы сможем вывести в консоль значение переменной.
print(result)Чтение строк
2.0
С дисплеем разобрались, теперь используем Python 3 для создания ввода с клавиатуры. У нас есть кнопки с цифрами на клавиатуре, чтобы передать их программе, существует функция input(). При вызове она считывает любые символы с клавиатуры до тех пор, пока не будет нажата клавиша Enter. После этого она возвращает результат в виде строки из введённых символов. Давайте посмотрим, как это работает:
text = input() # Hi
Hi
Выведем результат на экран.
print(text)
Hi
Если передать внутрь функции input() текст, то он выводится на экран перед тем, как начнётся считывание строки.
username = input('Enter your name: ') # ИванОбъединение и форматирование строк
print(username)
Enter your name: Иван
Иван
Чтобы вывод данных стал более дружелюбным, мы можем добавить пояснения к ним. Для этого используем объединение (конкатенацию) строк.
print('Hello, ' + username + '!')
Hello, Иван!
Ещё один способ объединения текста с данными — использование форматированных строк. Для этого перед кавычками необходимо поставить символ f, а данные записывать прямо внутри строки в фигурных скобках. Такой функционал появился с версии Python 3.6.0.
print(f'Hello, {username}!')Перевод строк в число
Hello, Иван!
Теперь, когда мы умеем производить математические операции, считывать данные с клавиатуры и красиво выводить результат в консоль, давайте наконец-то напишем первую версию калькулятора! Для простоты пусть он пока будет только складывать числа, но это уже будет готовый пример кода программы на Питон.
# Считываем данныеa = input('Введите первое число: ')
b = input('Введите второе число: ')# Производим вычисления
result = a + b# Выводим результат в консоль
print(f'Сумма чисел {a} и {b} равняется: {result}')Введите первое число: 12
Введите второе число: 55
Сумма чисел 12 и 55 равняется: 1255
Что-то пошло не так. Числа не сложились, а объединились как текст. Дело в том, что input() в Python возвращает ввод строки с клавиатуры, даже если вы вводили только числа. Такое поведение более явное, что соответствует философии Python: «Явное лучше, чем неявное». Для того чтобы исправить возникшую ошибку, используем функцию перевода строки в число: int(). Посмотрим на примере, как работает num int input:
num = int(input())
print(num + 10)
32
42
Отредактируем нашу программу.
# Считываем данныеa = int(input('Введите первое число: '))Обработка некорректных данных
b = int(input('Введите второе число: '))# Производим вычисления
result = a + b# Выводим результат в консоль
print(f'Сумма чисел {a} и {b} равняется: {result}')Введите первое число: 12
Введите второе число: 55
Сумма чисел 12 и 55 равняется: 67
Но что если пользователь введёт не числа, а буквы или другие символы? При попытке перевести такую строку в число Python выдаст ошибку и остановит выполнение программы.
int(input('Введите первое число: '))
Введите первое число: abc
------------------------------------------------------------------------ValueError Traceback (most recent call last)
C:\Temp\ipykernel_5404\317567321.py in <module>
----> 1 int(input('Введите первое число: '))ValueError: invalid literal for int() with base 10: 'abc'
Такие ошибки можно оперативно определять и менять стандартное поведение при их возникновении, например предлагать пользователю ввести число заново. Но это отдельная тема для разговора, поэтому в контексте этой статьи условимся, что пользователь всегда вводит корректные данные.
Создание функцийИтак, у нас есть практически все компоненты для того, чтобы написать полноценный калькулятор. Давайте расширим функционал текущей версии до выполнения всех математических операций, которые мы запланировали:
- Сложение
- Вычитание
- Деление
- Умножение
Чтобы улучшить читаемость кода, разделим эти операции на отдельные функции.
IndentationError: expected an indented block
Результат работы функции можно также сохранить в переменную для дальнейшего использования.
x = sum(10, 15)
print(x)
25
Аналогичным образом создадим остальные функции вычисления.
# Вычитаниеdef subtract(a, b):Условные операторы
result = a - b
return result# Умножение
def multiply(a, b):
result = a * b
return result# Деление
def divide(a, b):
result = a / b
return result
Функции операций готовы. Осталось написать простой код на питоне, который предоставит пользователю возможность выбора этих операций. Будем использовать уже знакомый нам ввод с клавиатуры и условные операторы. Условные операторы работают очень просто. Их название говорит само за себя.
Если условие истинно, например 2 == 2,
то выполняем один блок кода ,
иначе
выполняем другой блок кода
На месте двоек могут быть переменные, функции, возвращающие значения, строки и даже математические операции. Посмотрим, как это выглядит в коде на примере проверки пароля. Предположим, что верный пароль: qwerty.
# спрашиваем у пользователя пароль
password = input('Введите пароль: ')# Проверяем, соответствует ли он задуманному нами
if password == 'qwerty':
print('Верно!')
else:
print('Неправильный пароль')
Введите пароль: йцукен
Неправильный пароль# спрашиваем у пользователя пароль
password = input('Введите пароль: ')# Проверяем, соответствует ли он задуманному нами
if password == 'qwerty':
print('Верно!')
else:
print('Неправильный пароль')
Введите пароль: qwerty
Верно!
Обратите внимание, что блоки кода также пишутся с отступами, как и в функциях. Двоеточие также обязательно.
Сразу же применим полученные знания к нашему калькулятору. Будем спрашивать у пользователя, какую операцию он хочет совершить, и, в зависимости от ввода, вызывать соответствующую функцию вычисления. Для начала просто выведем текст выбранной операции или сообщение, что такой операции не существует. Следующим шагом заменим текст на вызов операции и объединим его с уже существующей логикой калькулятора.
# Подготовим сообщение для пользователя о доступных математических операциях.Собираем всё в единое целое
# В тройных кавычках можно хранить многострочный текст.
message = '''
Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:+ : Сложение
- : Вычитание
/ : Деление
* : УмножениеВаш выбор:
'''# Запрашиваем у пользователя желаемое действие
operation = input(message)# Выводим сообщение о выбранной операции или что она отсутствует
if operation == '+':
print('Сложение')
elif operation == '-':
print('Вычитание')
elif operation == '/':
print('Деление')
elif operation == '*':
print('Умножение')
else:
print('Неизвестная операция')Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:
+ : Сложение
- : Вычитание
/ : Деление
* : УмножениеВаш выбор:
+Сложение
Поместим всю логику вычислений внутрь функции, чтобы мы могли удобно обращаться к ней в коде скрипта.
def calculate(a, b, operation):
result = Noneif operation == '+':
result = sum(a, b)
elif operation == '-':
result = subtract(a, b)
elif operation == '/':
result = divide(a, b)
elif operation == '*':
result = multiply(a, b)
else:
print('Неизвестная операция')
return result
Также добавим функцию для запроса операции.
def ask_operation():
message = '''
Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:+ : Сложение
- : Вычитание
/ : Деление
* : УмножениеВаш выбор:
'''# Запрашиваем у пользователя желаемое действие
operation = input(message)return operation
Теперь оборачиваем все этапы взаимодействия с калькулятором в условный корпус функции calculate.
def run_calculator():
# Запрашиваем данные
a = int(input('Введите первое число: '))
b = int(input('Введите второе число: '))# Запрашиваем тип операции
operation = ask_operation()# Производим вычисления
result = calculate(a, b, operation)# Выводим результат в консоль
print(f'Результат вычислений: {result}')
Проверяем!
run_calculator()
Введите первое число: 15
Введите второе число: 15Пожалуйста, введите символ операции, которую вы хотите совершить и нажмите Enter:
+ : Сложение
- : Вычитание
/ : Деление
* : УмножениеВаш выбор:
*
Результат вычислений: 225
Работает! Поздравляем, только что вы написали свой калькулятор. или ** : Возведение в степень
Ваш выбор: &
Неизвестная операция
Результат вычислений: None
Ничего страшного не случилось, но и пользы никакой. Такой процесс, когда мы пробуем ввести в программу некорректные данные и наблюдать, как она реагирует, называется тестированием. Это отдельная профессия, но, так или иначе, элементарные тесты должен уметь делать любой программист-профессионал.
ЦиклыДавайте изменим поведение программы и позволим пользователю повторно выбрать требуемую операцию.
Для этого поместим код с запросом операции в цикл while. Принцип его во многом схож с условными операторами. Он проверяет условие на истинность и, если оно истинно, выполняет блок кода. После выполнения цикл повторяется — проверка условия и выполнение тела цикла. Таким образом, чтобы цикл завершился, нам нужно изменить проверяемое условие на ложное. Выход из цикла — это очень важный момент. Если не продумать логику выхода из цикла, он может продолжаться бесконечно, что не всегда желательно. ‘, ‘**’]
# Первый раз запрашиваем у пользователя желаемое действие
operation = input(message)
# Запускаем цикл, если операции нет в списке
while operation not in correct_operations:
print(‘Такая операция недоступна. Повторите попытку.’)
operation = input(message)
return operation
Вычисления не производятся до тех пор, пока не будет введена корректная операция. Тест пройден.
ЗаключениеСегодня легко найти калькулятор на любой вкус: встроенные в различные приложения, сайты с калькуляторами, обычные физические калькуляторы, разнообразные инженерные модификации, включая такие интересные калькуляторы, как python ipcalc, позволяющий выполнять расчёты IP-подсети. Но что может быть лучше, чем вещь, сделанная и модернизированная своими руками?
Создаем калькулятор на Swift 5 / Хабр
В преддверии старта базового курса «iOS-разработчик» публикуем статью, которую написал наш внештатный автор.
Всем привет! Прошло уже больше года с того момента, как появился релиз Swift 5, который принес разработчикам много нового. В этой статье я хочу поговорить о мобильной разработке для IOS, как она устроена, что для этого нужно, и о многом другом. Статья рассчитана на людей, которые только начинают свое программирование на Swift 5.
Требования к операционной системе и железу
Так или иначе, для того, чтобы забилдить приложение для IOS любой версии, вам потребуется компьютер под операционной системой Mac OS (и желательно последней версии, иначе какая-то часть инструментов разработчика и XCode может начать работать совершенно непредсказуемо). Необходимость именно системы под управлением Mac OS служит причиной споров и ненависти со стороны других разработчиков, которые не привыкли быть ограничены в своих возможностях из-за операционной системы. Чаще всего есть несколько путей: покупка или сборка Хакинтоша (однако в случай самостоятельной сборки я хочу вас предупредить, что собрать такой компьютер без постоянной проблемы с драйверами будет непросто).
Альтернативный путь, понятное дело — это покупка компьютера изначально от Apple. Если вы хотели ноутбук, то вы наверное знаете что делать (но я хочу вас сразу предупредить, что Xcode сходу легко занимает около 25 гигабайт, и он может без проблем занять и все 44 гигабайта, если скачиваете дополнительные симуляторы на устройства. Так что устройства с размером 128 гигабайт должны быть только на IOS разработку без всяких дополнительных штук типа node_modules, кеша Pycharm и Unity, homebrew, и прочего стафа для разрабов, который занимает тонну места на диске. Если вы собираетесь заниматься чем-то еще, вам понадобится диск как минимум от 256 гигабайт, или больше).
Варианты среды разработки
Кроме более-менее классического способа разработка приложений на Xcode c использованием Swift и использованием библиотек Cocoa и CocoaTouch, сейчас уже масса других способов разработки почти без использования Xcode (только без Xcode вам уже не забилдить приложение).
- Xamarin. Приложения на этой платформе пишутся с помощью С#. С помощью Xamarin можно создать какое-либо нативное приложение для Android, либо для IOS. Разработку можно вести при помощи Visual Studio. Несмотря на такие преимущества, скорее всего. некоторые фрагменты приложений нужно будет писать отдельно для каждой платформы
- React Native. Производное от библиотеки React может привлечь разработчиков, которые имеют бекграунд во фронтенд-разработке. На нем также можно разрабатывать сразу на обе платформы. Я на нем не писал, кто-то говорит очень просто, кто-то что очень сложно. Но попробовать тоже можно, я думаю.
- Flutter. Пока не настолько известный, Flutter позволяет разрабатывать мобильные приложения на новом языке программирования Dart от компании Google. Если предыдущие решения вам были не по душе, можно воспользоваться этим решением, на котором тоже можно делать кроссплафторменные приложения. Сейчас многие считают, что Flutter — это будущий убийца React Native, но однозначно так сказать нельзя. Мне не нравится официальная документация Dart, но почему-то очень понравился этот урок
- PhoneGap/Cordova. Изначально созданный компанией Nitobi, впоследствии был куплен корпорацией Adobe. Я не буду особенно на нем останавливаться, потому как PhoneGap, как и Apache Cordova, в итоге в приложениях использует WebView, который не очень хорошо влияет на производительность приложений
- Unity. Это тоже путь разработки приложения для IOS, на самом деле. Правда на нем в основном пишутся игры, но можно и писать приложения с интерфейсами. Нормальный вариант если у вас есть опыт в gamedev.
Языки программирования
Корпорация Apple рекомендует использовать для разработки приложений язык программирования Swift. Swift относительно новый язык программирования, который был официально выпущен только в 2014 году. Он может быть использован для разработки для Mac OS, IOS, а также есть поддержка на Linux (поэтому, если у вас, скажем так, не слишком специфический Linux, вы смело можете скачать и попробовать язык, например по этой ссылке).
Сам язык Swift представляет из себя типичный язык нового поколения, как, например, Golang.
Изначально язык задумывался как более легкий для чтения и устойчивый к ошибкам программиста язык, нежели Objective C. В тоже время Swift может работать в рамках одного проекта как с С, так и с Objective C.
Вместо того, чтобы пытаться приводить описание этого языка (который на первый взгляд представляет из себя C++, просто доработанный до современных реалий с модной функцией автоматической типизации), я предлагаю читателю изучить очень приятную документацию от корпорации Apple, в которой подробно рассказано, как устроен язык и каков его синтаксис. Англоязычную версию можно найти здесь, русскоязычный перевод можно найти здесь. После того, как вы ознакомитесь с основами языка Swift, мы можем переходить к тому, ради чего мы здесь сегодня собрались — созданию нашего несложного калькулятора с помощью Xcode.
Создание калькулятора
Для создания приложения нам потребуется Xcode, который можно бесплатно загрузить из AppStore. Не стоит пугаться его рейтинга — несмотря на то, что первые пять отзывов ставят 1 звезду, это не означает, что вас ждет шок. Возможно и правда синтаксис и подсказки включаются не слишком быстро при редактировании — но в целом Xcode оставил у меня в разы более благоприятные впечатления, чем тот же Android Studio (хотя возможно я просто не умею его готовить). Если у вас вдруг есть желание попробовать разработку не в Xcode и вы предпочитаете продукцию компании JetBrains, то вы можете попробовать AppCode — он поддерживает функциональную совместимость с Xcode, работу со Swift и Objective C, и множество других приятных фич. Я лично его не пробовал, но если у вас есть подписка на весь софт от JetBrains — почему бы и не скачать и запустить.
Итак, вы установили Xcode. Теперь можно начать разработку. Запускаете новый проект и выбираете Single Page Application:
После этого вам предложат ввести данные о вашем приложении. Если это ваш первый запуск Xcode, там вам придется ввести Apple Id. После этого вы должны заполнить данные о названии вашего проекта (в нашем случае просто Calculator) и название вашей фирмы и приложения. Здесь вы можете написать все что угодно, если не собираетесь в будущем публиковать это приложение. В качестве языка я выбрал Swift, в качестве User Interface — Storyboard. Тесты я пока выкинул потому что я молодец, потому что тестировать здесь пока толком нечего.
После того, как мы создали наше приложение, вы можете зайти в файл в Calculator.xcodeproj
и поправить какие-либо настройки, если сочтете это нужным. Я пока оставил все как есть, разрабатываю на последнюю версию IOS 13.6 для Iphone и Ipad. Ipad в принципе можете пока исключить — на нем наш интерфейс скорее всего будет смотреться не очень хорошо. Однако хочу вас предупредить, что если вдруг вы будете публиковаться — работники Apple на проверке тестируют и приложения для Iphone, чтобы они были хотя бы функциональны на Ipad. Но до этого вам еще придется потратить 99 долларов на ключи разработчика).
После того, как вы создали приложение, можно сразу вызвать эмулятор для того, чтобы отслеживать, что получается. Для этого можете просто нажать сочетание клавиш CMD + R. Слева вверху вы можете выбирать устройства, на которых вы запускаете эмулятор, а также можете через кабель подключить ваше настоящее физическое устройство и тестировать сразу же на нем).
Существует много способов создания интерфейса и виджетов в нем, я воспользуюсь нейтральным вариантом — создам основной holder, размещу его на весь экран, а потом программно начну располагать свои виджеты. Поэтому сначала мы переходим в файл
и делаем основной View черным, для того, чтобы удобнее размещать наши элементы:
После этого мы добавим View, с которым в основном и будем работать. Для этого кликаем на плюсик справа сверху, через который можно добавлять виджеты, и добавляем новый виджет, наберем в поиске uiview:
После этого мы перетаскиваем этот виджет на основной экран, и нам нужно расширить его на весь экран. Для этого нам нужно поработать с constaint
. Для этого щелкаем по значку слева внизу, который немного похож на кораблик Дарта Вейдера и назначить 0 с каждой из сторон:
После этого ваш новый виджет расширится до размеров всего экрана. Дальше нужно также, как и в прошлый раз, поменять цвет нашего виджета, только теперь на Clear Color, чтобы он нам не мешался и мы могли размещать виджеты в нем.
Теперь можно переходить в файл ViewController.swift
, в котором у нас и будет происходить все остальное программирование. Для начала нам нужно использовать специальный маркер @IBOutlet
для того, чтобы иметь возможность связать Storyboard c нашим кодом. Для этого мы должны написать следующую строчку:
@IBOutlet var holder: UIView!
Теперь мы можем связать код с виджетом. Для этого, по сути, нужно соединить наш holder c Holder. Для этого щелкаем правой кнопкой по viewController
и перетягиваем holder на наш экран:
Наконец-то мы закончили связывание кода с Storyboard и можно заняться именно программированием.
Далее мы добавим две переменные, первая из которых будет просто числом, в которое можно записывать первое значение, а вторая — результирующее значение. Третья переменная будет несколько более специфическая, потому что мы будем использовать optional объявление (почитать, что это за зверь, можно подробнее здесь). Optional может содержать какое-либо значение или nil. Также опционалы гарантируют, что значения nil будут явно обработаны. Кроме того, мы добавим с самого начала перечисление математических операций, которые калькулятор поддерживает:
var firstNumber = 0 var resultNumber = 0 var currentOperations: Operation? enum Operation { case add, subtract, multiply, divide }
Далее нам предстоит создать Label, в который мы будем показывать цифры и результат вычислений. По умолчанию там будет стоять 0 и достаточно большой шрифт. Все остальное, я думаю, совершенно понятно:
private var resultLabel: UILabel = { let label = UILabel() label. text = "0" label.textColor = .white label.textAlignment = .right label.font = UIFont(name: "Helvetica", size: 100) return label }()
После этого, пропустив встроенный метод, который вызывает у нас отрисовку (я говорю про viewDidLoad
), нам нужно вызвать метод, который будет вызывать функцию, которая будет отрисовывать все кнопки, на которых будут висеть функции-обработчики.
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() setupNumberPad() //функция, которая и будет отрисовывать наши кнопки }
После этого у нас и пойдет функция setupNumberPad
. В начале я задам константу для размера нашего шрифта, для того чтобы потом, если что, можно сразу увеличить/уменьшить размер шрифта в приложении, потому что я работаю без макета. После этого я создам размер кнопки — его ширина будет равна четверти размера экрана нашего приложения.
private func setupNumberPad() { let FontSize:CGFloat = 25 // стандартный размер шрифта в дробных числах let buttonSize: CGFloat = view.frame.size.width / 4 // размер кнопки в 1/4 let zeroButton = UIButton(frame: CGRect(x: 0, y: holder.frame.size.height-buttonSize, width: buttonSize*3, height: buttonSize)) // в UIButton мы задаем позицию нашей кнопки zeroButton.setTitleColor(.black, for: .normal) // задаем цвет нашей кнопки zeroButton.backgroundColor = .white // кнопка будет белая zeroButton.setTitle("0", for: .normal) // ее контент конечно 0 zeroButton.titleLabel?.font = UIFont(name: "Helvetica", size: FontSize) // шрифт, family и размер текста zeroButton.tag = 1 // по тегу мы потом будем обрабатывать нажатие на кнопку holder.addSubview(zeroButton) // добавляем в наш holder кнопку zeroButton.addTarget(self, action: #selector(zeroTapped), for: . touchUpInside) // добавляем функцию обработчик и на каком событии
0 у нас занимает треть экрана для того, чтобы у нас справа могли в колонку пойти математические операнды. Дальше нам нужно каким-либо образом отрисовать все кнопки. Конечно, можно было бы их отрисовывать поодиночке, но это тогда получится долго и муторно. Т.к. у нас будет просто ряд цифр от 1 до 9, то вполне на поверхности лежит решение воспользоваться циклами. Я приведу первый цикл с комментариями, а т.к. два остальных по сути повторение, я приведу их просто под катом:
for x in 0..<3 { let button_row_1 = UIButton(frame: CGRect(x: buttonSize * CGFloat(x), y: holder.frame.size.height-(buttonSize*2), width: buttonSize, height: buttonSize)) //будем использовать наш x и для положения по x button_row_1.setTitleColor(.black, for: .normal) //цвет button_row_1.backgroundColor = .white //задний цвет button_row_1. setTitle("\(x+1)", for: .normal) // задаем содержание holder.addSubview(button_row_1) // добавляем в наш вид button_row_1.tag = x+2 // т.к.тег 1 уже занят, добавляем по 2 button_row_1.addTarget(self, action: #selector(numberPressed(_:)), for: .touchUpInside) //добавляем обработчик }
Остальной код наших цифр
for x in 0..<3 { let button_row_2 = UIButton(frame: CGRect(x: buttonSize * CGFloat(x), y: holder.frame.size.height-(buttonSize*3), width: buttonSize, height: buttonSize)) button_row_2.setTitleColor(.black, for: .normal) button_row_2.backgroundColor = .white button_row_2.setTitle("\(x+4)", for: .normal) button_row_2.addSubview(button_row_2) button_row_2.tag = x+5 button_row_2.addTarget(self, action: #selector(numberPressed(_:)), for: .touchUpInside) } for x in 0. .<3 { let button_row_3 = UIButton(frame: CGRect(x: buttonSize * CGFloat(x), y: holder.frame.size.height-(buttonSize*4), width: buttonSize, height: buttonSize)) button_row_3.setTitleColor(.black, for: .normal) button_row_3.backgroundColor = .white button_row_3.setTitle("\(x+7)", for: .normal) holder.addSubview(button_row_3) button_row_3.tag = x+8 button_row_3.addTarget(self, action: #selector(numberPressed(_:)), for: .touchUpInside) }
После этого нам нужно разместить нашу кнопку CE, на которую у нас будет осуществляться сброс данных, которые были введены. Мы разместим ее наверху, и ее функциональную нагрузку мы опишем немного позднее. Пока нам нужно только ее расположить и подключить обработчики:
let clearButton = UIButton(frame: CGRect(x: 0, y: holder.frame.size.height-(buttonSize*5), width: view.frame.size.width - buttonSize, height: buttonSize)) clearButton. setTitleColor(.black, for: .normal) clearButton.backgroundColor = .init(red: 0, green: 2, blue: 0.8, alpha: 1) // здесь я задаю цвета с помощью rgb clearButton.titleLabel?.font = UIFont(name: "Helvetica", size: FontSize-4) //хочу кнопку СЕ довольно большого размера clearButton.setTitle("CE", for: .normal) holder.addSubview(clearButton) // добавляем кнопку в наш holder clearButton.addTarget(self, action: #selector(clearResult), for: .touchUpInside) //добавляем функцию обработчик
Мы закончили с этой скучной повторяющейся частью, теперь готовы к другой штуке — нашим операндам, при помощи которых можно будет осуществлять математические операции. Начнем с того, что необходимые операнды мы поместим внутрь массива, откуда их будем забирать. Сами кнопки операндов мы расположим в колоночку и добавим функцию обработчик, который будет реагировать на нажатия наших операндов. Кнопки я сделаю приятного
цвета детской неожиданностижелого цвета, и размер немного покрупнее, чем у наших цифр.
let operations = ["=","+", "-", "x", "÷"] //массив наших операндов for x in 0..<5 { let button_operand = UIButton(frame: CGRect(x: buttonSize * 3, y: holder.frame.size.height-(buttonSize * CGFloat(x+1)), width: buttonSize, height: buttonSize)) button_operand.setTitleColor(.black, for: .normal) button_operand.backgroundColor = .init(red: 2, green: 0.8, blue: 0, alpha: 1) //желтый цвет button_operand.setTitle(operations[x], for: .normal) holder.addSubview(button_operand) button_operand.tag = x+1 //добавляем тэги, чтобы потом можно было на них ориентироватьсят button_operand.titleLabel?.font = UIFont(name: "Helvetica", size: FontSize) button_operand.addTarget(self, action: #selector(operationPressed(_:)), for: .touchUpInside) }
После этих глобальных операций нам осталось только расположить Label, в который мы будем записывать результат, и закрыть функцию:
resultLabel. frame = CGRect(x: 20, y: clearButton.frame.origin.y - 110.0, width: view.frame.size.width - 40, height: 100) holder.addSubview(resultLabel) } // закрываю тут нашу функцию
Теперь можно двигаться к обработчикам:
Работа с обработчиками
Это все была по сути только верстка, теперь нам предстоит вдохнуть логику в приложение. Для этого мы с вами воспользуемся методами из runtime Objective C, чтобы упростить наш код. Если вы не понимаете, что происходит, могу вам порекомендовать эту статью для чтения.
Итого, вот наши функции:
@objc func clearResult() { resultLabel.text = "0" //на очищении даем значение 0 currentOperations = nil // обнуляем наши текущие операции firstNumber = 0 // первое число у нас становится 0 } @objc func zeroTapped() { // отдельная функция дл нуля if resultLabel.text != "0" { if let text = resultLabel. text { resultLabel.text = "\(text)\(0)" // используем интерполяцию } } }
Дальше нам нужно добавить функцию обработчик на наши кнопки:
@objc func numberPressed(_ sender: UIButton) { let tag = sender.tag - 1 if resultLabel.text == "0" { resultLabel.text = "\(tag)" } else if let text = resultLabel.text { //красиво используем опциональное связывание resultLabel.text = "\(text)\(tag)" } }
Следующей у нас пойдем самая важная бизнес-логика нашего приложения. Мы воспользуемся конструкцией switch для того, чтобы управлять нашими математическими операциями:
@objc func operationPressed(_ sender: UIButton) { let tag = sender.tag if let text = resultLabel.text, let value = Int(text), firstNumber == 0 { //тоже используем опциональное связывание firstNumber = value resultLabel. text = "0" } if tag == 1 { if let operation = currentOperations { var secondNumber = 0 if let text = resultLabel.text, let value = Int(text) { secondNumber = value } switch operation { case .add: firstNumber = firstNumber + secondNumber secondNumber = 0 //обнуляем второе число resultLabel.text = "\(firstNumber)" currentOperations = nil firstNumber = 0 //и первое после записи в Label тоже break case .subtract: firstNumber = firstNumber - secondNumber secondNumber = 0 resultLabel.text = "\(firstNumber)" currentOperations = nil firstNumber = 0 break case . multiply: firstNumber = firstNumber * secondNumber secondNumber = 0 resultLabel.text = "\(firstNumber)" currentOperations = nil firstNumber = 0 break case .divide: firstNumber = firstNumber / secondNumber secondNumber = 0 resultLabel.text = "\(firstNumber)" currentOperations = nil firstNumber = 0 break } } } else if tag == 2 { currentOperations = .add // назначаем операции по номер лейблов. Если будете перемещать кнопки, не забудьте поменять здесь } else if tag == 3 { currentOperations = .subtract } else if tag == 4 { currentOperations = .multiply } else if tag == 5 { currentOperations = . divide } } }
На этом все! Исходный код этого приложения можно найти по этой ссылке. Внешний вид в итоге получился вот такой:
По традиции, приведу несколько полезных ресурсов, которые могут быть полезны начинающему IOS — разработчику:
- Прекрасный сайт для новичка, на котором можно найти массу ответов на распостраненные вопросы по Swift
- Swift Tour, классное место, если вы уже знаете программирование, и просто хотите быстро ознакомиться с языком
- Немного об относительно новом и модном SwiftUI
Быстрый старт в iOS-разработку. Бесплатный вебинар
Калькулятор алгебры с раскрывающимися скобками
Наших пользователей: Эта версия вашей программы по алгебре просто великолепна! Большое спасибо! Это очень помогло мне. ПРОДОЛЖАЙТЕ ХОРОШУЮ РАБОТУ! Наша дочь делает оценки, на которые она способна, благодаря Алгебратору. Снимаю шляпу перед всеми вами! Благодарю вас! Я не большой гений математики, но Алгебратор помогает мне с дробями и другими вещами, которые мне нужно знать для моего класса по математике в колледже. Студенты, борющиеся со всевозможными задачами по алгебре, узнают, что наше программное обеспечение спасает им жизнь. Вот поисковые фразы, которые сегодняшние поисковики использовали, чтобы найти наш сайт. Сможете ли вы найти среди них свою?Поисковые фразы, использованные 03.11.2012:
|
Раскрыть калькулятор- Развернуть и свернуть
Expand, расчет онлайн
Резюме:
Калькулятор способен расширить алгебраическое выражение онлайн и удалить ненужные скобки.
развернуть онлайн
Описание :
В математике до расширяют выражение или до расширяют произведение которая превращается в алгебраическую сумму. Этот калькулятор позволяет расширить все формы алгебраических выражения онлайн , также помогает рассчитать специальные разложения онлайн (разность квадратов, тождество квадрата суммы и тождество квадрата разности). Для простых расширений калькулятор дает шаги расчета. 93`
Обратите внимание, что результат не возвращается как самое простое выражение, чтобы можно было следовать шагам вычислений. Чтобы упростить результаты, просто используйте функцию сокращения.
Специальные онлайн-расширения
Калькулятор расширения позволяет расширить продукт , он применяется ко всем математическим выражениям, особенно следующие тождества:
- тождество для квадрата суммы: позволяет расширять онлайн-выражения вида `(a+b)^2` 9н`. 2`. 92`
Рассчитать онлайн с помощью Expand (расширить калькулятор)
См. также
Список связанных калькуляторов:
- Расчет ежемесячных платежей по страховке кредита : кредит_страхование. Калькулятор ежемесячных платежей по кредитному страхованию: кредит под залог недвижимости, потребительский кредит и другие виды кредита.
- Калькулятор алгебры: калькулятор. Калькулятор, позволяющий производить алгебраические вычисления, комбинируя операции с буквами и цифрами, а также указывать этапы вычислений.
- Калькулятор упрощения surds:simple_surd. Онлайн-калькулятор, который позволяет производить расчеты в точной форме с квадратными корнями: сумма, произведение, разность, отношение.
- Тригонометрический калькулятор: simple_trig. Калькулятор, который использует тригонометрическую формулу для упрощения тригонометрического выражения.
- Список вычислений, применимых к алгебраическому выражению: см._возможные_вычисления. Возвращает список вычислений, которые можно выполнить над алгебраическим выражением.
- Расчет биномиальных коэффициентов: binomial_coefficient. Калькулятор биномиального коэффициента, который позволяет вычислить биномиальный коэффициент из двух целых чисел.
- Калькулятор разложения на частичные дроби: partial_fraction_decomposition. Калькулятор позволяет разбить рациональную дробь на простые элементы.
- Калькулятор производных: производная. Калькулятор производной позволяет пошагово вычислить производную функции по переменной.
- Калькулятор расширения Тейлора: taylor_series_expansion. Калькулятор ряда Тейлора позволяет вычислить разложение Тейлора функции.
- Логарифмическое расширение: expand_log. Калькулятор позволяет получить логарифмическое расширение выражения.
- Тригонометрическое расширение: expand_trigo. Калькулятор позволяет получить тригонометрическое разложение выражения.
- Расширить калькулятор : развернуть. Калькулятор умеет расширять алгебраическое выражение онлайн и удалять ненужные скобки.
- Расширьте и упростите алгебраическое выражение онлайн: expand_and_simplify. Онлайн-калькулятор, позволяющий расширить и сократить алгебраическое выражение.
- Калькулятор факторинга: коэффициент. Калькулятор факторинга позволяет факторизовать алгебраическое выражение онлайн с шагом.
- Интегральный калькулятор: интегральный. Калькулятор интегралов вычисляет онлайн интеграл функции между двумя значениями, результат выдается в точном или приближенном виде.
- Калькулятор неопределенных интегралов: первообразная. Калькулятор первообразной позволяет рассчитать первообразную онлайн с подробностями и шагами расчета.
- Калькулятор лимита: лимит. Калькулятор лимита позволяет рассчитать лимит функции с подробным описанием и шагами расчета.
- Тригонометрическая линеаризация : linearization_trigo. Калькулятор, позволяющий линеаризовать тригонометрическое выражение.
- Расчет ежемесячных платежей по кредиту: month_loan. Калькулятор ежемесячного платежа по кредиту: жилищный кредит, потребительский кредит и другие виды кредита.
- Научный онлайн-калькулятор: оценить. Научный онлайн-калькулятор для расчета алгебраических выражений и получения числового результата.