Операторы ввода данных Read и ReadLn
Допустим нам требуется сложить два числа - 20 и 16. Сравним две программы решения этой задачи:
Var a: String;Begina:=20; b:=16;WriteLn(a);End. | Var a,b: Integer;BeginReadLn(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.
Вот схематическое изображение процесса выполнения программы:

На следующее утро, обнаружив, что 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:

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

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

На пустом экране появится сухое число 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 морковок».
Запустим новый вариант программы:

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

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

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

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

Что написали в форму ввода, то дополнительно появится на экране, а уже потом программа продолжит своё выполнение.
Всё, что мы вводим с клавиатуры в форму для ввода, отображается в окне вывода.
Надо запомнить
Пример решения задачи с использованием оператора 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 - Самоучитель
Лукин С.Н.