Пользователь вводит число с клавиатуры, пишет программу, которая, если задано число

Обновлено: 21.11.2024

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

Чтобы получить ввод с клавиатуры, мы используем команду чтения. Команда чтения принимает ввод с клавиатуры и присваивает его переменной. Вот пример:

Как мы видим, мы отобразили подсказку в строке 3. Обратите внимание, что "-n", указанный в команде echo, заставляет ее удерживать курсор на той же строке; то есть он не выводит перевод строки в конце подсказки.

Затем мы вызываем команду чтения с текстом в качестве аргумента. Это означает, что пользователь ждет, пока пользователь введет что-то, а затем нажмет клавишу Enter, а затем присвоит то, что было введено, переменной text .

Вот скрипт в действии:

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

У команды чтения есть несколько параметров командной строки. Три самых интересных — это -p , -t и -s .

Опция -p позволяет указать подсказку, которая будет предшествовать вводу данных пользователем. Это избавляет от дополнительного шага использования эха для подсказки пользователю. Вот более ранний пример, переписанный с использованием параметра -p:

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

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

Арифметика

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

Что такое целое число? Это означает целые числа, такие как 1, 2, 458, -2859. Это не означает дробные числа, такие как 0,5, 0,333 или 3,1415. Для работы с дробными числами существует отдельная программа под названием bc, которая предоставляет язык вычислений произвольной точности. Его можно использовать в сценариях оболочки, но это выходит за рамки данного руководства.

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

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

Обратите внимание, что пробелы игнорируются:

[me@linuxbox me]$ echo $((2+2)) 4 [me@linuxbox me]$ echo $(( 2+2 )) 4 [me@linuxbox me]$ echo $(( 2 + 2 )) 4

Оболочка может выполнять множество обычных (и не очень) арифметических операций. Вот пример:

Обратите внимание, что начальный символ "$" не требуется для ссылки на переменные внутри арифметического выражения, такого как "first_num + second_num".

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

Первые четыре операции — сложение, вычитание, умножение и деление — легко распознаются, но пятая может быть незнакомой. Символ "%" представляет остаток (также известный как по модулю). Эта операция выполняет деление, но вместо того, чтобы возвращать частное, как при делении, она возвращает остаток. Хотя это может показаться не очень полезным, на самом деле это очень удобно при написании программ. Например, когда операция остатка возвращает ноль, это означает, что первое число точно кратно второму. Это может быть очень удобно:

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

© 2000-2022, William E. Shotts, Jr. Дословное копирование и распространение всей этой статьи разрешено на любом носителе при условии сохранения этого уведомления об авторских правах.

Пользовательские функции

Как следует из названия, эти функции определяются и создаются пользователями. Функции в C++ согласуются с понятием функций в математике. Например, они допускают функциональную композицию, такую ​​как f(f(p),q,f(f)). Однако функции C++ либо возвращают одно значение, либо не возвращают никакого значения. Рассмотрим следующий пример. Это определяемая пользователем функция, которая вычисляет значение факториала небольшого целого числа.

Целочисленная переменная n является входом функции и также называется параметром функции.

Если функция определена после функции main(), то ее прототип должен быть указан int fact (int);

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

Все фрагменты кода, такие как прототип функции, вызывающая основная программа и полное определение функции, показаны ниже

Обычные результаты выполнения этого кода показаны ниже:

Примеры функций
Пример 1

Напишите функцию для определения максимума двух целых чисел x и y. Ответ:

Эта функция принимает на вход два целых числа x и y. Он выбирает x как результат, если x больше, чем y; в противном случае для результата выбирается y.

Пример 2:

Напишите функцию, которая находит максимальное из трех целых чисел x, y и z. Ответ:

Чтобы начать с x, предполагается, что это результат. Затем результат сравнивается с y и z. если y или z больше, чем результат, y или z выбирается для результата соответственно.

Одна и та же функция может состоять из функции max2, как показано ниже:

Этот расчет показывает использование функциональной композиции max(x, y, z) = max(x, max(y,z))

Пример 3

Напишите функцию, которая возвращает количество трехзначных натуральных чисел, которые делятся либо на 4, либо на 5, но не на оба числа.

Ответ: эта функция сначала просматривает все возможности для трехзначных чисел, затем проверяет, делится ли это текущее значение «i» на 4 ИЛИ 5, и в то же время проверяет, не является ли оно двойным подсчетом другого числа. .

Пример 4

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

Ответ: Эта функция проверяет все делители от 2 до n/2 -1 включительно. Он выйдет заранее, если найдет делитель до завершения цикла. Если код завершает цикл, это означает, что число не имеет делителя и, следовательно, является простым числом.

Пример 5

Напишите функцию, которая будет возвращать true, если заданное число является палиндромом, в противном случае она должна возвращать false. Число называется палиндромом, если оно читается одинаково независимо от того, просматривается ли оно слева направо или наоборот. Например, 506605 — это палиндром, а 5123 — нет.

Ответ: Логика палиндрома состоит в том, чтобы перевернуть заданное число n. Это делается циклом while. Заданное число n является палиндромом тогда и только тогда, когда исходное n и его обращение идентичны.

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> и тело цикла никогда не будет выполнено). Лучше использовать стиль, чтобы не использовать ==.

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

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

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

    Ввод в Python

    Для получения информации с клавиатуры Python использует функции input() или raw_input() (подробнее о разнице между ними в следующем разделе). Эти функции имеют необязательный параметр, обычно известный как prompt , который представляет собой строку, которая будет выводиться на экран при каждом вызове функции.

    При вызове одной из функций input() или raw_input() выполнение программы останавливается до тех пор, пока пользователь не введет ввод через командную строку. Чтобы фактически ввести данные, пользователю необходимо нажать клавишу ENTER после ввода строки. При нажатии клавиши ENTER обычно вставляется символ новой строки ("\n"), но в данном случае этого не происходит. Введенная строка будет просто отправлена ​​в приложение.

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

    Сравнение функций input и raw_input

    Разница при использовании этих функций зависит только от используемой версии Python.Для Python 2 функция raw_input() используется для получения строки, введенной пользователем через командную строку, в то время как функция input() фактически оценивает введенную строку и пытается запустить ее как код Python.

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

    Посмотрите на пример функции raw_input в Python 2.

    Вывод

    Аналогично взгляните на пример функции ввода в Python 3.

    Вывод

    С этого момента в этой статье будет использоваться метод ввода из Python 3, если не указано иное.

    Строковый и числовой ввод

    Функция input() по умолчанию преобразует всю полученную информацию в строку. Предыдущий пример, который мы показали, демонстрирует это поведение.

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

    Вывод

    Еще один способ сделать то же самое:

    Здесь мы напрямую сохраняем ввод после немедленного преобразования в переменную.

    Бесплатная электронная книга: Git Essentials

    Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

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

    Обработка исключений ввода

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

    В этом разделе мы продемонстрируем несколько хороших методов обработки ошибок при вводе данных.

    Но сначала вот небезопасный код:

    Предположим, что при запуске этого кода вы вводите следующее:

    Здесь, когда функция int() вызывается со строкой "Three", генерируется исключение ValueError, и программа останавливается и/или аварийно завершает работу.

    Теперь давайте посмотрим, как сделать этот код более безопасным для обработки пользовательского ввода:

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

    Вот пример этого кода, работающего при возникновении исключения:

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

    Полный пример

    Вывод будет таким:

    Заключение

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

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