Задача: Сложить
два числа - 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. Таким
образом, это просто оператор создания паузы в процессе выполнения программы. О
том, зачем нужны паузы, поговорим чуть ниже.
Комментариев нет:
Отправить комментарий