Ввод-вывод для перечислимых типов.

Не существует стандартного метода чтения/записи значений перечислимых типов при помощи операторов READ/WRITE, такового как для типа CHAR. Для того, чтоб проиллюстрировать как организуется ввод-вывод, будет разработан модуль чтения-записи для перечислимого типа Month, представляющего месяцы года. Этот модуль будет содержать две процедуры ReadMonth и WriteMonth, но не Ввод-вывод для перечислимых типов. будет содержать объявлений данных. Другими словами это чисто вычислительный модуль.

ReadMonth конвертирует три знака в файле открытом для чтения в значение типа Month, если это может быть. К примеру, если последующие три знака ‘J’, ‘A’, ‘N’, тогда ReadMonth возвратит значение Jan типа Month. Но если для 3-х считанных знаков нет Ввод-вывод для перечислимых типов. соответственного значения типа Month, будет сообщено об ошибке. Обычной и нужный метод сообщения об ошибке – расширить тип Month значением NoMonth. Тогда, если три считанных знака не являются сокращенным заглавием месяца, ReadMonth возвращает значение NoMonth.

Объявление типа будет последующим:

TYPE

Month = (NoMonth, Jan, Feb, Mar, Apr, May, Jun,

Jul Ввод-вывод для перечислимых типов., Aug, Sep, Oct, Nov, Dec);

Процедуры модуля будут в главном употребляться для чтения из INPUT и записи в OUTPUT, но дисциплина проектирования модулей просит чтоб в процедуры передавались как характеристики файловые переменные, по другому придется работать с данными за пределами модуля.

PROCEDURE ReadMonth(VAR FIn: TEXT; VAR Mo: Month)

{Fin.3 = R и Ввод-вывод для перечислимых типов. length(Fin.2) >= 3 ->

читать три знака из Fin.2, потом присвоить Mo

соответственное значение типа Month, если это может быть,

по другому присвоить Mo значение NoMonth}

VAR

Ch1,Ch2,Ch3 : CHAR;

BEGIN{ReadMonth}

READ(FIn,Ch1,Ch2,Ch3);

IF (Ch1='J')AND (Ch2='A')AND (Ch3='N') THEN Mo:=JAN ELSE

IF (Ch Ввод-вывод для перечислимых типов.1='F')AND (Ch2='E')AND (Ch3='B') THEN Mo:=FEB ELSE

IF (Ch1='M')AND (Ch2='A')AND (Ch3='R') THEN Mo:=MAR ELSE

IF (Ch1='A')AND (Ch2='P')AND (Ch3='R') THEN Mo:=APR ELSE

IF (Ch1='M')AND (Ch2='A')AND (Ch3='Y') THEN Mo:=MAY ELSE

IF Ввод-вывод для перечислимых типов. (Ch1='J')AND (Ch2='U')AND (Ch3='N') THEN Mo:=JUN ELSE

IF (Ch1='J')AND (Ch2='U')AND (Ch3='L') THEN Mo:=JUL ELSE

IF (Ch1='A')AND (Ch2='U')AND (Ch3='G') THEN Mo:=AUG ELSE

IF (Ch1='S')AND (Ch2='E')AND (Ch3='P') THEN Mo:=SEP ELSE

IF (Ch1='O Ввод-вывод для перечислимых типов.')AND (Ch2='C')AND (Ch3='T') THEN Mo:=OCT ELSE

IF (Ch1='N')AND (Ch2='O')AND (Ch3='V') THEN Mo:=NOV ELSE

IF (Ch1='D')AND (Ch2='E')AND (Ch3='C') THEN Mo:=DEC

ELSE Mo:=NoMonth

END; {ReadMonth}

PROCEDURE WriteMonth(VAR FOut: TEXT; VAR Mo: Month);

{Fin.3 = Ц и Mo NoMonth Ввод-вывод для перечислимых типов. ->

вывести три знака надлежащие значению Mo, в Fout.1}

VAR

Ch1,Ch2,Ch3 : CHAR;

BEGIN {WriteMonth}

IF Mo=JAN THEN WRITE('Jan') ELSE

IF Mo=FEB THEN WRITE('Feb') ELSE

IF Mo=MAR THEN WRITE('Mar') ELSE

IF Mo=APR THEN WRITE('Apr') ELSE

IF Mo=MAY THEN WRITE('May') ELSE

IF Mo=JUN THEN WRITE('Jun Ввод-вывод для перечислимых типов.') ELSE

IF Mo=JUL THEN WRITE('Jul') ELSE

IF Mo=AUG THEN WRITE('Aug') ELSE

