Ввод данных: 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;в конце делает паузу, чтобы успеть увидеть результат.