Оператор INPUT

 

Оператор INPUT позволяет в процессе выполнения программы вводить данные с клавиатуры.

 

Синтаксис:

INPUT[;][<"наводящая строка">;] <список переменных>

 

При достижении оператора INPUT выполнение программы приостанавливается и печатается знак вопроса, который указывает на то, что программа ожидает ввода данных. Если в оператор включена <"наводящая строка">, то она печатается перед знаком вопроса. После этого с клавиатуры производится ввод необходимой информации.

 

INPUT “введите скорость”;V

 

Вместо точки с запятой после <"наводящей строки"> можно использовать запятую, которая подавляет печать вопросительного знака.

INPUT” ввведите время“, Т

Введенные данные присваиваются переменным, заданным в <списке переменных>. Число вводимых элементов данных должно соответствовать числу переменных в списке. Элементы данных разделяются запятыми.

 

INPUT “введите переменные A,B,C,D”,A,B,C,D

В качестве имен переменных в списке могут быть заданы имена числовых и строковых переменных ( включая переменные с индексами). Тип каждого вводимого элемента данных должен соответствовать типу, задаваемому именем переменной. Строковые данные для оператора INPUT не нужно заключать в кавычки.

 

INPUT ”задать число учеников “ ;KOL

INPUT “Введите фамилию ученика” ;FAM$

В случае, если в режиме оператора INPUT было задано меньше или больше данных, чем необходимо, или тип данных неверный (числовые вместо строковых и т.п.), выдается сообщение об ошибке.

 

 

 

 

Оператор PRINT

 

Оператор PRINT предназначен для вывода информации на дисплей.

 

Синтаксис:

PRINT [<список выражений>]

 

В случае, если <список выражений> отсутствует, печатается пустая строка. Если <список выражений> задан, то на дисплее распечатываются значения выражений. Выражения в списке могут быть числовыми и (или) строковыми выражениями. Строки должны быть заключены в кавычки.

Если запятая или точка с запятой стоят в конце списка выражений, то следующий оператор PRINT будет осуществлять печать значений выражений в той же строке, что и предыдущий оператор PRINT.

В операторе PRINT вместо ключевого слова PRINT можно использовать вопросительный знак.

 

X=5

PRINT X+5,X-5,X^5

 

10 0 3125

 

INPUT X

PRINT “результаты вычислений”;X+123;23*x;cos(x);

PRINTsin(x);tan(x)

В этом примере точка с запятой привела к тому, что оба оператора PRINT распечатывают данные в одной строке.

 

Пример:

 

a = 10: b = 3

c = a / b

d# = a / b

PRINT "результат "; c, d#

Пример :

 

PRINT “возведение числа А в степень N “

INPUT “ введите числа A и N”;A;N

PRINT ”число”;A;” в степени “;N;”дает значение”;A^N

 

 

 

Оператор PRINT USING

 

Оператор PRINT USING осуществляет печать строк или чисел в определенном формате.

 

Синтаксис:

 

PRINT USING <строковое выражение>;<список выражений>

 

<Список выражений> состоит из строковых или числовых выражений, которые необходимо вывести на печать, разделенных точками с запятой или запятыми. <Строковое выражение> представляет собой строковую константу (или переменную), которая включает в себя специальные символы задания формата. Эти символы задания формата определяют поле и формат выводимых на печать строк или чисел.

Когда оператор PRINT USING применяется для печати чисел, то для задания формата поля числа используются следующие специальные символы:

