Если фрагмент программы содержит операции над несколькими записями, то в операторе присоединения необходимо указать список переменных записей, разделенных запятыми
Пример.
With a, bd do
Begin
name := ‘Акимов’;
sex := men;
Year : =1900;
Month :=8;
Day :=25;
married := false;
end;
Нельзя использовать в операторах ввода-вывода запись целиком.
Writeln (a); –{ ошибка.}
Присваивать записи можно.
A:=b; { значения полей b в a }
7.3. Записи с вариантами (экономия пространства)
Вариантная запись означает, что разные var, хотя они и относятся к одному типу, могут иметь различные структуры. Записи с вариантами состоят из фиксированной и вариантной частей. Вариантная часть формируется с помощью оператора case .. of и может состоять из нескольких вариантов.
Пример. Анкетные данные содержат информацию о человеке, указав фамилию, дату рождения, а также если это мужчина, то сообщить военнообязанный он или нет, а если женщина – указать семейное положение и количество детей.
Type
Sex (men, wom);
People = record
Fam : string [15]; { array [1…15] of char;}
Dr:birthday;
Case mw : sex of
Men : ( voen:boolen; prof : string [20]);
Wom : ( mar:boolen; childs:integer)
End;
Var
M1,w1 : people;
---------------------------------------------------
With w1,dr do
Begin
Fam := ‘Иванова’;
year := 1980;
month := 12;
day :=1;
Mw:=wom;
mar := true;
childs := 2;
End.
Вариантная часть начинается оператором case и следует за общей частью, после ее окончания в записи не могут появляться никакие другие поля, поэтому case не закрывается служебным словом end.
Ключ выбора (или поле признака, дискриминанта, поле тега (этикетка)) обычно указывает вариант. При определении вариантной записи в стандартном Паскале требуется, чтобы все до одного значения ключа выбора были налицо, т.е. каждому значению был сопоставлен определенный вариант. Следовательно, если описать ключ выбора с типом integer , то пришлось бы описать 65535 вариантов (-32768..32767)
В turbo pascal все иначе.
Пример
Case N: integer of
1,12 : (cartons : integer);
13,144 : (crates : integer);
32000 : (truckboad : integer; datpos : array [1..5] of char)
У N всего пять значений.
Планируя размещение вариантной записи в памяти компьютера, компилятор всегда резервирует пространство, достаточное для самого протяженного из возможных вариантов. Таким образом, все варианты как бы накладываются друг на друга. Поскольку ключ выбора в предложении case … of фактически игнорируется компилятором., требование Паскаля к нему:
· Ключ должен определять некоторый стандартный или предварительно объявленный порядковый тип.
· Перед тем как использовать один из вариантов записи переменной выбора варианта (ключу выбора) следует присвоить соответствующее значение.
Пример использования массива записи
Задача. Программа вводит информацию о 30 студентах:
- фамилия;
- год рождения;
- год поступления в институт;
- оценки последней сессии.
Результат программы – список отличников.
Program zap;
Type
Student = record
Fam : string [15];
Yr : 1900.. 2000;
Yp : 2000...2007;
Marks : record
progr,mathem, engl, ist :1..5;
s:real
End
End;
Const
N=25;
Type
Var
Group : array [1..n] of student;
Person:student;
I,j:integer;
Begin
Writeln;
For i:=1 to n do
With group[i], marks do
Begin
Writeln (‘Введите данные’, I,’-го студента’);
Write (‘Введите фамилию’); Readln (fam);
Writeln (‘Введите год рождения, год поступления, оценки по программированию, математике, английскому, истории’);
Readln (yr,yp,progr,mathem, engl,ist);
End;
Writeln (‘Список отличников’);
For I :=1 to n do
With group[i], marks do
If (progr=5) and (mathem=5) and (engl=5) and (ist=5)
then writeln (fam,yr :6, yp:6)
end.
Пример:
Вывести данные о студентах, фамилии которых начинаются на букву «С» и средний балл у которых >4,5.
For I :=1 to n do
With group[i], marks do
begin
S:=(progr+mathem+engl+ist)/4;
(fam[1]=’C’) and (s>4.5) then
Writeln(fam, yr:6,yp:6)
End;
Пример: Упорядочить список студентов в порядке убывания среднего балла.
For I :=1 to n do
With group[i], marks do
S:=(progr+mathem+engl+ist)/4;
For I :=1 to n-1 do
For J :=i+1 to n do
If group[i].marks.s< group[j].marks.s then
Begin
Person:=group[i];
group[i] :=group[j];
group[j]:= Person
end;
{вывод}
For I :=1 to n do
With group[i], marks do
begin
write(fam);
Writeln(yr,’ ‘, yp,’ ‘, progr,’ ‘,mathem,’ ‘ , engl,’ ‘, ist,’ ‘, s:5:2)
End;
Множества
Понятие множества
Множества в математике – произвольной набор объектов природы, понимаемый как единое целое. На вид объектов и их число не накладывается никаких ограничений. Понятие множества в Т-П несколько уже, чем математическое понятие.
Множества – это наборы однотипных связанных друг с другом объектов. Характер связи между объектами лишь подразумевается программистом, но не контролируется Т-П. Количество элементов, входящих в множество, может меняться 0-255. 1 элемент множества занимает 1 байт.
Множество, не содержащее элементов, называется пустым. Множества отличаются от массивов и записей непостоянным количеством своих элементов.
Нельзя обратиться к элементу множества по его индексу.
Множества используются, когда порядок следования элементов не имеет значения.
Описание типа множества имеет вид:
<имя типа> = set of <базовый тип>;
<имя типа> - правильный идентификатор;
set of - зарезервированные слова (множество ,из);
<базовый тип> - базовый тип элементов множества, используется любой порядковый тип, кроме WORD, INTEGER, LONGINT, SHORINT, т.е. порядковые значения нижней и верхней границы базового типа не должны выходить за пределы 0-255.
Пример
TYPE
Daytype = (mon,tue,wed,thu,fri,sat.sun);
VAR
Washdays,bathdays : set of daytype;
Можно вовсе опустить TYPE
VAR
Washdays,bathdays : set of (mon,tue,wed,thu,fri,sat.sun)
Несколько примеров определения переменных типа множество:
Var
Teaset : set of char;
Letters : set of ‘A’..’Z’;
digits: set of ‘0’..’9’;
dice: set of 2..122;
const
number :set of=[4,7,1,9];
Конструктор множества
Конструктор множества используется для задания множества: список элементов множества перечисляется через (,), обрамляется квадратными скобками.
Пример
Var
town : set of (Moscow, Kiev, Sochi);
S1,S2,S3 : set of ‘0’…’9’
S4,S5,S6 : set of 0…9;
S1=: [‘1’,’2’,’3’];
S2=: [‘3’,’2’,’1’];
S3=: [‘2’,’3’];
S4=: [0…3,6];
S5=: [4,5];
S6=: [3..9];
Переменная town множественного типа может принимать следующие значения:
[Moscow] [Kiev] [Sochi]
[Moscow,Sochi] [Moscow, Kiev] [Kiev, Sochi]
[Moscow, Kiev, Sochi] [ ]
В общем случае, если базовое множество содержит N элементов, производный множественный тип определяет подмножеств. Переменная town может принимать =8 различных значений.
Пример
Множество [‘c’..’a’] является пустым, т.к. в перечислении объектов базового типа порядковый номер ‘c’ > порядкового номера ‘a’.