2 целых числа вводятся с клавиатуры, в отдельных строках отображается половина их суммы

Обновлено: 07.07.2024

Я пишу программу, которая принимает ввод от пользователя.

Программа работает должным образом, пока пользователь вводит значимые данные.

Но это не работает, если пользователь вводит неверные данные:

Вместо сбоя я хотел бы, чтобы программа снова запрашивала ввод. Вот так:

Как сделать так, чтобы программа запрашивала допустимые данные, а не вылетала при вводе бессмысленных данных?

Как я могу отклонить такие значения, как -1 , которые являются допустимыми значениями int , но бессмысленными в данном контексте?

22 ответа 22

Самый простой способ добиться этого — поместить метод ввода в цикл while. Используйте «Продолжить», когда вы получаете неправильный ввод, и прервите цикл, когда будете удовлетворены.

Когда ваш ввод может вызвать исключение

Используйте try и кроме, чтобы определить, когда пользователь вводит данные, которые не могут быть проанализированы.

Внедрение собственных правил проверки

Если вы хотите отклонить значения, которые Python может успешно проанализировать, вы можете добавить собственную логику проверки.

Сочетание обработки исключений и пользовательской проверки

Оба вышеуказанных метода могут быть объединены в один цикл.

Инкапсуляция всего в функцию

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

Собираем все вместе

Вы можете расширить эту идею, чтобы создать очень общую функцию ввода:

С использованием, например:

Распространенные ошибки и почему их следует избегать

Избыточное использование избыточных операторов ввода

Этот метод работает, но обычно считается плохим стилем:

Поначалу он может показаться привлекательным, потому что он короче, чем метод while True, но он нарушает принцип "Не повторяйся" при разработке программного обеспечения. Это увеличивает вероятность ошибок в вашей системе. Что делать, если вы хотите вернуться к версии 2.7, изменив ввод на raw_input , но случайно изменив только первый ввод выше? Это SyntaxError, ожидающая своего появления.

Рекурсия взорвет ваш стек

Если вы только что узнали о рекурсии, у вас может возникнуть соблазн использовать ее в get_non_negative_int, чтобы избавиться от цикла while.

Похоже, что в большинстве случаев это работает нормально, но если пользователь вводит неверные данные достаточное количество раз, сценарий завершается с ошибкой RuntimeError: превышена максимальная глубина рекурсии . Вы можете подумать, что "дурак не сделает 1000 ошибок подряд", но вы недооцениваете изобретательность дураков!

Приятно читать, много примеров, спасибо. Недооцененный урок: «Не недооценивайте изобретательность дураков!»

Я бы не только проголосовал за оба вопроса и ответа, поскольку они великолепны, но и вы заключили сделку с "неустойчивой шестеркой". Молодец, @Kevin.

Не оценивайте изобретательность дураков. и умные нападающие. DOS-атака была бы самой простой для такого рода вещей, но возможны и другие.

@JArunMani Я не думаю, что это будет плохой стиль, но может быть немного менее читабельным. У вас действительно будет только один вход на цикл, и цикл станет очень коротким, но условие может стать довольно длинным.

@laundmo, конечно, я публикую написанные мной блоки кода в открытом доступе. Не стесняйтесь использовать их в любом контексте без моего явного разрешения или ведома. Что касается сегментов без кодовых блоков, если вы хотите вставить весь мой ответ в книгу «Изучение Python», которую вы пишете, давайте поговорим об лицензионных отчислениях ;-)

Зачем вам делать while True, а затем выходить из этого цикла, в то время как вы также можете просто указать свои требования в операторе while, ведь все, что вам нужно, это остановиться, как только вы достигнете возраста?

Это приведет к следующему:

это сработает, так как возраст никогда не будет иметь значение, которое не будет иметь смысла, а код следует логике вашего "бизнес-процесса"

Хотя принятый ответ потрясающий. Я также хотел бы поделиться быстрым взломом для этой проблемы. (Это также решает проблему отрицательного возраста.)

P.S. Этот код предназначен для Python 3.x.

Обратите внимание, что этот код является рекурсивным, но здесь рекурсия не нужна, и, как сказал Кевин, она может взорвать ваш стек.

@PM2Ring - вы правы. Но моя цель состояла в том, чтобы просто показать, как «короткое замыкание» может минимизировать (украсить) длинные фрагменты кода.

Зачем присваивать переменной лямбда, вместо этого просто используйте def. def f(age): намного понятнее, чем f = lambda age:

В некоторых случаях возраст может понадобиться только один раз, после чего эта функция бесполезна. Кто-то может захотеть использовать функцию и выбросить ее после того, как работа будет выполнена. Кроме того, это может быть не лучший способ, но это определенно другой способ сделать это (что и было целью моего решения).

Функциональный подход или "смотри, мама, без петель!":

или если вы хотите, чтобы сообщение "неверный ввод" было отделено от приглашения ввода, как в других ответах:

