Иногда содержимое отдельной записи зависит от значения одного из ее полей.
Такой тип записи содержит общую часть, одинаковую для всех записей, а за ней – вариантную часть, содержание которой зависит от значения одного из полей общей части записи. Вариантная часть может быть только одна и располагаться в конце записи.
<идентификатор записи> : record case [<идентификатор поля>:]<тип поля> of <вариант выбора 1> : (<идентификатор поля> : <тип поля>); <вариант выбора1> : (<идентификатор поля> : <тип поля>); end; Type Figure = (Square, Triangle, Circle); Param = record x, y: integer; Case Fig: Figure of Square: (Side: real); Triangle: (Side1, Side2, Angle:real); Circle: (Radius: real); end;
Вариантная часть начинается словом Case, за которым следует переменная выбора варианта (в примере - Fig) с указанием типа. Эта переменная может быть любого перечисляемого типа. Далее указываются константы, значения которых может принимать переменная выбора варианта. За каждой константой через двоеточие в круглых скобках записываются поля данного варианта записи с указанием их типов. Круглые скобки необходимы, даже если для данного варианта вариантная часть отсутствует. Вариантная часть не завершается операторной скобкой end.
Для всех вариантов отводится общая область памяти, поэтому имеется возможность преобразовывать данные одного типа в другой, однако при неправильном обращении к полю имеется возможность ошибки. Пример (нахождение площади фигур):
varFigures : array[1..100] of record X,Y : real; Vid : integer; case vid:integer of 1: (Side : real); {квадрат} 2: (Side1, Side2 : real){прямоугольник}; 3: (Radius : real); {Окружность} end;Count,i : integer; begin write('Введите количество фигур: '); readln(Count); for i := 1 to Count do with Figures[i] do begin write('Введите координаты и тип фигуры: '); readln(X,Y,Vid); case Vid of 1: begin write('Введите сторону квадрата: '); readln(Side); end; 2: begin write('Введите стороны прямоугольника: '); readln(Side1,Side2); end; 3: begin writeln('Введите радиус окружности'); readln(Radius); end; end; end; for i := 1 to Count do with Figures[i] do case Vid of 1: writeln(i,' - квадрат, S=: ',sqr(Side):0:2); 2: writeln(i,' - прямоугольник, S=: ',Side1*Side2:0:2); 3: writeln(i,' - окружность, S=: ',Pi*sqr(Radius):0:2); end;end.
Для каждого студента группы указаны фамилия и оценки по пяти предметам. Требуется вычислить средний балл и вывести данные о студенте с максимальным средним баллом.
Program p;type student = record FIO : string; ball: array[1..5] of byte; srball:real; end;var group:array[1..100] of student; max:real; i,j,n,k:integer;begin writeln('input n'); readln(n); for i:=1 to n do with group[i] do begin write('fio='); readln(fio); for j:=1 to 5 do begin write('ball ',j,'='); readln(ball[j]); srball:=srball+ball[j] end; srball:=srball/5; end; for i:=1 to n do with group[i] do begin writeln('fio=',fio); for j:=1 to 5 do writeln('ball ',j,'=',ball[j]); writeln('srball=',srball); end; max:=group[1]. srball; for i:=2 to n do with group[i] do if srball>max then begin max:=srball; k:=i; end; writeln('dannie o studente c max srball'); with group[k] do begin writeln('fio=',fio); for j:=1 to 5 do writeln('ball',j,'=',ball[j]); writeln('srball=',srball); end; end.
Множество - это группа однотипных логически связанных друг с другом элементов, объединённая под одним именем, и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Для описания множества используется следующий формат:
<идентификатор> = set of <начало> .. <окончание><идентификатор> = set of (<элемент1> [,<элемент2> ...])<идентификатор> = set of <порядковый тип> // количество элементов <= 256
Элементы, описываемый <начало>, <окончание> должны быть порядкового типа. Количество элементов множества не может превышать 256.
Множества часто используются для проверок установки тех или иных флагов объектов.
Операции с множествами: • + - сложение; результат содержит элементы первого множества, дополненные недостающими элементами второго множества;
— вычитание; результат содержит элементы из первого множества, которые не принадлежат второму;
* - пересечение; результат содержит элементы, общие для обоих множеств;
= - проверка эквивалентности; возвращается True, если множества эквивалентны;
<> - проверка неэквивалентности; возвращается True, если множества неэквивалентны;
<= - проверка вхождения; возвращается True, если первое множество включено во второе;
>= - проверка вхождения; возвращается True, если второе множество включено в первое;
in - проверка принадлежности; возвращается True, если элемент входит в множество;
include(s,i) - включает новый элемент i в множество v;
exclude(s,i) - исключает элемент i из множество V.
Процедуры include и exclude отличаются высокой скоростью выполнения, т.к. оптимизированы на работу с одиночными элементами.
Рассмотрим на примере операции работы с множествами. Пример (выполнение действий с множествами):
var s1,s2,s3,s : set of 0..9; f : boolean; begin s1 := [0..3,6]; {Пример присвоения} s2 := [4,5]; s3 := [3..9]; s := s1+s2; {s = [0..6] - сложение} s := s2+s3; {s = [3..9] - отброс дублирования} s := s1*s3; {s = [3,6] - пересечение} s := s3-s2; {s = [3,6..9] - вычитание} f := s1=s2; {f = False} f := s1<>s2; {f = True} f := s2<=s3; {f = True} f := s1>=s3; {f = False} f := 4 in s1; {f = False} include(s1,4); {s1 = [0..4,6]} exclude(s1,2); {s1 = [0..1,3..4,6]} end.