Ввод данных: read и readln

Урок учит получать данные от пользователя с клавиатуры командами read и readln.

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

Зачем программе ввод

До сих пор наши программы работали с данными, которые мы сами вписывали в код. Но настоящая программа должна уметь общаться с человеком: спросить число, имя, оценку — и обработать то, что ввёл пользователь. Без ввода программа всегда выдаёт один и тот же результат. С вводом она становится гибкой: одна и та же программа считает площадь любого прямоугольника, переводит любую температуру, проверяет любой пароль. Ввод превращает код из «записки» в настоящий инструмент.

За ввод в Паскале отвечают команды read и readln — близкие родственники вывода write и writeln.

Простейший ввод одного значения

Чтобы прочитать число, нужно объявить переменную и передать её в readln:

var
  age: integer;
begin
  write('Сколько тебе лет? ');
  readln(age);                      // ждём, пока пользователь введёт число
  writeln('Через год тебе будет ', age + 1);
end.

Когда программа доходит до readln(age), она останавливается и ждёт, пока пользователь наберёт что-нибудь и нажмёт Enter. Введённое число попадает в переменную age, и программа продолжает работу. Обратите внимание на хороший приём: перед вводом мы командой write печатаем приглашение — подсказку, что именно ввести. Без неё пользователь увидит пустой экран и растеряется.

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

age = 15   # как будто пользователь ввёл это число
print('Через год тебе будет', age + 1)

Вывод:

Через год тебе будет 16

В настоящем Паскале вместо строки age := 15 стоял бы readln(age), и число пришло бы от пользователя.

Ввод нескольких значений сразу

Одной командой readln можно прочитать сразу несколько переменных — перечислите их через запятую. Пользователь при этом вводит значения через пробел или каждое с новой строки:

var
  a, b: integer;
begin
  write('Введите два числа через пробел: ');
  readln(a, b);
  writeln('Их сумма: ', a + b);
end.

Если пользователь наберёт 10 20 и нажмёт Enter, то a станет равным 10, а b — 20. Паскаль сам разберёт строку по пробелам и разложит числа по переменным в порядке их перечисления.

read и readln: в чём разница

Как и с выводом, у ввода две версии. Разница в том, что происходит с «остатком» введённой строки и переходом на новую строку:

КомандаПоведение
read(x)читает значение, но оставляет курсор на той же строке ввода
readln(x)читает значение и «доедает» остаток строки до конца, переходя к следующей

На практике для школьных задач почти всегда используют readln — он надёжнее и реже даёт сюрпризы. Совет: пока вы новичок, используйте readln. К чистому read прибегают в особых случаях, например при посимвольном чтении. Если ваша программа ведёт себя странно при вводе нескольких строк подряд — скорее всего, виноват read вместо readln.

Полезный приём: пауза в конце

В некоторых средах окно с результатом закрывается мгновенно, и вы не успеваете его прочитать. Чтобы программа дождалась нажатия Enter перед закрытием, в самом конце ставят пустой readln; без переменной — он просто ждёт нажатия клавиши:

begin
  writeln('Результат важен!');
  readln;   // пауза: ждём Enter, чтобы увидеть результат
end.

В PascalABC.NET окно вывода не закрывается само, так что эта строчка там не нужна, но в других средах она спасает.

Собираем программу с вводом

Напишем калькулятор площади прямоугольника. Здесь видно, как ввод делает программу универсальной:

var
  width, height, area: integer;
begin
  write('Ширина: ');
  readln(width);
  write('Высота: ');
  readln(height);
  area := width * height;
  writeln('Площадь прямоугольника: ', area);
end.

Аналог на Python с заранее заданными «введёнными» значениями 6 и 4:

width = 6    # как будто введено пользователем
height = 4   # как будто введено пользователем
area = width * height
print('Площадь прямоугольника:', area)

Вывод:

Площадь прямоугольника: 24

Попробуй сам

Напишите на Паскале программу, которая спрашивает имя (string) и год рождения (integer), а затем печатает «Привет, ИМЯ! В этом году тебе исполнится ВОЗРАСТ лет», вычислив возраст как 2024 минус год рождения. Не забудьте печатать приглашения перед каждым readln. Логику проверьте на Python:

name = 'Кирилл'    # как будто введено
year = 2010        # как будто введено
print('Привет, ' + name + '! В этом году тебе исполнится', 2024 - year, 'лет')

Вывод:

Привет, Кирилл! В этом году тебе исполнится 14 лет

Частые ошибки

  • Забыли приглашение. Без write('...') перед вводом пользователь не понимает, чего от него ждут. Всегда подсказывайте.
  • Тип не совпал с вводом. Если переменная типа integer, а пользователь ввёл буквы или дробь — программа выдаст ошибку ввода. Тип переменной должен соответствовать ожидаемым данным.
  • Использовали переменную до ввода. Сначала readln(x), потом используйте x в вычислениях, не наоборот.
  • Путаница read и readln при нескольких вводах. Если строки ввода «слипаются» или пропускаются, замените read на readln.

Итоги

  • readln(x) останавливает программу и ждёт ввода пользователя, сохраняя значение в переменную x.
  • Перед вводом полезно печатать приглашение командой write.
  • Одним readln можно прочитать несколько переменных через запятую (пользователь вводит их через пробел).
  • Для школьных задач почти всегда используют readln, а не read.
  • Пустой readln; в конце делает паузу, чтобы успеть увидеть результат.
Проверьте себя
1. Что происходит, когда программа доходит до readln(age)?
AПечатает значение age на экран
BОстанавливается и ждёт, пока пользователь введёт значение
CОбнуляет переменную age
DЗавершает программу
2. Зачем перед readln обычно ставят команду write с текстом?
AЧтобы ускорить ввод
BЧтобы напечатать приглашение и подсказать пользователю, что вводить
CЭто обязательное требование синтаксиса
DЧтобы очистить экран
3. Какую команду ввода советуют использовать новичкам в большинстве задач?
Aread
Breadln
Cinput
Dget
Поддержать проект