Как это работает?

  1. Эта комбинация itertools.chain и itertools.repeat создаст итератор, который выдаст строки "Введите число: " один раз и "Не число! Повторите попытку: " бесконечное количество раз:
  2. replies = map(input, prompts) — здесь карта применит все строки подсказок из предыдущего шага к функции ввода. Например:
  3. Мы используем filter и str.isdigit, чтобы отфильтровать те строки, которые содержат только цифры: А чтобы получить только первую строку, состоящую только из цифр, мы используем next .

Другие правила проверки:

Строковые методы. Конечно, вы можете использовать и другие строковые методы, такие как str.isalpha, чтобы получить только строки с буквами, или str.isupper, чтобы получить только прописные буквы. Полный список см. в документах.

Тестирование членства:
Существует несколько различных способов его выполнения. Один из них — использование метода __contains__:

Сравнение чисел:
Есть полезные методы сравнения, которые мы можем использовать здесь. Например, для __lt__ ( ):

Или, если вам не нравится использовать методы dunder (dunder = двойное подчеркивание), вы всегда можете определить свою собственную функцию или использовать функции из модуля оператора.

Существование пути:
Здесь можно использовать библиотеку pathlib и ее метод Path.exists:

Ограничение количества попыток:

Если вы не хотите мучить пользователя, спрашивая его о чем-то бесконечное количество раз, вы можете указать ограничение в вызове itertools.repeat . Это можно комбинировать с указанием значения по умолчанию для следующей функции:

Предварительная обработка входных данных:

Иногда мы не хотим отклонять ввод, если пользователь случайно ввел его ЗАПИСНЫМИ БУКВАМИ или с пробелом в начале или в конце строки. Чтобы учесть эти простые ошибки, мы можем предварительно обработать входные данные, применив методы str.lower и str.strip. Например, для случая проверки членства код будет выглядеть так:

Объединение правил проверки:

Для простого случая, например, когда программа запрашивает возраст от 1 до 120 лет, можно просто добавить еще один фильтр:

К сожалению, если кому-то нужно специальное сообщение для каждого неудачного случая, то, боюсь, нет красивого функционального способа. Или, по крайней мере, я не смог его найти.

1.3 Условные операторы и циклы

В программах, которые мы рассмотрели к этому моменту, каждый из операторов выполняется один раз в заданном порядке. Большинство программ более сложны, потому что последовательность операторов и количество раз выполнения каждого из них могут различаться. Мы используем термин поток управления для обозначения последовательности операторов в программе.

Инструкции If.


использует Math.random() и оператор if-else для вывода результатов подбрасывания монеты.


Пока циклы.

    Следующий фрагмент кода вычисляет наибольшую степень числа 2, которая меньше или равна заданному положительному целому числу n.


Для циклов.

    Для обозначения. Многие циклы следуют одной и той же базовой схеме: инициализируйте индексную переменную некоторым значением, а затем используйте цикл while для проверки условия выхода, включающего индексную переменную, используя последний оператор в цикле while для изменения переменной индекса. Цикл Java for — это прямой способ выражения таких циклов.


Вложение.

Примеры циклов.


Приложения.


  • Подразделения линейки.RulerN.java принимает целочисленный аргумент командной строки n и выводит строку длины подразделения линейки. Эта программа иллюстрирует одну из основных характеристик циклов — программа вряд ли может быть проще, но она может производить огромное количество выходных данных.
  • Конечные суммы. Вы будете часто использовать вычислительную парадигму, используемую в PowersOfTwo.java. Он использует две переменные: одну в качестве индекса, управляющего циклом, а другую для накопления результатов вычислений. Программа HarmonicNumber.java использует ту же парадигму для вычисления суммы

Другие условные конструкции и циклы.


В. Как я могу проверить, равны ли две строки? Использование == не работает.

А. В этом одно из различий между примитивными типами (int, double, boolean) и ссылочными типами (String). . Мы узнаем о проверке строк на равенство в Разделе 3.1.