IF Mo=SEP THEN WRITE('Sep') ELSE

IF Mo=OCT THEN WRITE('Oct') ELSE

IF Mo=NOV THEN WRITE('Nov') ELSE

IF Mo=DEC THEN WRITE('Dec')

END; {WriteMonth}

Сопоставление дат.

Этот модуль может быть применен для определения календарного порядка Ввод-вывод для перечислимых типов. месяцев, представленных в виде сокращений в INPUT.

DP 1

PROGRAM CalendarOrder(INPUT, OUTPUT);

{Распознать, если может быть два трехсимвольных сокращения

для месяцев и вывести их в календарном порядке.}

TYPE

Month = (NoMonth, Jan, Feb, Mar, Apr, May, Jun,

Jul, Aug, Sep, Oct, Nov, Dec);

VAR

M1, M2: Month;

{включить модуль для Month}

BEGIN {CalendarOrder Ввод-вывод для перечислимых типов.}

ReadMonth(INPUT, M1);

ReadMonth(INPUT, M2);

{Сравнить M1 и M2 и вывести результаты}

END. {CalendarOrder}

После того как оба вызова процедуры ReadMonth будут выполнены M1 и M2 будут содержать значения типа Month, может быть NoMonth. Оставшийся код очевиден:

DP 1.1.

BEGIN {Сравнить M1 и M2 и вывести результаты}

IF (M1 = NoMonth Ввод-вывод для перечислимых типов.) OR (M2 = NoMonth)

THEN

WRITELN(‘Входные данные записаны ошибочно’)

ELSE

IF M1 = M2

THEN

BEGIN

WRITE(‘Оба месяца ’);

WriteMonth(OUTPUT, M1);

WRITELN

END

ELSE

{Сравнить M1 и M2 и вывести результат}

END

DP 1.1.1.

BEGIN {Сравнить M1 и M2 и вывести результат}

WriteMonth(OUTPUT, M1);

IF (M1 < M2)

THEN

WRITE (‘ предшествует ’)

ELSE

WRITE (‘ следует за ’);

WriteMonth(M2);

WRITELN

END

Выполнение:

INPUT: APRJUL

OUTPUT Ввод-вывод для перечислимых типов.: Apr предшествует Jul

INPUT: AprJul

OUTPUT: Входные данные записаны ошибочно

INPUT: JULAPR

OUTPUT: Jul следует за Apr

INPUT: DECDEC

OUTPUT: Оба месяца DEC

Тип BOOLEAN

Логические операции NOT, AND и OR были введены в главе 3. Эти операции работают с значениями типа BOOLEAN из D Pascal. Несколько другим определением синтаксиса логических выражений мы можем специфицировать ассоциативность Ввод-вывод для перечислимых типов. и ценность операций.

Тип BOOLEAN употребляет постоянные значения FALSE и TRUE и операторы NOT, AND, OR и операторы сопоставления. Два постоянных идентификатора типа BOOLEAN работаю как если б они были объявлены в перечислимом типе:

TYPE

BOOLEAN = (FALSE, TRUE);

(Но это объявление не находится очевидно.) Операторы сопоставления определены на операндах типа BOOLEAN Ввод-вывод для перечислимых типов. таким макаром, что значение

FALSE < TRUE

равно TRUE.

NOT – унарный префиксный оператор, а AND и OR – бинарные инфиксные операторы. Функции, вычисляемые AND, OR и NOT, представлены в разделе 3.3.

Паскаль гарантирует порядок, в каком используются операторы, но не для каждого определенного оператора. Многие Паскаль-машины делают «ленивое» (lazy) вычисление логических Ввод-вывод для перечислимых типов. выражений. Если 1-ый операнд для OR имеет значение TRUE, 2-ой операнд не рассчитывается, так как

TRUE OR x = TRUE

для хоть какого x. Аналогично, если 1-ый операнд для AND имеет значение FALSE, 2-ой операнд не рассчитывается, так как все выражение будет FALSE. Этот способ вычисления возвращает корректные значения для выражений, которые в ином Ввод-вывод для перечислимых типов. случае могли бы быть не определены.

Переменные типа BOOLEAN могут быть объявлены, и им может быть присвоено значение, являющееся результатом вычисления логического выражения. К примеру, для данного объявления:

VAR

EndWord: BOOLEAN;

последующее присваивание присваивает EndWord TRUE либо FALSE:

EndWord := (Ch = ‘#’) OR (Ch = ‘ ‘)


vvedenie-v-psihologiyu-truda.html
vvedenie-v-rozigrish-kombinacij.html
vvedenie-v-sintaksis-yazika.html