Занятие 12. Процедура ввода и ее формат. Простейший ввод


Задача: Сложить два числа  -    20 и 16.

Сравним две программы решения этой задачи:

VAR a,b : Integer;
BEGIN             
  a:=20;   b:=16;           
  WriteLn (a+b) 
END.
VAR a,b : Integer;
BEGIN 
  ReadLn (a,b);
  WriteLn (a+b)
END.

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

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

Таким образом, если первая программа после запуска будет работать без остановки до самого конца и без хлопот выдаст результат, то вторая программа на операторе ReadLn остановится и будет ждать. Во время этого ожидания человек должен на клавиатуре набрать число 20 (так как первым в списке оператора ReadLn стоит a), затем нажать клавишу пробела, затем набрать 16 и нажать клавишу Enter. Паскаль воспринимает нажатие пробела, как сигнал человека о том, что закончен набор на клавиатуре одного числа и сейчас начнется набор другого. После набора на клавиатуре последнего числа необходимо нажать клавишу Enter  в знак того, что ввод чисел для данного оператора ReadLn закончен  и компьютер может продолжать работу. В соответствии с этим компьютер сразу же после нажатия Enter прекращает ожидание и прежде всего направляет число 20 в память, в ячейку a, число же 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.

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

ПОРЯДОК  ИСПОЛНЕНИЯ ОПЕРАТОРОВ
ЧТО НАХОДИТСЯ В ЯЧЕЙКАХ ПАМЯТИ
kol_krol
kol_slon
norma_krol
norma_slon
vsego
norma_krol:=2 
?
?
2
?
?
norma_slon:=100
?
?
2
100
?
ReadLn (kol_krol)
60
?
2
100
?
kol_slon:=3
60
3
2
100
?
vsego:=norma_krol
60
3
2
100
420
WriteLn (vsego)
60
3
2
100
420

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

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

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

 

Комментариев нет:

Отправить комментарий