Паскаль. Операторы ввода данных Read и ReadLn. Интерфейс пользователя

Паскаль. Операторы ввода данных Read и ReadLn. Интерфейс пользователя

Операторы ввода данных Read и ReadLn

Допустим нам требуется сложить два числа - 20 и 16. Сравним две программы решения этой задачи:

Var a: String;
Begin
  a:=20; b:=16;
  WriteLn(a);
End.
Var a,b: Integer;
Begin
   ReadLn(a,b);
   WriteLn(a+b);
End.

Программы отличаются только одной строкой. Первая программа не требует пояснений - она печатает число 36. Во второй программе нигде не сказано, чему равны а и b, а вместо этого включен оператор ReadLn. Поговорим о нем.

ReadLn читается «риадлайн», переводится «ЧИТАЙ СТРОКУ».

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

Таким образом, если первая программа после запуска будет работать без остановки до самого конца и без хлопот выдаст результат, то вторая программа на операторе ReadLn остановится и будет ждать. Во время этого ожидания человек должен на клавиатуре набрать число 20 (так как первым в списке оператора ReadLn стоит а), затем нажать клавишу пробела, затем набрать 16 и нажать клавишу «Enter». Паскаль воспринимает нажатие пробела, как сигнал человека о том, что закончен набор на клавиатуре одного числа и сейчас начнется набор другого. После набора на клавиатуре последнего числа необходимо нажать клавишу «Enter» в знак того, что ввод чисел для данного оператора ReadLn закончен и компьютер может продолжать работу. В соответствии с этим компьютер сразу же после нажатия «Enter» прекращает ожидание и прежде всего направляет число 20 в память, в ячейку а, число же 16 - в ячейку b. На этом он считает выполнение оператора ReadLn законченным и переходит к следующему оператору - WriteLn. В результате будет напечатано число 36.

Таким образом, обе программы делают одно и то же. Зачем же тогда применять ReadLn вместо оператора присваивания? Ведь первая программа понятней, да и работает без остановки. Одна из причин в том, что программа с ReadLn гораздо универсальнее, «свободнее»: если первая программа решает задачу сложения только двух конкретных чисел, то вторая программа складывает два любых числа. Вторая причина в том, что программа с ReadLn позволяет программисту во время написания программы не задумываться над конкретными значениями исходных данных, оставляя эту головную боль на момент выполнения программы. Но самая главная причина в том, что ReadLn позволяет человеку общаться с компьютером, вести с ним диалог во время выполнения программы.

В подтверждение важности первой причины напишем программу для решения следующей задачи:

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

Придумаем имена переменным величинам:

kol_krolКоличество кроликов в зоопарке
kol_slonКоличество слонов в зоопарке
norma_krolСколько морковок в день положено кролику
norma_slonСколько морковок в день положено слону
vsegoСколько всего требуется морковок

А теперь напишем программу:

Var kol_krol, kol_slon, norma_krol, norma_slon, vsego:Integer;
Begin
   norma_krol:=2;
   norma_slon:=100;
   ReadLn(kol_krol);
   kol_slon:=3;
   vsego:= norma_krol * kol_krol + norma_slon * kol_slon;
   WriteLn(vsego);
End.

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

Компьютер, выполнив автоматически первые два оператора (norma_krol:=2 и norma_slon:=100) останавливается на операторе ReadLn. Служитель вводит число 60, после чего компьютер посылает это число в ячейку kol_krol и переходит к выполнению следующего оператора (kol_slon:=3). В конце концов на мониторе появится ответ: 420.

Вот схематическое изображение процесса выполнения программы:

paskal.-operatory-vvoda.-shema-vypolnenija-programmy__

На следующее утро, обнаружив, что 5 кроликов продано другому зоопарку, служитель запускает ту же самую программу, вводит число 55 и получает ответ - 410.

На этом несколько фантастичном примере мы хотели показать, что применение ReadLn позволяет создавать программы, которые, оставаясь приятно неизменными, позволяют легко решать задачу в любое время для любых значений исходных данных. Можно было бы пойти по другому пути - вместо ReadLn использовать оператор присваивания, например kol_krol:=60. Но в этом случае программист каждое утро должен был бы бежать в зоопарк, чтобы исправлять в программе этот оператор присваивания.

Оператор ReadLn можно писать и без скобок, просто так: ReadLn. Выполняя оператор в такой записи, компьютер остановится и будет ждать, но не ввода какой-то информации, а просто нажатия на клавишу «Enter». Таким образом, это просто оператор создания паузы в процессе выполнения программы. О том, зачем нужны паузы, поговорим чуть ниже.

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

Интерфейс пользователя

В большинстве сред программирования (Pascal N-IDE, Turbo Pascal и т.д), при запуске программы появляется чёрный экран, аналог окна вывода PascalABC.NET.

Посмотрим, как будет выглядеть запущенная программа для служителя зоопарка, например, в Pascal N-IDE:

Паскаль. Операторы ввода. Интерфейс пользователя Pascal N-IDE. Курсор

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

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

Давайте введем 60 кроликов:

Паскаль. Операторы ввода. Интерфейс пользователя Pascal N-IDE. 60

