ПРОСТЕЙШИЙ ВВОД И ВЫВОД
Рассмотрим простейшие процедуры ввода и вывода. По умолчанию ввод осуществляется с клавиатуры, а вывод на экран. К операторам ввода относятся:
Read(<список переменных через запятую>);
Readln(<список переменных>);
Readln;
Второй отличается от первого тем, что после ввода переводит курсор на новую строку, точнее, в конце своей работы считывает с клавиатуры код клавиши <Enter>. Третий оператор используется для организации паузы - выполнение программы продолжится, как правило, только после нажатия на клавиатуре клавиши <Enter>. К операторам вывода относятся:
Write(<список вывода>);
Writeln(<список вывода>);
Writeln;
В списке вывода кроме имен переменных можно писать строковые константы (последовательность символов в апострофах) и даже выражения (выводятся их значения). Второй оператор отличается от первого тем, что после вывода переводит курсор на новую строку. Третий оператор просто переводит курсор на новую строку.
Существует так называемый форматированный вывод. Можно задать количество позиций, отводимых под число. Для целых - после выражения или переменной через двоеточие указывается меньше какого количества позиций не может быть выделено значению. Для вещественных - дополнительно через двоеточие можно указать количество цифр в дробной части. При этом происходит округление в ближнюю сторону.
ПРИМЕР: Простые вычисления.
program vvod_vyvod;
const n=1.5;
var y1,y2:real; x:byte;
begin
writeln('Введите натуральное число <= 255');
readln(x);
y1:=cos(n); y2:=cos(x);
write('Зачем-то посчитали: ');
writeln('n=',n,' y1=',y1:7:4, cos(Pi/2):8:4);
{напечатается
Зачем-то посчитали: n= 1.50000000000000E+0000
y1= 0.0707 1.0000}
writeln('x=',x:3,' y2=',y2:7:4);
end.
Элементарный ввод и вывод
Каждая программа взаимодействует со своим окружением через операторы чтения/записи (рис. 8.1). Для каждого процесса чтения и записи следует указать, откуда и куда осуществляется чтение или запись и как вообще это должно выполняться. Из-за множества существующих в каждом языке программирования возможностей это довольно сложное дело.
Программа |
|
Внешние устройства |
. |
|
дисплей |
чтение <- |
откуда |
клавиатура |
|
сколько |
|
|
как |
печатающее устройство |
запись -> |
куда |
дискета |
• |
|
жесткий диск графопостроитель и пр. |
Рис. 8.1. Связь между программой и внешними устройствами
В Паскале связь программы с внешними устройствами осуществляется через имена файлов. Для нетерпеливых читателей сразу же поясним, что в наиболее простом случае с клавиатуры выполняется ввод данных, а на экран дисплея - вывод. Для ввода с клавиатуры существует имя файла input, а для вывода output. Согласно правилам Паскаля (которые необязательно соблюдаются в Турбо Паскале) в заголовке программы (4-2) распечатывается список имен файлов, с которыми взаимодействует программа. В простейшем случае это выглядит так:
program program_name (input, output);
Ввод
Для ввода с клавиатуры (input) существует процедура read.
Вызов: read(vl,v2,...,vn) процедура Параметры: var vl,v2,...,vn:integer или real или char
или string Действие: Если vi имеет тип
- integer или real, считывается одно число соответствующего формата и значение его присваивается переменной vi.Знаки пробела или перевода строки перед числом игнорируются
- char считывается один символ и присваивается переменной vi.
- string, при длине n строковой переменной vi считывается максимум n символов.
Вызов: readln(vl,v2,...,vn) процедура Параметры: как для read
Действие: как для read с последующим переходом на начало новой строки.
В отличие от других процедур read может иметь переменное число параметров, a readln может не иметь их вовсе. Так для var i,j:integer;
x,y:real;
можно записать
read(i,x) или read(i); read<(x);
readln(i.x) или read(i); read(x); readin;
Тогда с клавиатуры следует ввести одно за другим значения i (например, 123) и х (например, 34.56). Причем числа 123 и 34.56 должны быть разделены по крайней мере одним пробелом. Конец ввода обозначается нажатием клавиши < RETURN >. Введенное число должно завершаться одним пробелом. Для наглядности покажем, как после числа ввести символы:
var a,b:char; i:mteger;
read(i,a,b) Ввод: 123 у
i < - 123 (завершить пробелом)
а <- пробел b <- у
Если хотят подчеркнуть, что чтение осуществляется с помощью input, можно использовать input в качестве первого параметра оператора read, т.е. записать read(input,i,a,b)
При вводе часто хотелось бы указывать, что ввод завершен (а не договариваться о добавлении некоторого специального символа в конце вводимой строки). Для этого имеется стандартная функция eof (= end of file = конец файла).
Вызов: eof Значение функции: boolean
Параметры: нет (возможно input)
Действие: Значение функции всегда false, а при вводе 26
символов в коде ASCII (или при вводе 'Z = Ctri-Z) true.
Вот типичная конструкция, используемая для считывания данных:
while not eof do begin readf) (*что-то считывается*)
(*что-то с этим делается*) end;
Причем и здесь можно писать eof (input) Для того. чтобы определить конец строки, используется функция eoln (= end of line).
Вызов: eoln Значение функции: boolean Параметры: нет (возможно input)
Действие: Значение функции true, если достигнут конец строки, и false в противном случае.
Функция eoln
Вот типичная конструкция, используемая для считывания данных:
while not eoln do begin read() (*что-то
считывается*)
(*что-то с этим делается*) end; ^достигнут конец строки*)
Можно представить себе input как некий буфер, в который записываются введенные с клавиатуры строки. Тогда при вызове read данные берутся из этого буфера ввода. Чтобы определить, остались ли еще в input несчитанные символы, используется функция keypressed.
Вызов: keypressed Значение функции: boolean crt
Параметры: нет
Действие: Значение функции true, если в буфере input не осталось несчитанных символов, и false в противном случае.
Рис. 8.5. Функция keypressed Вот типичная для использования keypressed конструкция:
repeat
(*что-либо делается*) until keypressed;
Может оказаться желательным, чтобы введенные символы не отображались на экране дисплея. Тогда следует воспользоваться функцией readkey, которая считает ровно один символ из input. Введенный символ на экране не высвечивается.
Вызов: Параметры: Действие: |
readkey Значение нет Считывается один символ |
функции: из буфера |
char input |
crt |
Рис. 8.6. Функция readkey
8.3. Вывод
Вывод на экран осуществляется с помощью операторов write или writeln.
Вызов: write (pl,p2,...,pn) процедура Параметры: pl,p2,...,pn:integer или real или boolean или char
или string Действие: Выдается на экран значение pi в стандартной форме
Вызов: writeln(pl.p2....,pn) процедура Параметры: как для write
При использовании приведенных выше форм записи процедур значения параметров write выводятся на экран в стандартном формате. Для Турбо Паскаля этот формат таков:
integer столько разрядов, сколько требуется для записи числа real х.ххххххххххё+-хх (всего 18 разрядов) (х>=0)
-х.ххххххххххЕ+-хх (всего 18 разрядов) (х<0) boolean false или true char или string символ или символы
Формат, отличный от стандартного, можно выбрать следующим образом:
pi:d d - выражение типа integer, задающее ширину поля данных, в которое должно быть записано значение pi (i==l,...,n) с выравниванием по правому краю.
pi:d:s pi (i=l,...,n) имеет тип real. d используется
также, как это было только что описано выше. s -выражение типа integer, задающее число знаков после десятичной точки (но тогда без экспоненты!).
Если задаваемая ширина поля данных d будет выбрана слишком маленькой, d расширяется до нужного числа позиций.
Итак, для
var i,j:integer;
x,y:real;
a,b:char;
равносильно
write(i.x,a) и write(i); write(x); write(a);
writeln(i,x,a) и write(i); write(x); write(a); writein;
В отличие от read, где параметрами должны быть имена переменных, параметрами write, являются выражения, а значит запись
write(2*i,3+5/(x+2).chr(123));
верна. Здесь вычисляется и выдается на экран значение выражения (см. главу 9).
Для начала рекомендуем читателю написать небольшую нро-грамму, в которой будут считываться и сразу же протоколироваться несколько значений различного типа. Следующая программа должна лишь подтолкнуть Вас к написанию собственных программ. Попробуйте модифицировать ее!
Пример :
Опробуйте следующую программу и измените ее так, чтобы понять, как действуют процедуры read и write.
program read_write_versuch;
var i,j: integer; x,y: real; a,b: char;
begin
writein ('1 целое и 1 вещественное значение');
read(i.x); writeln(i:4,x:10:4);
writeln('l целое и 1 вещественное значение');
readln(i.x); writeln(i.x);
writeinf 1 символ и 1 целое число');
readln(b.j);
writeln(j:5,b:3);
writeln('l целое и 2 символа');
readln(i,a,b);
writeln(i:4, a:3, b:3);
end.
Следующий пример показывает, как можно считать и просуммировать некоторое неопределенное количество чисел:
Вводится и суммируется произвольное количество чисел. Ввод завершается нажатием клавиш "Ctrl-Z. если переменная
checkeof из модуля crt установлена на true (стандартная установка false!).
program read_beliebig_viele__Zahlen; {считать произвольное
кол-во чисел} uses crt;
var summe, zahl:integer;
begin checkeof :=true;
summe :=0;
writein ('Задайте несколько целых чисел. Конец ввода по 'Z=eof.');
while not eof do
(*Читать до тех пор, пока eof не примет значения true.*) begin
readln(zahl);
(*Протокол считанных чисел*) writein (zahl: 20);
summe := summe 4- zahl end;
writeln('summe:', summe:6);
end.
Распечатка этой программы показывает, что ввод Z завершает цикл чтения данных.
Пример имеет тот недостаток, что при неверном условии в readln(zahl) происходит прерывание, а значение полученной ранее суммы теряется. Это более чем неприятно. Хотелось бы также, чтобы ввод можно было проигнорировать и повторить заново. Для этого существует стандартная функция ioresult (рис. 8.8) и директивы (*$!-*) и (*$Н-*)(см. приложение D). По умолчанию устанавливается (*$!+*),т.е. установлена директива компилятору "I/O checking On" ("Проверка ввода/вывода вкл.").
Вызов: ioresult Значение функции: word
Параметры: нет
Действие: Значением функции является состояние операции ввода/вывода. Если проверка ввода/вывода отключается, т.е. если имеем (*$!-*). следующие операции ввода/вывода игнорируются, если была вызвана ioresult. Если операция ввода/вывода прошла корректно, значение функции О.