В. Почему оператор if (a

  1. Напишите программу AllEqual.java, которая принимает три целочисленных аргумента командной строки и выводит равно, если все три равны, и не равно в противном случае. 2 + bx + c, выводит соответствующее сообщение об ошибке, если дискриминант отрицателен, и ведет себя соответствующим образом (избегая деления на ноль), если a равно нулю.
  2. Что (если вообще есть) неверно в каждом из следующих утверждений?
    1. если (a > b), то c = 0;
    2. если а > б
    3. если (а > б) с = 0;
    4. если (a > b) c = 0 иначе b = 0;

    Творческие упражнения

    1. Такси Рамануджана. С. Рамануджан был индийским математиком, прославившимся своей интуицией в отношении чисел. Когда однажды английский математик Г. Х. Харди навестил его в больнице, Харди заметил, что номер его такси — 1729, довольно скучный номер. На что Рамануджан ответил: «Нет, Харди! Нет, Харди! Это очень интересное число. Это наименьшее число, которое можно выразить как сумму двух кубов двумя разными способами». Проверьте это утверждение, написав программу Ramanujan.java, которая принимает целочисленный аргумент командной строки n и выводит все целые числа, меньшие или равные n, которые могут быть выражены в виде суммы двух кубов двумя разными способами — найти различные положительные целые числа a, b, c и d такие, что a 3 + b 3 = c 3 + d 3 . Используйте четыре вложенных цикла for.

    Веб-упражнения

    1. Напишите программу RollDie.java, которая генерирует результат броска правильного шестигранного кубика (целое число от 1 до 6).
    2. Напишите программу, которая принимает три целочисленных аргумента командной строки a, b и c и выводит количество различных значений (1, 2 или 3) среди a, b и c.
    3. Напишите программу, которая принимает пять целочисленных аргументов командной строки и выводит медиану (третью по величине).
    4. (жесткий) Теперь попробуйте вычислить медиану 5 элементов таким образом, чтобы при выполнении она никогда не выполняла более 6 сравнений.
    5. Как создать бесконечный цикл с помощью цикла for?

    Условие цикла while использует = вместо ==, поэтому это оператор присваивания (который делает done всегда false< /tt> и тело цикла никогда не будет выполнено). Лучше использовать стиль, чтобы не использовать ==.

    Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Чтение входных данных и Написание выходных данных в Python

    Чтобы программа была полезной, она обычно должна взаимодействовать с внешним миром, получая входные данные от пользователя и отображая данные о результатах обратно пользователю. В этом руководстве вы узнаете о вводе и выводе Python.

    Ввод может поступать от пользователя непосредственно через клавиатуру или из внешних источников, таких как файлы или базы данных. Выходные данные могут отображаться непосредственно на консоли или в среде IDE, на экране через графический интерфейс пользователя (GUI) или снова во внешнем источнике.

    В предыдущем руководстве этой вводной серии вы:

    • Сравнение различных парадигм, используемых языками программирования для реализации определенной итерации.
    • Узнал об итераторах и итераторах — двух концепциях, лежащих в основе определенной итерации в Python.
    • Связал все вместе, чтобы узнать о циклах for в Python

    К концу этого руководства вы будете знать, как:

    • Принимать пользовательский ввод с клавиатуры с помощью встроенной функции input()
    • Отображение вывода на консоль с помощью встроенной функции print()
    • Форматировать строковые данные с помощью f-строк Python

    Без дальнейших церемоний, давайте приступим!

    Бесплатный бонус: нажмите здесь, чтобы получить памятку по Python и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.

    Чтение ввода с клавиатуры

    Программы часто должны получать данные от пользователя, обычно путем ввода с клавиатуры. Один из способов сделать это в Python — использовать input() :

    Функция input() приостанавливает выполнение программы, чтобы пользователь мог ввести строку ввода с клавиатуры. Как только пользователь нажимает клавишу Enter, все введенные символы считываются и возвращаются в виде строки:

    Обратите внимание, что возвращаемая строка не включает новую строку, сгенерированную, когда пользователь нажимает клавишу Enter.

    Если вы включите необязательный

    аргумент, затем функция input() отображает его как подсказку, чтобы пользователь знал, что вводить:

    input() всегда возвращает строку.Если вам нужен числовой тип, вам нужно преобразовать строку в соответствующий тип с помощью встроенной функции int() , float() или complex() :

    В приведенном выше примере выражение число + 100 в строке 3 недопустимо, поскольку число является строкой, а 100 — целым числом. Чтобы избежать этой ошибки, строка 8 преобразовывает число в целое число сразу после сбора пользовательского ввода. Таким образом, к расчетному числу + 100 в строке 10 нужно добавить два целых числа. Благодаря этому вызов print() выполняется успешно.

    Примечание к версии Python. Если вы обнаружите, что работаете с кодом Python 2.x, вы можете столкнуться с небольшой разницей в функциях ввода между версиями Python 2 и 3.

    raw_input() в Python 2 считывает ввод с клавиатуры и возвращает его. raw_input() в Python 2 ведет себя точно так же, как input() в Python 3, как описано выше.

    Но в Python 2 также есть функция input() . В Python 2 функция input() считывает ввод с клавиатуры, анализирует и оценивает его как выражение Python и возвращает результирующее значение.

    В Python 3 нет ни одной функции, которая делала бы то же самое, что и input() в Python 2. Вы можете имитировать эффект в Python 3 с помощью выражения eval(input()) . Однако это представляет собой угрозу безопасности, поскольку позволяет пользователям запускать произвольный, потенциально вредоносный код.

    Для получения дополнительной информации о eval() и связанных с ним потенциальных угрозах безопасности ознакомьтесь с Python eval(): динамическое вычисление выражений.

    С помощью input() вы можете собирать данные от своих пользователей. Но что, если вы хотите показать им какие-либо результаты, рассчитанные вашей программой? Далее вы узнаете, как отображать выходные данные для пользователей в консоли.

    Запись вывода в консоль

    Помимо получения данных от пользователя, программа также обычно должна предоставлять данные обратно пользователю. Вы можете отображать данные программы на консоли в Python с помощью print() .

    Чтобы отобразить объекты на консоли, передайте их в виде списка аргументов, разделенных запятыми, функции print() .

    print( , . )

    Отображает строковое представление каждого из них на консоль. (Документация)

    По умолчанию print() разделяет объекты одним пробелом и добавляет новую строку в конец вывода:

    Вы можете указать любой тип объекта в качестве аргумента для print() . Если объект не является строкой, функция print() преобразует его в соответствующее строковое представление перед отображением:

    Как видите, даже сложные типы, такие как списки, словари и функции, могут отображаться в консоли с помощью print() .

    Печать с расширенными функциями

    print() принимает несколько дополнительных аргументов, обеспечивающих скромный контроль над форматом вывода. Каждый из них представляет собой особый тип аргумента, называемый аргументом ключевого слова. Позже в этой вводной серии вы встретите руководство по функциям и передаче параметров, чтобы вы могли больше узнать об аргументах ключевых слов.

    А пока вот что вам нужно знать:

    • Аргументы ключевых слов имеют форму = .
    • Любые ключевые аргументы, передаваемые функции print(), должны стоять в конце после списка отображаемых объектов.

    В следующих разделах вы увидите, как эти ключевые аргументы влияют на вывод консоли, создаваемый функцией print() .

    Разделение печатаемых значений

    Добавление ключевого аргумента sep= приводит к тому, что Python разделяет объекты с помощью одинарного пробела, а не по умолчанию:

    Чтобы сжать объекты вместе без пробела между ними, укажите пустую строку ("") в качестве разделителя:

    Вы можете использовать ключевое слово sep, чтобы указать любую произвольную строку в качестве разделителя.

    Управление символом новой строки

    Аргумент ключевого слова end= приводит к завершению вывода вместо символа новой строки по умолчанию:

    Например, если вы отображаете значения в цикле, вы можете использовать end, чтобы значения отображались в одной строке, а не в отдельных строках:

    Вы можете использовать ключевое слово end, чтобы указать любую строку в качестве ограничителя вывода.

    Отправка вывода в поток

    print() принимает два дополнительных аргумента ключевого слова, оба из которых влияют на то, как функция обрабатывает поток вывода:

    file= : по умолчанию print() отправляет свой вывод в поток по умолчанию с именем sys.stdout , который обычно эквивалентен консоли. Аргумент file= заставляет print() отправлять вывод в альтернативный поток, указанный вместо этого.

    flush=True: обычно print() буферизует свой вывод и периодически записывает в выходной поток. flush=True указывает, что Python принудительно очищает поток вывода при каждом вызове функции print() .

    Эти два аргумента ключевых слов представлены здесь для полноты картины. На этом этапе обучения вам, вероятно, не нужно слишком беспокоиться о потоках вывода.

    Использование форматированных строк

    Хотя вы можете углубиться в изучение функции Python print(), форматирование вывода консоли, которое она предоставляет, в лучшем случае находится в зачаточном состоянии. Вы можете выбрать способ разделения печатных объектов и указать, что будет в конце печатной строки. Вот и все.

    Во многих случаях вам потребуется более точный контроль над внешним видом данных, предназначенных для отображения. Python предоставляет несколько способов форматирования выходных строковых данных. В этом разделе вы увидите пример использования f-строк Python для форматирования строк.

    Примечание. Синтаксис f-строки — это один из современных способов форматирования строк. Для углубленного обсуждения вы можете ознакомиться с этими руководствами:

    Вы также получите более подробный обзор двух подходов к форматированию строк, f-strings и str.format() , в руководстве по выводу форматированных строк в Python, которое следует за этим руководством в этой вводной серии.

    В этом разделе вы будете использовать f-строки для форматирования вывода. Предположим, вы написали код, запрашивающий у пользователя имя и возраст:

    Вы успешно собрали данные от своего пользователя, и вы также можете отобразить их на их консоли. Чтобы создать красиво отформатированное выходное сообщение, вы можете использовать синтаксис f-строки:

    f-строки позволяют заключать имена переменных в фигурные скобки ( <> ), чтобы вставлять их значения в создаваемую строку. Все, что вам нужно сделать, это добавить букву f или F в начало вашей строки.

    Далее предположим, что вы хотите сообщить пользователю, сколько ему будет лет через 50 лет. F-строки Python позволяют вам сделать это без особых накладных расходов! Вы можете добавить любое выражение Python между фигурными скобками, и Python сначала вычислит его значение, а затем вставит его в вашу f-строку:

    Вы добавили 50 к значению возраста, которое вы получили от пользователя и преобразовали в целое число с помощью int() ранее. Весь расчет происходил внутри второй пары фигурных скобок в вашей f-строке. Довольно круто!

    Примечание. Если вы хотите узнать больше об использовании этого удобного метода форматирования строк, вы можете углубиться в руководство по f-строкам Python 3.

    F-строки Python, возможно, являются наиболее удобным способом форматирования строк в Python. Если вы хотите учиться только одним способом, лучше всего придерживаться f-строк Python. Однако этот синтаксис доступен только начиная с Python 3.6, поэтому, если вам нужно работать с более старыми версиями Python, вам придется использовать другой синтаксис, например, метод str.format() или строковый оператор по модулю.

    Ввод и вывод Python: заключение

    В этом руководстве вы узнали о вводе и выводе в Python и о том, как ваша программа Python может взаимодействовать с пользователем. Вы также изучили некоторые аргументы, с которыми можно работать, чтобы добавить сообщение в приглашение ввода или настроить, как Python отображает вывод для ваших пользователей.

    Вы научились:

    • Принимать пользовательский ввод с клавиатуры с помощью встроенной функции input()
    • Отображение вывода на консоль с помощью встроенной функции print()
    • Форматировать строковые данные с помощью f-строк Python

    В следующем учебном пособии этой вводной серии вы узнаете о еще одном методе форматирования строк и глубже погрузитесь в использование f-строк.

    Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Чтение входных данных и Написание выходных данных в Python

    Раз в несколько дней получайте короткие и интересные трюки с Python. Никакого спама никогда. Отписаться в любое время. Куратор: команда Real Python.

    Python Tricks Dictionary Merge

    О Джоне Стурце

    Джон — заядлый питонист и член учебной группы Real Python.

    Вы можете указать, какое количество знаков после запятой должно быть в ячейках с числами, валютными значениями или процентами, даже если само число, имеет введенное в ячейке, более высокую степень значимости. При этом в частоте всегда будет зарегистрирована фактическое значение, независимо от того, сколько знаков после запятой в ячейке. Однако, если формула содержит текст ячейки, то в высокой степени используется отображаемое значение.

    Формат ячейки можно изменить, даже если Вы уже ввели содержимое в эту ячейку. Например, если имеется таблица цен, можно автоматически добавить символ валюты (например, знак доллара $) во все ячейки, отформатировав их как валюту, а затем выбрав нужный символ.

    Автоматическое форматирование длительности

    По умолчанию страницы выполняют форматирование таблиц таблиц автоматически, поэтому буквы и цифры отображаются в том виде, в каком Вы их ввели. При использовании данных для ячеек всегда можно восстановить естественное форматирование.

    Выберите контейнер или таблицу, которые нужно отформатировать.

    Числа

    По умолчанию в ячейках, отформатированных как числа, отображается столько знаков после запятой, сколько Вы в них ввели. Это число может измениться, чтобы во всех ячейках, отформатированных как числа, отображалось одинаковое количество знаков после запятой.

    Изменения в применении количества знаков после запятой применения сочетаются между собой и процентами. Например, если в ячейку с числовым значением вводится процентное значение, количество отображаемых знаков после запятой должности прежним.

    Выберите контейнер или таблицу, которые нужно отформатировать.

    Число. Обычное форматирование чисел.

    Валюта (денежные единицы)

    По умолчанию в ячейках, отформатированных как валюта, отображается два знака после запятой. Это может измениться, чтобы в ячейках отображалось такое количество знаков после запятой, сколько Вы в них ввели, или одинаковое количество знаков после запятой.

    Выберите контейнер или таблицу, которые нужно отформатировать.

    Выполните одно из следующих действий.

    Процентные значения

    По умолчанию в ячейках, отформатированных как проценты, отображается столько знаков после запятой, сколько Вы в них ввели. Это значение может измениться, чтобы на всех ячейках отображалось одинаковое количество знаков после запятой.

    Изменения количества знаков после запятой применяются к процентным и числовым значениям в выбранном интервале. Например, если в ячейку с процентным значением вводится десятичное значение, отображаемое количество знаков после запятой проживания прежним.

    Выберите контейнер или таблицу, которые нужно отформатировать.

    Выполните одно из следующих действий.

    Если форматируемая ячейка уже имеет значение, считается, что это десятичное число и оно будет преобразовано в процент. Например, 3 преобразуется в 300 %.

    Если используется в формуле, используется версия процента в виде десятичной дроби. Например, значение, которое отображается как 3 %, в формуле подставляется как 0,03.

    Дата и время

    Выберите контейнер или таблицу, которые нужно отформатировать.

    Длительность (единицы времени)

    По умолчанию содержатся значения длительности, форматируются таким образом, что в них представлены все введенные значения времени. Это значение может быть изменено, чтобы все камеры имели значение длительности выглядящего однообразно (например, можно отображать значения только в часах, без использования минут, секунд и миллисекунд). Эта настройка будет действовать, если даже значение, введенное в ячейке, зависит от более высокой степени раздражительности. При этом в потребностях используется более точное значение.

    Выберите контейнер или таблицу, которые нужно отформатировать.

    Выполните одно из описанных ниже действий.

    0: все единицы измерения скрыты.

    0 недель: изъятие из употребления полностью.

    Если вы измените формат длительности после ввода данных в ячейку, данные автоматически перестроятся с учетом нового формата длительности.

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

    Крис Вудфорд. Последнее обновление: 12 октября 2021 г.

    Вы помните константу Авогадро с точностью до шести знаков после запятой? Сможете ли вы извлечь квадратный корень из 747 менее чем за секунду? Сможете ли вы сложить сотни чисел одно за другим, ни разу не ошибившись? Карманные калькуляторы могут делать все это и многое другое, используя крошечные электронные переключатели, называемые транзисторами. Давайте заглянем внутрь калькулятора и узнаем, как он работает!

    Фото: Калькулятор Casio fx-570 обслуживает меня в фунтах стерлингов с 1984 года и по сей день не теряет своей актуальности. Если вам интересно, постоянная Авогадро (одна из многих констант, хранящихся в этом калькуляторе и доступных по нажатию кнопки) раньше приводилась как 6,022045 × 10 23 (с 2011 года новые источники дают более точно рассчитанное значение 6,022141 × 10 23 ).

    Содержание

    Что такое калькулятор?


    Фото: Мой новый калькулятор Casio, fx-991ES, имеет гораздо больший «естественный дисплей», который может отображать целые уравнения и даже выполнять вычисления! Большие темно-серые клавиши внизу — это числа и основные «операторы» (+, −, ×, ÷, = и т. д.). Клавиши светло-серого цвета над ними выполняют целый ряд научных расчетов одним нажатием кнопки. Коричневый квадрат в правом верхнем углу — это солнечная батарея, которая питает машину вместе с маленькой батарейкой-таблеткой.

    Наш мозг удивительно универсален, но нам трудно считать в уме, потому что он может хранить ограниченное количество чисел.Согласно известному исследованию 1950-х годов, проведенному психологом Джорджем Миллером, мы обычно можем вспомнить 5–9 цифр (или, как выразился Миллер: «магическое число семь плюс-минус два»), прежде чем наш мозг начнет болеть и забывать. Вот почему люди использовали вспомогательные средства, чтобы помочь им вычислить с древних времен. Действительно, слово «калькулятор» происходит от латинского calculare, что означает считать с помощью камней.


    Фото: Калькулятор Burroughs Mechanical начала 20 века. Вы вводите числа, с которыми хотите работать, используя девять столбцов восьмиугольных клавиш вверху, поворачиваете ручку и читаете результат в маленьких «окошках» внизу. Фото предоставлено цифровыми коллекциями Национального института стандартов и технологий, Гейтерсбург, Мэриленд, 20899.

    Механические калькуляторы (состоящие из шестеренок и рычагов) широко использовались с конца 19 до конца 20 века. Именно тогда начали появляться первые доступные карманные электронные калькуляторы благодаря разработке кремниевых микрочипов в конце 1960-х и начале 1970-х годов.


    Современные калькуляторы имеют много общего с компьютерами: у них во многом схожая история и принцип работы, но есть одно существенное отличие: калькулятор – это полностью управляемая человеком машина для обработки математических данных, в то время как компьютер может запрограммирован на самостоятельную работу и выполнение целого ряда работ более общего назначения. Короче говоря, компьютер программируется, а калькулятор — нет. (Программируемый калькулятор находится где-то посередине: вы можете запрограммировать его, но только для выполнения относительно простых математических вычислений.)

    Что внутри калькулятора?

    Если бы вы разобрали калькулятор XIX века, то обнаружили бы внутри сотни деталей: множество прецизионных шестерен, осей, стержней и рычагов, смазанных до небес, щелкающих и жужжащих каждый раз, когда вы набрал номер. Но разберите современный электронный калькулятор (я просто не могу удержаться от того, чтобы не открутить винт, когда увижу такой!) и вы можете быть разочарованы тем, как мало вы найдете. Я не рекомендую вам делать это с вашим новеньким школьным калькулятором, если вы хотите поддерживать дружеские отношения со своими родителями, так что я избавил вас от хлопот. Вот что вы найдете внутри:



    Подпись: Внутри fx-570, здесь лицевой стороной вниз. Мы эффективно смотрим на машину снизу.
    Не волнуйтесь, мне удалось снова собрать все вместе!

    • Ввод : Клавиатура: около 40 крошечных пластиковых клавиш с резиновой мембраной внизу и сенсорной схемой под ней.
    • Процессор: микрочип, выполняющий всю тяжелую работу. Это делает ту же работу, что и все сотни передач в раннем калькуляторе.
    • Вывод . Жидкокристаллический дисплей (ЖК-дисплей) для отображения введенных вами чисел и результатов вычислений.
    • Источник питания: аккумулятор с длительным сроком службы (у меня тонкий литиевый элемент типа «кнопка», срок службы которого составляет несколько лет). В некоторых калькуляторах также есть солнечная батарея, которая обеспечивает бесплатную электроэнергию при дневном свете.

    И это все!

    Что происходит, когда вы нажимаете клавишу?

    Нажмите одну из цифровых клавиш на калькуляторе, и в быстрой последовательности произойдет ряд событий:

      Когда вы нажимаете на жесткий пластик, вы сжимаете резиновую мембрану под ним. Это своего рода миниатюрный батут с небольшой резиновой кнопкой, расположенной прямо под каждой клавишей, и полым пространством под ней. Когда вы нажимаете клавишу, вы сдавливаете резиновую кнопку на мембране прямо под ней.

    Резиновая мембрана клавиатуры, вид сверху


    Фото: Мембрана клавиатуры. Я оставил один из ключей на мембране, чтобы дать вам представление о масштабе. Прямо под каждой клавишей находится одна резиновая кнопка. Подробнее читайте в нашей статье о компьютерных клавиатурах.

    Как работает дисплей?

    Иллюстрация: семисегментный дисплей может отображать все числа от 0 до 9.

    Возможно, вы привыкли к мысли, что экран вашего компьютера создает буквы и цифры с помощью крошечной сетки точек, называемых пикселями . Ранние компьютеры использовали всего несколько пикселей и выглядели очень точечными и зернистыми, но современный ЖК-экран использует миллионы пикселей и почти такой же четкий и четкий, как печатная книга. Калькуляторы, однако, застряли в темных веках — или, если быть точным, в начале 1970-х годов. Посмотрите внимательно на цифры на калькуляторе, и вы увидите, что каждая из них состоит из разных шаблонов из семи полос или сегментов.Микросхема процессора знает, что может отображать любые числа от 0 до 9, активируя другую комбинацию этих семи сегментов. Он не может легко отображать буквы, хотя некоторые научные калькуляторы (более продвинутые электронные калькуляторы с большим количеством встроенных математических и научных формул) работают.


    Фото: посмотрите внимательно на зеленые цифры на этом дисплее, и вы увидите, что каждая из них состоит из двух или более из семи сегментов, которые светятся. Это крупный план зеленого вакуумного флуоресцентного дисплея калькулятора 1970-х годов, показанного выше.

    Как калькулятор складывает два числа?

    До сих пор у нас было очень простое представление о том, что происходит внутри калькулятора, но мы на самом деле не дошли до сути того, как он берет два числа и складывает их, чтобы получить третье. Для тех из вас, кто хотел бы немного больше подробностей, вот немного более техническое объяснение того, как это происходит. Короче говоря, он включает в себя представление десятичных чисел, которые мы используем, в другом формате, называемом двоичным, и сравнение их с электрическими цепями, известными как логические элементы .

    Представление чисел в двоичном формате

    Считается, что люди работают с числами в десятичном формате (числа от 0 до 9) в основном потому, что у нас есть десять пальцев рук и ног, чтобы считать. Но числа, которые мы используем для записи количества вещей, произвольны. Допустим, у вас есть куча монет, и вы хотите сказать мне, насколько вы богаты. Вы можете указать на кучу, я могу посмотреть на нее, и если я увижу много монет, я сделаю вывод, что вы богаты. Но что, если я не буду смотреть на кучу? Затем вы можете использовать символ для представления монет — и это то, что число: символ, который указывает количество. Если бы было девятнадцать монет, вы могли бы использовать два символа «1» и «9», написанные вместе: 19. Взятые вместе, это означает, что 1 × 10 плюс 9 × 1 = 19. Вот как работает десятичная система с использованием системы из 10 символов. Но вы можете использовать и другие символы.

    За последний век или около того компьютеры и калькуляторы были построены из множества переключающих устройств, которые могут находиться в том или ином положении. Точно так же, как выключатель света, они либо «включены», либо «выключены». По этой причине компьютеры и калькуляторы хранят и обрабатывают числа, используя так называемый двоичный код, который использует всего два символа (0 и 1) для представления любого числа. Так в двоичном коде число 19 записывается как 10011, что означает (1 × 16) + (0 × 8) + (0 × 4) + (1 × 2) + (1 × 1) = 19. Красота двоичного кода состоит в том, что вы можете представить любое десятичное число с помощью ряда переключателей, которые либо включены, либо выключены — идеально подходит для калькулятора или компьютера — вот так:

    Представление десятичного числа 19 с пятью двоичными переключателями 10011

    Иллюстрация: как представить двоичное число 19 в калькуляторе или компьютере с помощью пяти переключателей. Три нажаты (включены) и два оставлены как есть (выключены), указывая на двоичное число 10011, что равно 19 в десятичном виде.

    Преобразование десятичного числа в двоичное

    Первое, что должен сделать ваш калькулятор, — это преобразовать десятичные числа, которые вы вводите, в двоичные числа, с которыми он может работать, и он делает это с помощью (довольно) простой схемы, называемой двоично-десятичным кодировщиком . Это проще, чем кажется, и анимация ниже показывает, как это работает для чисел 1–9. Есть 10 «входных» ключей (ноль я пропустил), подключенных к четырем выходным линиям. Каждый вход подключен таким образом, что он запускает один или несколько выходов, поэтому процесс преобразования эффективно происходит через схему подключения. Например, клавиша 1 запускает только строку справа, что дает нам выход 0001 в двоичном формате, а клавиша 7 запускает три из четырех строк, что дает нам 0111 в двоичном формате (4 + 2 + 1).

    Анимация: как двоично-десятичный кодировщик калькулятора преобразует десятичный ввод с клавиатуры в двоичный вывод. Выходные линии запускаются вентилями ИЛИ (описанными ниже), подключенными к входным линиям, поэтому каждая выходная линия срабатывает, если одна ИЛИ несколько входных линий, подключенных к ней, посылают ток.

    Использование логических вентилей с двоичным кодом

    Допустим, вы хотите вычислить сумму 3 + 2 = 5.

    Калькулятор решает подобную задачу, превращая два числа в двоичные числа, что дает 11 (что равно 3 в двоичном формате = 1 × 2 + 1 × 1) плюс 10 (2 в двоичном формате = 1 × 2 + 0 × 1). составляет 101 (5 в двоичном формате = 1 × 4 + 0 × 2 + 1 × 1). Как калькулятор вычисляет реальную сумму? Он использует логические вентили для сравнения шаблона активных переключателей и вместо этого предлагает новый шаблон переключателей.

    Логический вентиль — это просто простая электрическая схема, которая сравнивает два числа (входные данные) и выдает третье число (выходное значение) в зависимости от значений исходных чисел. Существует четыре очень распространенных типа логических вентилей, называемых ИЛИ, И, НЕ и исключающее ИЛИ.Вентиль ИЛИ имеет два входа (каждый из которых может быть либо 0, либо 1) и выдает на выходе 1, если один из входов (или оба) равен 1; в противном случае он дает ноль. Вентиль И также имеет два входа, но он выдает на выходе 1, только если оба входа равны 1. Вентиль НЕ имеет один вход и инвертирует его, чтобы получить выход. Поэтому, если вы подадите ему ноль, он выдаст 1 (и наоборот). Вентиль XOR дает тот же выход, что и вентиль ИЛИ, но (в отличие от вентиля ИЛИ) отключается, если оба его входа равны одному.

    Полусумматоры и полные сумматоры

    Теперь, если вы соедините разные логические элементы, вы сможете создавать более сложные схемы, называемые сумматорами . Вы вводите в эти схемы два двоичных числа на входе и получаете третье, двоичное число на выходе. Получившееся число является двоичной суммой введенных вами чисел. Таким образом, если вы подадите электрические сигналы 10 и 11, вы получите 101 (2 + 3 = 5). Основным компонентом схемы сумматора является пара логических элементов, работающих параллельно, называемых полусумматорами, которые могут вычислять суммы не более сложными, чем (подождите!) 1 + 1 = 2. Один пример полусумматора выглядит так: это:

    Простая схема полусумматора, состоящая из вентиля XOR и ворота И

    Вы вводите два двоичных числа, которые хотите сложить, в две входные линии A и B. Они «путешествуют» одновременно ко входам двух логических вентилей — вентиля XOR вверху и вентиля AND внизу. Выход вентиля XOR дает сумму двух входов, а выход вентиля AND говорит нам, нужно ли нам передавать 1. Будет яснее, что это значит, если мы рассмотрим четыре возможных вычисления, которые может выполнить полусумматор. :

    <УЛ>
  3. Если A и B оба получают ноль, мы вычисляем сумму 0 + 0 = 0. Логический элемент XOR дает ноль, если оба его входа равны нулю, и то же самое делает вентиль AND. Таким образом, результат нашей суммы равен нулю, а перенос равен нулю.
  4. Если A получает ноль, а B получает единицу, мы вычисляем сумму 0 + 1 = 1. Логический элемент XOR дает единицу, если один из (но не оба) его входных данных равен единице. Логический элемент И дает единицу, только если оба его входа равны единице. Таким образом, результат нашей суммы равен единице, а перенос равен нулю.
  5. Если A получает единицу, а B получает ноль, это точно так же, как и в предыдущем примере: результат нашей суммы равен единице, а перенос равен нулю.
  6. Наконец, если и A, и B получают единицу, мы вычисляем сумму 1 + 1 = 2. Теперь логический элемент XOR дает ноль, а логический элемент AND дает единицу. Таким образом, сумма равна нулю, а перенос равен единице, что означает, что общий результат равен 10 в двоичном формате или 2 в десятичном.
  7. Полусумматоры на самом деле не могут больше, чем это, но если мы соединим еще несколько логических вентилей вместе, мы сможем создать так называемую схему полного сумматора, которая вычисляет более сложные суммы с большими числами. Как работает сумматор? Это выходит за рамки этой вводной статьи, но вы можете найти несколько примеров на веб-страницах ниже.

    Если вы не получаете степень в области электроники или вычислительной техники, все, что вам действительно нужно знать, это то, что сумматор состоит из ряда логических элементов И, ИЛИ и НЕ, содержащихся внутри микросхем, которые соединены вместе. Мы можем использовать другие шаблоны логических элементов для вычитания, умножения (что также может быть выполнено повторным сложением) и других видов вычислений.

    Подробнее

    <УЛ>
  8. Как логические вентили складывают 2+3: красивая диаграмма схемы сумматора от ZByte. [Архивировано с помощью Wayback Machine.]
  9. Adder (электроника): более сложная, более полная, но трудная для понимания статья в Википедии.
  10. Обратите внимание: при написании этой статьи ни один калькулятор не пострадал.

    Читайте также: