Для ввода-вывода данных в Паскаль-программе применяются предописанные процедуры ввода-вывода Read, Readln, Write, Writeln (Readln - сокращение слов Read Line - читать с новой строки; Write Line - записать строку). Каждая из этих процедур представляет собой некоторую подпрограмму, которая активизируется оператором процедуры. Процедуры ввода-вывода часто называют просто операторами ввода-вывода.
Мы будем рассматривать только ввод с клавиатуры и вывод на экран дисплея. Процедуры ввода-вывода для произвольных файлов будут рассмотрены позже.
Основной процедурой ввода является Read. С ее помощью можно прочитать любое количество исходных данных, указав в скобках идентификаторы переменных, которым нужно присвоить конкретные значения.
Структура обращения к процедуре ввода:
Read( список-ввода ),
где список-ввода - это имена переменных, разделенные между собой запятыми.
Если в программе встречается процедура Read(x), то решение прерывается, и программа ожидает от пользователя набора на клавиатуре значения переменной x и нажатия клавиши Enter.
При наборе с клавиатуры вводимые данные накапливаются в буфере ввода, который представляет собой специально выделенную для этого область памяти. Одновременно набираемые данные высвечиваются на экране дисплея. После нажатия клавиши Enter происходит чтение данных из буфера ввода и присваивание их значений переменным, имена которых записаны в списке ввода. Числа, набираемые с клавиатуры в буфер ввода, должны представлять собой правильные константы и отделяться друг от друга одним или несколькими пробелами.
Пусть в буфер ввода набраны следующие данные:
15.8 -4 73.7 12.9
и после этого нажата клавиша Enter.
Тогда процедура Read(a,b,c,d), где a, b, c, d - переменные типа real, прочтет четыре числа из буфера ввода и присвоит их значения этим переменным.
Написанная выше процедура ввода эквивалентна следующим:
Read(a); Read(b); Read(c); Read(d).
При отработке процедуры Read каждое введенное значение удаляется из буфера.
Предположим, что в буфере ввода после нажатия клавиши Enter содержатся числа
15.8 -4 73.7
Поскольку процедура Read(a,b,c,d) эквивалентна четырем процедурам
Read(a); Read(b); Read(c); Read(d),
то будут выполнены только первые три из них. Программа снова приостанавливает свою работу в ожидании нового заполнения буфера ввода и нажатия клавиши Enter.
Пусть в аналогичной ситуации буфер ввода имеет вид:
15.8 -4 73.7 12.9 -16 65.87
Тогда из буфера будут введены первые 4 числа и программа продолжит свою работу. Если дальше в программе будут встречаться процедуры Read, то оставшиеся в буфере два числа будут введены этими процедурами.
Рассмотренный пример можно проиллюстрировать следующей схемой:
Буфер ввода
.
-
.
.
-
.
Каждое из полей a, b, c, d имеет размер 6 байтов ( a,b,c,d : real). При передаче процедурой Read значения переменной из буфера ввода в поле памяти производится преобразование формы ее представления (из литерного формата, в котором каждый символ занимает один байт, в формат real).
Процедура Readln отличается от Read тем, что после ее выполнения производится переход на новое содержимое буфера ввода. При этом текущее содержимое буфера стирается.
Пусть буфер ввода имеет вид:
15.8 -4 73.7 12.9 -16 65.87
При выполнении процедур
Readln(a,b); Readln(c,d);
из буфера будут введены первые два числа, после чего работа программы приостанавливается в ожидании нового заполнения буфера.
Процедура Readln без параметров производит только сброс буфера ввода и переход к его новому содержимому. В частности, Readln(a,b,c,d) эквивалентна следующим процедурам:
Read(a); Read(b); Read(c); Read(d); Readln.
Для вывода данных используются процедуры Write и Writeln. Процедура Writeln отличается от процедуры Write тем, что после ее выполнения происходит переход на новую строку экрана.
Элементами списка вывода, в отличие от списка ввода, являются выражения. Частным случаем выражения являются константа, имя переменной, функция. В свою очередь частным случаем константы является текстовая константа, т.е. последовательность символов, заключенная в апострофы.
Выводом можно управлять с помощью форматов. Элемент списка вывода может быть записан в форме
v
или v:w
или v:w:d .
Здесь v - выражение, w и d - форматы.
Если указано только выражение v, то количество позиций в строке экрана, отводимое для печати значения v, зависит от типа этого значения.
Для целых переменных отводится столько позиций, сколько цифр содержит значение переменной. Для знака "-" отводится одна позиция перед первой цифрой числа. Для знака "+" никакой позиции не отводится.
Пример 1.
Vari : integer;
l : longint;
Begin
i:=555; l:=123456789;
Write('i=',i); Writeln(' l=',l);
i:=-555; l:=-123456789;
Write('i=',i); Writeln(' l=',l);
Будет отпечатано:
i=555 l=123456789
i=-555 l=-123456789
Для вещественного значения отводится 17 позиций. Число печатается в виде мантиссы и порядка. Длина мантиссы - 11 цифр, из них одна цифра целой части числа.
Пример 2.
Var R : real;
Begin
R:=555; Write('R=',R);
R:=-555; Writeln(' R=',R);
Будет отпечатано:
R= 5.5500000000E+02 R=-5.5500000000E+02
Здесь E -признак десятичного порядка.
Формат w указывает ширину поля (количество позиций, отводимых для изображения значения v).
Пусть n - количество цифр целой переменной, включая знак "-", если он имеется.
Если w > n, то значение v печатается в правой части поля w; если w < n, то для печати значения v отводится n позиций (отсекание "лишних" цифр не производится).
Пример 3.
Vari : integer;
l : longint;
Begin
i:=5555; l:=5555;
Write('i=',i:8); Writeln(' l=',l:2);
i:=-5555; l:=-5555;
Write('i=',i:8); Writeln(' l=',l:2);
Будет отпечатано:
i= 5555 l=5555
i= -5555 l=-5555
Если для вещественной переменной задано значение w > 17, то слева от переменной печатается соответствующее количество пробелов; если w < 17, то соответственно уменьшается количество цифр мантиссы. Минимальное количество цифр мантиссы равно 2, в этом случае значение w < 8 воспринимается как w = 8. Значение мантиссы при печати округляется по последней печатаемой цифре.
Пример 4.
VarR : real;
Begin
R:=555;
Write('R=',R:20); Writeln(' R=',R:17);
Write('R=',R:12); Writeln(' R=',R:8);
Writeln('R=',R:5);
Будет отпечатано:
R= 5.5500000000E+02 R= 5.5500000000E+02
R= 5.55000E+02 R= 5.6E+02
R= 5.6E+02
Формат d применяется только для вещественных значений и означает, что число должно печататься в виде целой и дробной частей, разделенных точкой; при этом значение d указывает, сколько позиций из общего количества w должно быть отведено для печати дробной части числа. Если d = 0, то печатается только целая часть без разделяющей точки. Если поля w недостаточно для печати всех цифр числа, то к значению w добавляется необходимое количество позиций.
Пример 5.
VarR : real;
Begin
R:=123.456789;
Write('R=',R:12:5); Writeln(' R=',R:8:5);
Write('R=',R:8:1); Writeln(' R=',R:8:0);
Writeln('R=',R:8:10);
R:=-123.456789;
Write('R=',R:12:5); Writeln(' R=',R:8:5);
Write('R=',R:8:1); Writeln(' R=',R:8:0);
Writeln('R=',R:8:10);
Будет отпечатано:
R= 123.45679 R=123.45679
R= 123.5 R= 123
R=123.4567890000
R= -123.45679 R=-123.45679
R= -123.5 R= -123
R=-123.4567890000
Если w < 0, то значения числовых переменных, а также переменных типов char, string и boolean записываются в левые позиции поля w. При этом, вне зависимости от значения w, для переменной отводится лишь столько позиций, сколько символов содержит ее значение. Если вещественная переменная записывается в виде мантиссы и порядка, то мантисса округляется до двух цифр.
Пример 6.
Var k : integer;
R : real;
b : boolean;
Begin
k:=125; r:=-32.63; b:=true;
Writeln(k:10,’ 1’);
Writeln(k:-10,’ 1’);
Writeln(k:-1,’ 1’);
Writeln(r:18:4,’ 1’);
Writeln(r:-18:4,’ 1’);
Writeln(r:-1:4,’ 1’);
Writeln(r:28,’ 1’);
Writeln(r:-0,’ 1’);
Writeln(‘0123456789’:20,’ 1’);
Writeln(‘0123456789’:-20,’ 1’);
Writeln(b:20,’ 1’);
Writeln(b:-1,’ 1’);
Будет напечатано:
125 1
125 1
125 1
-32.6300 1
-32.6300 1
-32.6300 1
-3.2630000000E+01 1
-3.3E+01 1
0123456789 1
0123456789 1
TRUE 1
TRUE 1
Примечание. В список ввода могут входить лишь вещественные и целочисленные переменные, а также переменные типа char и string. Следовательно, переменные других типов (массивы, множества и др.) не могут быть непосредственно введены процедурой Read. Косвенная методика ввода таких переменных рассматривается дальше в соответствующих разделах.
В список вывода, кроме типов, перечисленных в списке ввода, могут входить также переменные типа boolean.