- знак номера (#) обозначает позицию каждой цифры. Если выводимое на печать число имеет меньше цифр, чем задано цифровых позиций, то осуществляется правостороннее выравнивание числа в поле (числу будут предшествовать пробелы);

- точка (.) может размещаться в любой позиции поля. В случае, если строка формата указывает на то, что перед десятичной точкой должна находиться цифра, то эта цифра всегда выводится на печать (ноль, если необходимо). В случае необходимости производится округление числа;

- знак плюс (+), помещенный в начале или в конце строки задания формата, указывает на то, что перед или после числа необходимо напечатать его знак (плюс или минус);

- знак минус (-), расположенный в конце поля задания формата, указывает на то, что отрицательные числа должны печататься со знаком минус, расположенным после числа;

- два знака звездочка (**), помещенные в начале строки задания формата, указывают на то, что предшествующие пробелы в поле числа должны быть заполнены звездочками. Кроме того, звездочки резервируют позиции для двух дополнительных символов;

- два знака $$ приводят к тому, что непосредственно перед числом будет напечатан знак $. Эти знаки резервируют место для двух символов, одним из которых является Отрицательные числа могут использоваться только в том случае, если знак минус располагается справа от числа;

- символы **$ в начале строки задания формата приводят к тому, что предшествующие числу пробелы будут заполнены звездочками и перед числом будет напечатан знак $. Символы **$ задают три дополнительные позиции, одну из которых занимает $;

- запятая (,), расположенная слева от десятичной точки в строке задания формата, приводит к тому, что слева от десятичной точки после каждой третьей цифры слева будет печататься запятая. Запятая, расположенная в конце строки задания формата, выводится на печать как часть строки. Запятая задает еще одну цифровую позицию. В случае, если запятая используется вместе с экспоненциальным форматом (^^^^), она игнорируется;

- четыре стрелки вверх (^^^^), размещенные после символов цифровых позиций, используются для задания экспоненциального формата. Четыре стрелки вверх отводят место для печати E+xx.

Если число, которое требуется распечатать, превышает размеры отведенного для него числового поля, то перед числом будет напечатан знак процента (%). В случае, если в результате округления число выходит за пределы числового поля, перед округленным числом также будет напечатан знак процента.

Пример :

 

PRINT USING "##.##";.78

0.78

 

PRINT USING "###.##";987.654

987.65

 

PRINT USING "##.## ";10.2,5.3,66.789,.234

10.20 5.30 66.79 0.23

 

В последнем примере в конце строки задания формата помещены три пробела, которые предназначены для разделения печатаемых значений в строке.

 

PRINT USING "+##.## ";-68.95,2.4,55.6,-.9

-68.95 +2.40 +55.60 -0.90

 

PRINT USING "##.##- ";-68.95,22.449,-7.01

68.95- 22.45 7.01-

 

PRINT USING "**#.# ";12.39,-0.9,765.1

*12.4 *-0.9 765.1

 

PRINT USING "$$###.##";456.78

-$456.78

 

PRINT USING "**$##.##";2.34

***$2.34

 

PRINT USING "####,.##";1234.5

1,234.50

 

PRINT USING "####.##,";1234.5

1234.50,

 

PRINT USING "##.##^^^^";234.56

2.35E+02

 

PRINT USING ".####^^^^-";888888

.8889E+06

 

PRINT USING " !##.## !";12.34

!12.34!

 

PRINT USING "##.##";111.22

%111.22

 

PRINT USING ".##";.999

%1.00

 

Оператор LOCATE

 

Оператор LOCATE перемещает курсор в указанную позицию на экране дисплея.

Синтаксис:

LOCATE [ряд][,[колонка][ где

ряд - номер строки экрана. Целое выражение, значение которого должно быть в диапазоне от 1 до 24;

колонка - номер колонки экрана. Целое выражение, значение которого в зависимости от ширины экрана должно быть в диапазоне от 1 до 40 или от 1 до 80;

Оператор LOCATE перемещает курсор в указанную позицию, а последующие операторы PRINT будут выводить на экран символы, начиная с этого места.

 

CSRL1N

CSRLIN — функция ввода/вывода, возвращающая значение текущей строки, в которой находится курсор

n - CSRLIN

 

POS

POS — функция ввода/вывода, возвращающая номер столбца, в котором находится курсор

POS(0)

 

Пример: использование POS для печати новой строки после того, как введено 40 символов.

CLS

PRINT "Нажмите ESC для завершения '

PRINT

DO

DO WHILE POS(0) < 41 'Оставаться на той же строке, 00 'пока не напечатано 40 символов

СЬаг$ - INKEY$ LOOP WHILE Char$ - " ' Если нажата клавиша ESC, то конец ' Иначе — вывести символ на экран IF ASC(Char$) - 27 THEN END ELSE PRINT Char$;

LOOP PRINT LOOP

 

SPC — функция ввода/вывода, пропускающая п пробелов в текущей строке при выполнении оператора PRINT или LPRINT

SPC(n) - п

• числовое выражение в пределах 0-32767, количество пробелов, пропускаемых в текущей строке

CLS

PRINT 'OVER';SPC(15) 'THERE'

Результат:

OVER THERE

 

TAB — функция ввода/вывода, сдвигающая позицию выво-, да при использовании операторов PRINT или LPRINT

ТАВ(столбец)

столбец — числовое выражение, в пределах от 1 до ширины вывода

Аргумент "столбец" — новая колонка вывода в данной строке. Если текущая колонка больше, чем столбец, то вывод в данную позицию будет произведен уже на другой строке. Если аргумент "столбец" больше, чем ширина вывода, то вывод начнется с позиции, определяемой выражением 1 + (столбец MOD ширина). Если столбец меньше 1, вывод начнется с позиции 1. TAB используется только с операторами PRINT и LPRIN Г.

PRINTTAB(1287), 'one'

PRINT ТАВ(255), 'two-

PRINT TAB(-5), 'three'

PRINT '123456789012345678901234567890' TAB(20) 'four'

 

ПРОСТЕЙШИЙ ВВОД И ВЫВОД

 

Рассмотрим простейшие процедуры ввода и вывода. По умолчанию ввод осуществляется с клавиатуры, а вывод на экран. К операторам ввода относятся:

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. Если операция ввода/вывода прошла корректно, значение функции О.