Запись – это структура данных, состоящая из фиксированного числа элементов, называемых полями. При этом поля могут быть различных типов.
При выборе элементов применяется конкретное имя, которое дается каждому элементу и не может вычисляться, в отличие от массивов.
Общий вид описания типа «запись»:
Type T = Record
<список полей>
end;
Например:
Type Complex = Record
Re: real;
Im: real;
End;
Здесь Re и Im – имена полей. При наличии этого фрагмента программы в дальнейшем можно вводить переменные комплексного типа, например:
Var X, Y, Z: Complex;
При обращении к компонентам указывается имя переменной – записи, и через сочленяющую точку – имя поля:
X.Re:=5.2; X.Im:=3.1;
Пример подпрограмм арифметики комплексных чисел:
{ Функция сложения двух комплексных чисел }
Function CADD(A,B:Complex):Complex;
Begin
CADD.Re:=A.Re+B.Re;
CADD.Im:=A.Im+B.Im;
End;
{ Функция умножения }
Function CMUL(A,B:Complex):Complex;
Begin
CMUL.Re:=A.Re*B.Re-A.Im*B.Im;
CMUL.Im:=A.Re*B.Im+A.Im*B.Re;
End;
{ Функция деления }
Function CDIV(A,B:Complex):Complex;
Var x:real;
Begin
x:=sqr(B.Re)+sqr(B.Im);
CDIV.Re:=(A.Re*B.Re+A.Im*B.Im)/x;
CDIV.Im:=(B.Re*A.Im-A.Re*B.Im)/x;
End;
Пример вычисления выражения XY+XZ+YZ:
CADD(CMUL(X,Y),CADD(CMUL(X,Z),CMUL(Y,Z)))
В языке Паскаль разрешается использовать тип Record при описании других структур данных и наоборот, например:
{ Формирование одной строки таблицы дней рождения из максимально 100 строк }
Type
Data = Record
D:1..31;
M:string[10];
G:word;
End;
Rec = Record
FIO:string;
Dr:Data;
End;
Var List: array [1..100] of rec;
Begin
Z[1].FIO:=’Иванов Иван Иванович';
Z[1].Dr.D:=5;
Z[1].Dr.M:=’Май’;
Z[1].Dr.G:=’1975’;
…
В записях может использоваться не только фиксированная, но и вариантная часть, следующая за фиксированной (здесь не рассматривается). В итоге полная структура записи следующая.
Type T=Record
<список полей>:<тип>;
…
[Case <признак варианта> of
<список констант выбора>:
(<список полей>:<тип>;
…);]
…
end;
При обращении к некоторым компонентам записей при большом количестве вложений могут получаться весьма длинные имена. Для сокращенной записи составных имен используется оператор With, имеющий следующую структуру:
With <список переменных записи> Do <оператор>;
В качестве переменных записи используются имена полей, определенных при описании данной записи, например:
Begin
…
Z[1].FIO:='Иванов Иван Иванович';
With Z[1].Dr do
Begin
D:=5;
M:=’Май’;
G:=’1975’;
End;
…
Оператор With R1,R2,…,Rn do S; эквивалентен записи
With R1 do
With R2 do
…
With Rn S;
§6.4. Множества
Множество в математике – это произвольный набор объектов, понимаемый как единое целое. Два множества, отличающиеся только порядком следования элементов, считаются одинаковыми, например:
{A, B, C}, {A, C, B}, {B, C, A}
и т.д., то есть элементы множества не упорядочены.
На вид объектов и их число не накладываются никакие ограничения, но в языке Турбо-Паскаль это понятие существенно уже: в качестве базовых типов допускаются дискретные типы не более чем с 256 различными значениями, то есть типы byte, char, boolean, перечисляемый и диапазон.
Описание типа:
Туре <тип_множество> = SET OF <базовый_тип>
Var <список_переменных>: SET OF <базовый_тип>
В качестве констант в этом типе используется изображение или конструктор множества, который строится из списка элементов, заключенных в квадратные скобки. В качестве элементов могут выступать и диапазоны, например:
[Blue, Yellow, Red] или [1,4..8,12,15].
Существует единственное пустое множество, которое принадлежит всем типам множеств и обозначается как [ ].
Пусть есть описание:
Var A, B, C: Set of 0..9;
D, E: Set of '0'..'9';
F, G: Set of Boolean;
Тогда:
A:=[1, 3, 5];
D:=['3', '6'..'9'];
F:=[5, 7]; {неверная строка – «не то» множество}
При использовании диапазонов, если значение первой константы меньше значения второй константы диапазона, то задается пустое множество. Запись [5..3] эквивалентна [ ].
Операции над множествами – обычные из теории множеств и математической логики. Пусть S1 и S2 – однотипные множества, тогда над ними можно выполнять следующие операции.
1. Объединение множеств.
S1+S2 содержит элементы, которые принадлежат либо S1, либо S2, либо и тому и другому:
A:=[1, 2, 3];
B:=[1, 5, 9];
C:=A+B;
что эквивалентно
C:=[1, 2, 3, 5, 9];
2. Пересечение множеств.
S1*S2 содержит элементы, которые принадлежат как S1, так и S2:
A:=[1, 2, 3];
B:=[1, 5, 9];
C:=A*B;
что эквивалентно
C:=[1];
Или выражение
C:=A*[8];
соответствует пустому множеству:
C:=[ ];
3. Относительное дополнение или разность множеств.
S1-S2 содержит элементы из S1, которые не принадлежат S2:
A:=[1, 2, 3];
B:=[1, 5, 9];
C:=A-B;
что эквивалентно
C:=[2, 3];
Или выражение
C:=A-[3..9];
соответствует:
C:=[1, 2 ];
4. Проверка на равенство, неравенство и включение множеств.
S1=S2 тогда и только тогда, когда S1 и S2 содержат одни и те же элементы. В противном случае истинно выражение S1<>S2. S1<=S2 принимает истинное значение, когда все элементы S1 являются элементами S2 (множество S2 включает в себя множество S1). Пусть
A:=[1..5];
B:=[1..5];
C:=[1..6];
Тогда логические выражения примут значения:
A=B — истинно;
А=С — ложно;
B<>C — истинно;
A<=C — истинно (С включает А).
5. Проверка принадлежности множеству (включение во множество).
Эта логическая операция обозначается служебным словом in. Выражение X in S1 истинно, если элемент Х принадлежит множеству S1 и ложно в противном случае:
2 in A — истинно;
9 in A — ложно.
Этот тип данных используется довольно редко, за исключением операции проверки принадлежности к множеству. Например, нажата ли клавиша «p» в любом регистре и алфавите:
If CH in ['p', 'P', 'з', 'З'] then ... {нажата клавиша «р»}
Пример использования множеств
В качестве примера используется программа вычисления нескольких первых простых чисел методом «решета Эратосфена», выполняемого по следующему алгоритму.
-
Поместим все числа между 2 и n в «решето».
-
Выберем и вынем из «решета» наименьшее из оставшихся в нем чисел.
-
Поместим это число среди «простых» чисел.
-
Переберем и вынем из решета все числа, кратные данному.
-
Если решето не пустое, повторим шаги 2-5.
Program Eratosfen;
Const N=255; { Максимально возможное значение }
Var
R, { исходное решето }
Pr { решето с простыми числами - итог }
: Set of 2..N;
i, { счетчик чисел }
j { очередное простое число }
: integer;
Begin
R:=[2..N];
Pr:=[]; { пока в решете с простыми числами ничего нет}
j:=2; { первое простое число }
{ цикл по шагам 2-5}
Repeat
{ поиск очередного простого числа
(первый раз не выполняется ни разу) }
While not (j in R) do
j:=j+1;
Pr:=Pr+[j]; { включение в итог – шаг 3}
i:=j;
Writeln(j:8);
While i<=N do
Begin
R:=R-[i]; { вынимание из решета – шаг 4}
i:=i+j
end;
Until R=[ ]; { повторяем, если решето не пустое }
end.
Достарыңызбен бөлісу: |