Что печатаем на клавиатуре появляется на экране с места, где раньше находился курсор.

Закончив ввод, нажмем «Enter».

Паскаль. Операторы ввода. Интерфейс пользователя Pascal N-IDE. 420

На пустом экране появится сухое число 420. Посторонний человек ни за что не поймет, какой оно имеет смысл: то ли это 420 рублей, то ли 420 зоопарков. Говорят, что у нашей программы неудобный интерфейс пользователя, то есть человеку, использующему нашу программу, неудобно с ней общаться. Слово «интерфейс» можно перевести, как «взаимодействие», в данном случае взаимодействие человека с компьютером.

Дополним чуть-чуть нашу программу, чтобы интерфейс стал более удобным:

Var kol_krol, kol_slon, norma_krol, norma_slon, vsego: Integer;
Begin
  norma_krol:=2;
  norma_slon:=100;
  WriteLn('Введите, пожалуйста, количество кроликов');
  ReadLn(kol_krol);
  kol_slon:=3;
  vsego:= norma_krol * kol_krol + norma_slon * kol_slon;
  WriteLn('Вам всего понадобится ' ,vsego, ' морковок');
End.

Эта программа будет работать точно так же, как и предыдущая, с тем отличием, что во время паузы, вызванной оператором ReadLn(kol_krol), на экране будет гореть удобная надпись – «Введите, пожалуйста, количество кроликов», а результат будет выведен на экран в виде - «Вам всего понадобится 420 морковок».

Запустим новый вариант программы:

Паскаль. Операторы ввода. Интерфейс пользователя Pascal N-IDE. Курсор

Исполним просьбу программы и введём число кроликов.

Паскаль. Операторы ввода. Интерфейс пользователя Pascal N-IDE. 60

Закончив ввод, нажимаем клавишу «Enter». Наблюдаем результат работы программы.

Паскаль. Операторы ввода. Интерфейс пользователя Pascal N-IDE. 420

Выполнив программу до конца, некоторые Паскаль спешит закрыть окно вывода (чёрный экран). Это не совсем удобно. Если добавить перед служебным словом End. пустой оператор ReadLn, то программа будет замирать в конце выполнения, пока не нажмём клавишу «Enter». Следовательно, и окно вывода (чёрный экран) будет отображаться.

Поговорим о среде программирования PascalABC.NET

PascalABC.NET позволяет видеть код программы и окно вывода ОДНОВРЕМЕННО. А чтобы ввести данные с клавиатуры, нужно использовать форму ввода.

Перепишем и запустим программу служителя в PascalABC.NET. Программа также ставится на паузу оператором ReadLn(kol_krol), а затем в окне вывода появляется специальная форма для ввода.

Паскаль. Операторы ввода. Интерфейс пользователя PascalABC.NET. Курсор

Теперь в форму для ввода напечатаем число морковок и нажмём кнопку «Ввести».

Паскаль. Операторы ввода. Интерфейс пользователя PascalABC.NET.420

Что написали в форму ввода, то дополнительно появится на экране, а уже потом программа продолжит своё выполнение.

Всё, что мы вводим с клавиатуры в форму для ввода, отображается в окне вывода.

Надо запомнить
Пример решения задачи с использованием оператора ReadLn

Пользуясь рассмотренным выше операторами Read и Readln, составим программу вычисляющую длину окружности и площадь круга радиусом r.

В задаче дана одна переменная величина – это радиус окружности. Радиус пользователь будет вводить с клавиатуры. Затем мы его подставим в формулы для вычисления длины окружности (l=2πr) и площади круга (S=πr2). Дополнительно позаботимся о пользователе и с помощью оператора write выведем текстовые сообщения. Они подскажут пользователю, когда нужно ввести радиус и что значат числа, напечатанные на экране. Имена переменных возьмём следующие:

r – радиус;
dlina – длина окружности;
S – площадь.

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

Посмотреть текст программы
Var r, dlina, S: Real;
Begin
  Write('Введите радиус окружности: ');
  ReadLn(r);
  dlina:=2*pi*r;
  S:=pi*sqr(r);
  WriteLn('Длина окружности равна: ', dlina:8:2);
  WriteLn('Площадь окружности равна: ', S:8:2);
End.

Задание 1

Написать с использованием интерфейса программы решения задач:

  • Длина одной стороны треугольника равна 20. Длины двух других сторон будут известны только после запуска программы на выполнение. Вычислить периметр треугольника.
  • В компьютер вводятся путь, пройденный телом, и скорость тела. Найти время движения тела.
Константы

Кроме переменных величин в тексте программы мы встречаем константы. Это те значения, которые или присваиваются переменным, или встречаются в выражениях, или сравниваются с выражениями. Например:

x:=25;Числовая константа - 25
slovo:='Волга';Строковая константа - Волга
simvol:= '!';Символьная константа - !
y:=(x+1)/(200*x - 0.3);Числовые константы: 1, 200, 0.3.

Константы в Паскале можно определять и по-другому, но мы пока не будем рассматривать этот способ.

Турбо-Паскаль 7.0 - Самоучитель
Лукин С.Н.