Справочная статья
Оператор INPUT
Значение, которое известно только во время работы программы, приходится спрашивать у пользователя. Для этого служит INPUT: он приостанавливает выполнение, показывает запрос, принимает подтверждённую строку и записывает разобранные из неё значения в заранее объявленные переменные. Число получателей, вид приглашения и строгость разбора задаёт сама запись оператора.
Место ввода и ход выполнения
Программа приостанавливается на время ожидания ответа. Без оператора SCREEN пользователь вводит ответ в консоли IDE. После включения SCREEN, включая текстовый режим SCREEN 0, оператор INPUT работает только в окне этого режима: приглашение и набираемый текст отображаются в окне, а консоль IDE их не дублирует и не принимает ответ. IDE не переводит фокус в свою консоль при таком запросе. После Enter программа продолжает работу, а прежний запрос в интерфейсе закрывается. Оператор CANVAS сам по себе не меняет консольное место ввода оператора INPUT.
Синтаксис
Запись начинается ключевым словом INPUT. Приглашение необязательно и, если оно есть, отделяется от списка получателей точкой с запятой или запятой; получатели перечисляются через запятую. Ниже приведены все допустимые формы.
INPUT <переменная>
INPUT <переменная1>, <переменная2>⟦, <переменнаяN>⟧
INPUT <приглашение> ; <переменная>⟦, <переменнаяN>⟧
INPUT <приглашение> , <переменная>⟦, <переменнаяN>⟧Получатели и приглашение
Получателями служат изменяемые скалярные переменные типов INTEGER, LONG, DOUBLE, DECIMAL, STRING и BOOLEAN. Передайте имена уже объявленных изменяемых переменных; поле записи и элемент массива в синтаксисе получателя не допускаются. Массив целиком не может быть получателем. Фиксированная строка принимает ответ с обычным дополнением или обрезкой до своей ширины.
Приглашение — строковый литерал перед списком переменных, задающий текст запроса. Переменную STRING, соединение строк или другое выражение вместо литерала передать нельзя. Разделитель ; добавляет к тексту ? , разделитель , выводит текст буквально. Это правило приглашения отличается от правил разделителей PRINT.
Без приглашения показывается ? . Точка с запятой добавляет вопрос и пробел даже к строке, которая уже заканчивается вопросом или двоеточием. Пробелы исходного текста сохраняются. Пустой литерал с запятой скрывает приглашение, а с точкой с запятой оставляет ? . В следующем примере запятая выводит подпись как она записана, без дополнительного знака вопроса:
DIM name AS STRING
INPUT "Введите имя: ", name
PRINT "Здравствуйте, "; nameРазбор ответа
Для одной переменной типа STRING ответ сохраняется целиком, включая запятые. Для нескольких переменных запятые разделяют поля, а пробелы по краям полей отбрасываются. Число полей должно точно совпасть с числом получателей. Кавычки не экранируют запятые: каждая запятая в ответе считается разделителем. Этот разбор не является универсальным чтением CSV. Все поля преобразуются до записи получателей; если одно поле ошибочно, прежние значения всех переменных сохраняются.
В ответ на единственный запрос с двумя получателями вводится пара значений через запятую:
DIM name AS STRING
DIM age AS INTEGER
INPUT name, age
PRINT name, ageПри вводе Анна, 42 программа выводит:
Анна 42Запятая разделила ответ на два поля, пробел перед числом был отброшен при разборе, а в выводе между значениями снова появился пробел — его добавил разделитель PRINT.
Числа записываются с точкой как десятичным разделителем независимо от региональных настроек. INTEGER и LONG принимают целую десятичную запись со знаком; DOUBLE допускает десятичную дробь и показатель e или E, но результат должен быть конечным. DECIMAL принимает десятичную запись, включая разделитель групп запятую и знак после числа; показатель степени не поддержан. Разделитель групп запятую можно передать только единственному DECIMAL: при нескольких получателях каждая запятая сначала разделяет поля. Логический ответ — TRUE или FALSE, без учёта регистра. Временной ответ записывается в канонической форме: yyyy-MM-dd для DATE, HH:mm:ss для TIME и yyyy-MM-dd HH:mm:ss для DATETIME; для TIME и DATETIME допускается дробная часть секунд после точки. Региональные формы вроде 29.02.2024 и запись с разделителем T не принимаются: для ввода действует тот же строгий договор, что и для неявного преобразования строки, поэтому текст из другого источника сначала разбирают DATETIMEVALUE или DATEVALUE. Для единственного BOOLEAN пробелы вокруг ответа не удаляются и делают ответ недопустимым; для нескольких получателей края полей очищаются до разбора. Некорректный ответ вызывает ошибку выполнения, а не автоматический повтор приглашения. Если нужен повторный запрос, организуйте его в программе с обработкой ошибки.
Подтверждение и отмена
После Enter следующий запрос начинается на новой строке; дополнительный PRINT между запросами не требуется. Остановка программы во время ожидания отменяет ввод: значения не записываются, пустая строка не подтверждается и инструкции после ввода не выполняются. Такая отмена не является ошибкой MB3003.
Диагностика
MB2001— имя получателя не объявлено.MB2010— получатель является константой.MB3005— получатель имеет неподдержанный тип, например массив, запись или файл.MB3003— число введённых значений не совпадает с числом переменных или введённый текст нельзя преобразовать к требуемому типу.
Правка ответа в окне SCREEN
В нативном окне SCREEN одно нажатие Backspace удаляет последний целый текстовый элемент: обычную букву, символ с объединяемым знаком или emoji. Пара UTF-16 не разделяется, поэтому удаление emoji не оставляет повреждённый символ в результате строкового ввода. Пустая строка остаётся пустой.
Запускаемые примеры
Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.