Общий вид:
type v = record
a: type1
b: type2
……
case n: typen of
c1:(t11: type11;
t12: type12; …);
c2:(t21: type21;
t22: type22; …);
……..
end;
var z: v;
Здесь z – переменная типа v; n – переменная, называемая переключателем; typen – тип переменной n.
Этому же типу должны принадлежать метки c1 и c2. Каждой метке соответствует набор полей t11, …. Эти поля являются компонентами варианта.
Если какой-либо метке c вообще не соответствуют поля, то пишут c…: ( );
Замечания:
Обращение к компоненте z.tij записи z происходит так:
Пример. Пусть необходимо собрать следующие сведения о сотрудниках института: фамилию, дату рождения и, если есть семья, то фамилию и дату рождения супруги (супруга).
Эта информация может быть описана, например, записью person.
Пусть переменная типа kind может иметь одно из значений («женат», «холост»).
kind = (married, single);
person = record
name: string;
datebirth: date;
case yesno: kind of
married: (name1: string; date1: date);
single: ()
end;
Здесь name – строка символов; datebirth – запись, содержащая дату рождения; yesno – переключатель типа kind, который может принимать одно из двух значений: married либо single; name1 – строка символов, содержащая фамилию супруга(и); date1 – запись, содержащая дату рождения; single – пустое поле.
Если персона в браке, то будет присутствовать поле married, если нет – поле single. Паскаль допускает вложение вариантов в типе record.
Замечание. Перед засылкой информации в запись программист должен присвоить переключателю соответствующее значение. В противном случае информация в поле заслана не будет, и система никакой диагностики не выдаст.
Пример.
type kind = (married, single); date = record day: 1..31; month: 1..12; year: integer; end; person = record name: string; datebirth: date; case yesno: kind of married: (name1: string; date1: date); single: () end; var p: person; begin with p do begin yesno := married; name := 'panin'; with datebirth do begin day := 14; month := 5; year := 1962 end; case yesno of married: begin name1 := 'panina'; with date1 do begin day := 30; month := 12; year := 1968 end; end; end; end; with p do write(' ', name); with p.datebirth do writeln(' ', day, '/', month, '/', year); with p do write(' ', name1); with p.date1 do write(' ', day, '/', month, '/', year); readln end.