К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя (1109480), страница 11
Текст из файла (страница 11)
Перед списком находятся одна или несколько констант, а перед всей группой списков стоит заголовок варианта, где указывается тип этих констант (т. е. тнп, на основании значений которого мы различаем варианты). а! Г аанант Р н с. 7.5. Еннтакснческая диаграмма дая Вариантной чисти Р н г. 7ХФ Енитакснчсская анаграмма д.а Вириинти Предположим, что есть, например, такое описание: 1уре Мап1а!Яа(из = (Магг(ео, %Ыотиес), Рлуогсег), Япд!е) В этом случае человека можно описать с помощью данных следующего типа: Фуре Регаоп = гесого здесь поля общие для всех Регеоп сазе ИагтФа1$ФаФиз о( Иагг1ед: ( ( полятолько для семейных ) ). 31ад1е: ( ( полятолько для одиноких ) ); еяд Обратите внимание, что каждому значению, относящемуся к типу, на основании которого идет различение вариантов (типу признака), должен соответствовать один из вариантов.
(Это означает, что перед вариантами должны появляться все значения типа 80 Руководство олл пользователя признака.) Скажем, в нашем примере, кроме констант МагНед и Япд!е, должны появиться и константы Ъ(оохиед и Р!уогсег). Обычно некоторая компонента (поле) записи сама указывает, о каком варианте идет речь. Например, в приведенном выше описании типа следовало бы иметь общее для всех вариантов поле. МБ: Маг)(а!Яа(пз Это частная ситуация, и для нее существует сокращение: описание определяющей вариант компоненты, называемой полем признака, включается в сам заголовок варианта. Например: сазе МВ: Маг(!а1Яа!нз о! Прежде чем начать определять структуру записи с вариантами; соответствующую, например, типу Регзоп, полезно бывает «выписать» всю необходимую информацию.
1. Человек А. Имя (пагпе) — первое, последнее (!(гз(, 1аз!) В. Рост (Ье(иЬ() — целое число С. Пол (зех) муж., жен (гпа!е, !егпа1е) Р. Дата рождения (ба(а о! Ь1г(Ь) — год, месяц, день (уеаг, гпоп(Ь, свау) Е. Число иждивенцев (дерепбеп(з) — целое число Г.
Семейное положение (гпагйа! з(а!пз): если в браке (гпагг(ес)) или вдов (хви)ох»ей): а) дата свадьбы (да(е о! гпагг(аае) — год„месяц, день (уеаг, гпопи1, свау) если разведен (б(уогсеб): а) дата развода (да!е о! б(чогсе) — год, месяц, день (уеаг, гпоп(Ь, дау) б) первый развод (!)гз( б)вогсе) — нет, да (!а!зе, !гпе) если одинокий (з!пи1е) На рис. 7.7 приведены «образы» двух «простых» людей с различными атрибутами.
Э (в) [ 3 (с) ( З ((у) ~ З (н) С ( Р и с. 7.7. !(Риисср описания двух людей у. Записные типы 81 Теперь определение записного типа Регьоп можно сформулировать так: Суре Зсг(пВ15 = расхеб аггау [1..151 о1 СЬаг; ЗСасив = (Магг1еб, И(боиеб, 0(иогсеб, З(пВ1е); Оасе = расйеб гесагб Уеаг.; 1900..2100; Ио: (Лап, ГеЬ, Иаг, йрг, Мау, бнп, бн1, йнй, Зер; Осс, йан, Оес); Оау: 1..31; епб; Иасига1 = О..Мах1пС; Регвоп = гесогб йаае: гесогб Г1гвс, Савс: ЗСг!пВ15 епб; Не(ВЬС: Иасига1 ( сепС(аеСегв ); Зех: (Ма1е, Гееа1е); В1гСЬ: Васе; Оербсв: йаснга1 сазе МЗ: Зсаенв а( Магг(еб, И(баиеб: (ИОасе: ОаСе); 0(иогсеб: (00аСе: Оасе; ГсгвСО: Воо1еап); З(пй1е: () епб ( Регзап ); Замечания.
1. Все имена полей должны быть различными, даже если они встречаются в разных вариантах. 2. Если вариант пустой (т. е. поля нет), то он записывается так: С:(). 3. Любой список полей может иметь только одну вариантную часть, которая должна следовать за фиксированной частью записи. 4. Каждый вариант может содержать в себе вариантную часть, следовательно, допускаются вложенные варианты. б. Область действия имен констант перечисляемого типа, вводимых в записном типе, расширяется на вложенные блоки. При обращении к компонентам записи их имена, по существу, представляют простую линейную последовательность всех имен, Если, например, Р— переменная типа Регзоп, то второй, приведенный на рис.
7.7 «образ» порождается такими присваиваниями: 88 Руководство ден аоеевовате.ее Р.йово.ЕааЬ:= ейпгосовЬ Р.йово.Р1гаЬ := 'й1111ав Р.НЕ18ЬС := 186; Р.бах := Ма1а; Р.В1гЬЬ.Уааг := 1951; Р.В1гсп.йо := 5ор; Р.В1гЬЬ.Вау:= 12; Р.Вордоа:= 1; Р.М5 := 51п81а; 7.3. ОПЕРАТОР ПРИСОЕДИНЕНИЯ .Приведенные выше действия, возможно, немного «утомительны», и вы можете сократить нх, обратившись к оператору присоединения.
Фактически такой оператор открывает область действия, содер1кащую имена полей указанной переменной-записи, так что теперь эти имена могут фигурировать как имена обычных переменных. (~ем самым и транслятору дается возможность оптимизировать уточненный (с)па(1йео)) оператор). Оператор строится по такой схеме: Р и с. 7.8. Синтаксическая диаграмма дия Оператора присоединена» Внутри оператора, входящего в оператор присоединения, поля переменной-записи обозначаются с помощью только имен полей (имя переменной-записи перед ними не указывается).
Приведенный ниже оператор присоединения эквивалентен всей серии предыдущих присваиваний. и1ЬЬ Р до Ьо81п и1ЬЬ йаво до Ьо81п Ьааб := 'НЬ1ЬсовЬ Р1гаЬ := 'Н1111ав опд; На18ЬЬ : 188; 7. Записном гипь~ йз 5ех:= Ма1е; нгСЬ 9[гСЛ 6о Ье91п Уеаг := 1951; Мо := 5ер; Оау:= 12 еп6; переса:= 1; М5:= 51п91е; еп6 Аналогично фрагмент: уаг СоггепСРасе: ОаСе; нгСЬ СоггепеааСе 6о Н Ма = Оес СЛеп Ьеа[п Мо : Зап; Уеаг := Уеаг + 1 еп6 е1ее Мо:= посс(Мо) эквивалентен: оаг СоггепСРаСе: Расе 11 СоггепСРасе.Мо = Рес СЛеп Ьеа!и СоггепСРасе.ио := 3ап; СоггепСОасе.теаг := СоггепСОасе.теаг + 1 еп6 е1ее СоггепСОаСе.Мо := посс(СоггепСОасе.Мо) Пример с вакцинацией теперь может быть записан так: н[СЛ расс)паС[опОасе[СЛ1163) 6о Ье91п Уеаг:= 1973, 'Мо:= Арг; Рау:= 23 еп6 При выполнении оператора присоединения ссылки на переменную-запись устанавливаются еще до выполнения внутреннего оператора.
Поэтому выполняемые внутри его какие-либо присваивания элементам списка переменных-записей не будут изменять выделенную заранее запись. Например; наг ппо: Гаа11уМеаЬег ИЛо:= ГаСЛег; и(СЛ расс(пас(опОаСе[ИЛо) 6о Ьеа(п 'пЛо := МоСЛег; Мо:= 3о1; Оау:= 7; Уеаг:= 1947 еп6 84 Руководство длл пользователя Оператор присоединения установит поле Ъ'асс!па1!оп11а1е 1Ра1- йег] . Вложенные операторы присоединения допускают сокращенную запись.
Оператор такого вида ху11И К!, К2, ..., Кп с!о Б зквивалеитен: и!ЬЬ 81 до и!ЬЬ 82 до и!СЬ Вп дв 3 Таким образом, предыдущий пример с определением человека Р можно переписать следующим образом: игЬЬ Р, Иаае, В!гЬЬ до Ьек!п Еаза ;= 'ИЬ!СсоеЬ А!гас := 'И!111аа Не!ВЬЬ := 186; Зех := Иа1е; аеас := 1851; Ие := Зер; Рау := 12; Рердса;= 1; ИЗ := 3!п81е; епд ( и11Ь ) А теперь рассмотрим пример, иллюстрирующий правило областей действия для имен полей.
Хотя описания: еаг А: аггау 12..81 о! 1псекег; А: 2..8; недопустимы, так как определение А двусмысленно, тем ие менее описание: хат А: 1псезег; В: гесагд А: Кеа1; В: Вее1еап епд; вполне корректно, поскольку обозначение для целого А легко отличить от обозначения для вещественного В.А. Аналогично и переменная-запись В легко отличается от логического В.В. Внутри уточнениого оператора В из в11п В бо Б имена А и В теперь соответственно обозначают компоненты В.А и В.В, а целая переменная с именем А недоступна.
МНОЖЕСТВЕННЪ|Е ТИПЫ Множественные типы обеспечивают компактную структуру, в которой сохраняется информация о группах значений, относящихся к ординальному типу; можно узнать„есть ли элемент в группе и какова комбинация этих элементов. Более точно множественный тип определяет множество значений, которое представляет собою множество-степень базового типа, т. е. множество всех подмножеств базового типа, включая и пустое множество.
Поэтому одиночное значение множественного типа есть множество, причем элементы этого множества — элементы базового типа. Множество — структура со случайным доступом„все ее элементы относятся к одному базовому типу, который должен быть ординальным типом*. Р и с. 8рн Синтаксическая диаграмма для Мнсосестаенного тило Для полных значений-множеств применяются такие операции: присваивания, традиционные операции над множествами (например, объединение), проверка на равенство и выборка компоненты, позволяющая проверить присутствие элемента в множестве (см.
ниже). Реализация Паскаля обычно определяет предельный Размер множеств, причем он может быть достаточно небольшим (например, число разрядов в «слове» машины). Этот предел непосредственно связан с диапазоном значений базового типа данного множественного типа. Последнее выскакивание не имеет смысла, так как достуяа к отлельиым клементам множества нет, Онн даже аначення не имеют.
— Примеч. пер. 86 Руководство для пользователя 8 1. КОНСТРУКТОРЫ МНОЖЕСТВ ! Множественное значение можно задать с помощью конструктора множества, в котором содержатся описания элементов множества, отделенные друг от друга запятыми и заключенные в квадратные скобки. Описанием элемента может быть выражение, значение которого и есть элемент, или диапазон вида !ото.:11!уй, где'значения выражений !ож и !пд!т представляют собою нижнюю и верхнюю границы группы элементов.
Если нижняя граница больше верхней границы группы (т. е. !оти !т1д!т), то никакой элемент не описывается. Все выражения должны относиться к одному ординальному типу, представляющему собой базовый тип для множественного типа данного конструктора. Конструктор множества ~] обозначает пустое множество для любого множественного типа. В конструкторе множества нет полной информации о типе (см. [10)), например, такой как, упаковано множество или нет. Поэтому тип конструктора множества одновременно относится и к упакованному, и неупакованному и выбирается так, чтобы быть совместимым с другими множествами в данном множественном выражении.
Р и с. 8лв Синтаксимеская диаграмма Иля Конструктора множества Примеры конструкторов множеств: 113! 0+1 з! 8. Множественные типы В? Вта ОПЕРАЦИИ НАД )ЫНОЖЕСТВАМИ Если Х вЂ” переменная-множество„а Š— множественное выражение, то присванвание: Х:= Е допустимо только в том случае, есри все элементы Е относятся к базовому типу Х, и, кроме того, типы Х и Е либо оба упаКованы, либо не упакованы. К любым объектам со структурой множества применимы такие операции, Если предположить, что А и В— выражения одного типа, то: А+В А'В А — В множество нз элементов А н В (объеднненне) множество обшад длн А н В элементов (пересеченне) множество элементов А, не входнщнх в В (разносп) вхожденне в множество; результат 1гпе, если е элемент А, иначе— !а1зе равенство множестп неравенство множеств включение; результат (гпе, если А в собственное ' нлн несоб- ственное подмножество В включение; результат !гпе, если  — собственное нлн несобствен- ное подмножество А е !пА А=В А(~ В Л<= В А>=В Примеры описаний: зуре Рг1аагу = (йеб, Уе11он, 81пе); Со!ог = зет о( Рг[аагу; таг Нне1, Нне2: Со1ог; Чоне!з, Сопзепапзз, Сепзегз: зеЗ о! Сваг; Орсебе: зез о( О..У; А66: Воо1еап; Срп Спас; Примеры присваиваний: Нне1:= [йеб); Нне2 := [); Нне2 := Нне2 + [зосс(йеб)) К множественным операндам применимы пять операций отношения.