 
        
        лабораторные на Pasca (Кудрявцев)l
.pdf| Множества | 123 | 
| 
 | 
 | 
Операция «равно» (=). Два множества A и B считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет.
| Значение A | Значение B | Выражение | Результат | 
| [1, 2, 3, 4] | [1, 2, 3, 4] | A = B | True | 
| ['a'..'2'] | ['b'..'2'] | A = B | False | 
| ['a'..'2'] | ['2'..'a'] | A = B | True | 
Операция «не равно» (<>). Два множества A и B считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.
| Значение A | Значение B | Выражение | Результат | 
| [1, 2, 3] | [3, 1, 2, 4] | A <> B | True | 
| ['a'..'2'] | ['6'..'2'] | A <> B | True | 
| ['c'..'t'] | ['t'..'c'] | A <> B | False | 
Операция «больше или равно» (>=). Используется для определе- ния принадлежности множества. Результат операции A >= B равен True, если все элементы множества B содержатся во множестве A. В противном случае результатравен False.
| Значение A | Значение B | Выражение | Результат | 
| [1, 2, 3, 4] | [2, 3, 4] | A >= B | True | 
| ['a'..'2'] | ['b'..'t'] | A >= B | True | 
| ['z','x','c'] | ['c','x'] | A >= B | True | 
Операция «меньше или равно» (<=). Используется аналогично предыдущей операции. Результат выражения A <= B равен True, ес- ли все элементы множества A содержатся во множестве B. В про- тивном случае результатравен False.
| Значение A | Значение B | Выражение | Результат | 
| [1, 2, 3] | [1, 2, 3, 4] | A <= B | True | 
| ['a'..'h'] | ['2'..'a'] | A <= B | True | 
| ['a','v'] | ['a','n','v'] | A <= B | True | 
| 124 | Лабораторная работа № 11 | 
| 
 | 
 | 
Операция In. Используется для проверки принадлежности какого- либо значения указанному множеству. Обычно применяется в ус- ловных операциях.
| Значение A | Выражение | Результат | 
| 2 | if A in [1, 2, 3] then... | True | 
| 'v' | if A in ['a'..'n'] then... | False | 
| x1 | if A in [x0, x1, x2, x3] then... | True | 
При использовании операции In проверяемое на принадлежность значение и множество в квадратных скобках не обязательно описы- вать в разделе объявлений.
Операция In позволяет эффективно производить сложные проверки условий, заменяя иногда десятки операций. Например, выражение
if (a=1) or (a=2) or (a=3) or (a=4) or (a=4) or (a=5) then...
можно заменить более коротким
if a In [1..5] then ... .
Часто операцию In пытаются записать с отрицанием: X not In M. Та- кая запись является ошибочной, т. к. две операции следуют подряд: правильная конструкция имеет вид: not (X In M).
Объединение множеств (+). Объединением массивов является третье множество, содержащее элементы обоих множеств.
| Значение A | Значение B | Выражение | Результат | 
| [1, 2, 3] | [1, 4, 5] | A + B | [1, 2, 3, 4, 5] | 
| ['A'..'D'] | ['E'..'Z'] | A + B | ['A'..'Z'] | 
| [ ] | [ ] | A + B | [ ] | 
Пересечение множеств (*). Пересечением двух множеств является
третье множество, которое содержит элементы, входящие одновре- менно в оба множества.
| Значение A | Значение B | Выражение | Результат | 
| [1, 2, 3] | [1, 4, 2, 5] | A*B | [1, 2] | 
| ['A'..'Z'] | ['B'..'R'] | A*B | ['B'..'R'] | 
| [ ] | [ ] | A*B | [ ] | 
| Множества | 125 | 
| 
 | 
 | 
Разность множеств (–). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество.
| 
 | Значение A | Значение B Выражение | Результат | |
| 
 | [1, 2, 3, 4] | [3, 4, 1] | A – B | [2] | 
| 
 | ['a'..'z'] | ['d'..'z'] | A – B | ['a'..'c'] | 
| 
 | СТАРШИНСТВО МНОЖЕСТВЕННЫХ ОПЕРАТОРОВ. | |||
| Приоритетный уровень | Операторы | Операции | ||
| 1 | (высший) | 
 | * | пересечение | 
| 2 | 
 | 
 | +, – | объединение, разность | 
| 3 | (низший) | 
 | =, <>, >=, <=, In | равенство, неравенство, под- | 
| 
 | 
 | 
 | 
 | множество, принадлежность | 
Для изменения порядка выполнения используются круглые скобки.
Средства работы со множествами позволяют в некоторых случаях сократить программы и сделать их более наглядными и эффектив- ными за счет уменьшения числа различных проверок.
Пример 5.
Program Prim 5; Var Stroka: string;
i: integer; Prav: boolean;
Begin i := 1;
writeln('введите строку'); readln(Stroka);
| L := Length(Stroka); | {число введенных символов} | 
| Prav := L > 0; | {True, если не нулевая строка} | 
| while Prav and (i <= L) do | {проверка допустимости символа} | 
| begin | |
| Prav := Stroka[i] In | 
 | 
| ['0'..'9', 'A'..'Z', 'a'..'z', ' ']; | {следующий номер} | 
| i := Succ(i); | |
| end; | 
 | 
| if Prav then writeln('правильная строка') | 
 | 
| else writeln('неправильная строка'); | 
 | 
| End. | 
 | 
| 126 | Лабораторная работа № 11 | 
| 
 | 
 | 
Для вывода элементов некоторого множества, сформированного в процессе выполнения программы, необходимо воспользоваться оператором цикла, внутри которого была бы проверка на принад- лежность текущего значения параметра цикла выводимому множе- ству. Например, для множества ВВ, описанного как ВВ: Set of 'A'..'Z'; можно организовать вывод элементов следующим образом:
Пример 6.
For i := 'A' to 'Z' do
if i in BB then write(i:2);
Причем параметр цикла i должен быть описан либо как символьная переменная, либо как i: 'A'..'Z'. Печать элементов множества произ- водится в том порядке, в котором они встречаются в базовом мно- жестве. Приведенная ниже программа Lat формирует множество LB, в которое входят только заглавные латинские буквы, встретившие- ся во входной строке, и множество знаков препинания PR из вход- ной строки (пример 7).
Пример 7.
Program Lat; Var
c, i, j: char;
LB: Set of 'A'..'Z';
PR: Set of '!'..'?'; Begin
write('=>');
LB := [ ]; PR:= [ ]; repeat
read(c);
if c In ['A'..'Z'] then LB := LB + [C] else
if c In [':', ';', '.', ',', '!', '?'] then PR := PR + [C] until Eoln;
writeln('Латинские буквы:'); for i := 'A' to 'Z' do
if i in LB then write(i:2); writeln;
writeln('Знаки препинания:'); for j := ':' to '?' do
if j in PR then write(j:2); End.
| Множества | 127 | 
| 
 | 
 | 
ВОПРОСЫ И УПРАЖНЕНИЯ
1.Какие типы данных используются в качестве базовых при построении множественных типов?
2.Дано описание переменной множественного типа: Var Pm: Set of (Red, Grey, Blue, Black). Выписать все допустимые значения этой переменной.
3.Какие операции определены над переменными множественного типа и ка- ков их приоритет?
4.Будутли равны множества:
a)['A'..'D'] и ['A','B','C','D'];
b)[White, Black] и [Black, White].
5.Вычислить следующие выражения:
а) [5] <= [1..5];
b)['A'..'D', 'K'..'M'] + ['D'..'K'];
c)[Jan, Feb, Мar]*[Mar];
d)[2, 1, 3..6] = [1..7];
e)15 In [1..10];
f)[',', '(', ')', '.'] – [',', '.'].
6. Вычислить выражение:
[1..14]*[5, 12..60] + [4..7] – [2*16]*[6].
7. Упростить данные выражения множественного типа:
а) [11..17]*[2] + [7, 17..40]*[2..17] – [2..8];
b)(A – B)*A + (A – B)*B;
c)(A + B)*(A – B)*(B – A);
d)A – B – (A – B) – (B – A);
e)A – (A – B).
КОНТРОЛЬНЫЕ ЗАДАНИЯ
I. Дана непустая последовательность символов. Требуется построить и на- печатать множество, элементами которого являются встречающиеся в после- довательности:
1)цифры от '0' до '9';
2)буквы от 'A' до 'F' и от 'X' до 'Z';
3)буквы от 'G' до 'N' и цифры от '0' до '9';
4)знаки препинания;
| 128 | Лабораторная работа № 11 | 
| 
 | 
 | 
5)буквы от 'A' до 'Z' и цифры от '0' до '5';
6)буквы от 'T' до 'X' и знаки препинания;
7)знаки арифметических операций и знаки препинания;
8)цифры и знаки арифметических операций;
9)знаки препинания и буквы от 'E' до 'N'; 10) цифры от '5' до '9' и знаки препинания; 11) знаки операций отношения;
12) цифры от '3' до '9', буквы от 'A' до 'F' и знаки препинания; 13) знаки арифметических операций и операций отношения; 14) буквы от 'F' до 'M' и знаки арифметических операций; 15) знаки препинания и операций отношения;
16) цифры от '0' до '5' и буквы от 'K' до 'R'.
II. Операции над массивами. При выполнении задания следует учесть приемы программирования, использованные в приведенной ниже программе:
Program Eratosphen;
Const
n = 255;
Var
Sieve, Primes: Set of 2..n; Next: byte;
j: word;
Begin
Sieve := [2..n]; Primes := [ ]; Next := 2;
repeat
while not (Next in Sieve) do
Next := Next + 1;
Primes := Primes + [Next]; j := Next;
while j <= n do begin
Sieve := Sieve-[j]; j := j + Next
end;
until Sieve = [ ]; for j := 2 to n do
if j In Primes then Write(j:5)
End.
1. Из множества целых чисел [1..1000] методом решета Эратосфена получить множество простых чисел и вывести их на экран.
| Множества | 129 | 
| 
 | 
 | 
2.Из множества целых чисел [1..1000] получить множество чисел, являю- щихся квадратами четных чисел и вывести их на экран.
3.Из множества целых чисел [1..1000] получить множество чисел, являю- щихся квадратами нечетных чисел и вывести их на экран.
4.Дано целое n от 2 до 1000. Используя метод решета Эратосфена, напеча- тать в убывающем порядке все простые числа из диапазона n..2n.
5.Из множества целых чисел [1..500] методом решета Эратосфена получить множество простых чисел и вывести их на экран.
6.Из множества целых чисел [1..500] получить множество чисел, являющих- ся квадратами четных чисел и вывести их на экран.
7.Из множества целых чисел [1..500] получить множество чисел, являющих- ся квадратами нечетных чисел и вывести их на экран.
8.Дано целое n от 2 до 500. Используя метод решета Эратосфена, напечатать в убывающем порядке все простые числа из диапазона n..2n.
130
Лабораторная работа № 12
ЗАПИСИ
Комбинированный тип характеризует объекты, называемые запи-
сями.
Запись - это сложная переменная с несколькими компонентами, на- зываемыми полями. В отличие от массивов компоненты записи (поля) могут иметь разные типы и доступ к ним осуществляется не по индексу, а по имени поля. При определении комбинированного типа задаются имя и тип каждого поля. Описание комбинированно- го типа начинается со служебного слова Record и заканчивается словом End. После зарезервированного слова Record следует пере- числить все поля записи с указанием через двоеточие их типов. По- ля отделяются друг от друга точкой с запятой (;). Поля записи мо- гут быть любого типа.
| Пример 1. | Пример 2. | 
| Type | Type | 
| Complex = Record | Date = Record | 
| Re:real; | Year: integer; | 
| Im:real | Month: 1..12; | 
| End; | Day: 1..31 | 
| 
 | End; | 
| Var | Var | 
| x,y,z: Complex; | MyBirthday: Date; | 
| Пример 3. | Пример 4. | 
| Type | Type | 
| Person = Record | Complex = Record | 
| Name: string[20]; | Re,Im:Real | 
| Sex: (Male,Female); | End; | 
| Age: integer; | Var | 
| Married: Boolean | x,y,z: Complex; | 
| End; | 
 | 
| Var | 
 | 
| Man: Person; | 
 | 
Если несколько полей записи имеют один и тот же тип, то имена
полей можно перечислить через запятую и затем указать общий
| Записи | 131 | 
| 
 | 
 | 
тип. Так, рассмотренный в примере 1 тип комплексных чисел мож- но ввести и другим образом (см. пример 4).
После введения типа запись можно задать переменные или типизи- рованные константы этого типа. При задании значений константе типа запись поля задаются в круглых скобках через точку с запя- той.
В отличие от констант типа массив для задания значения каждого поля сначала указывается имя поля, а затем через двоеточие – его значение. Так для введенных выше типов можно ввести, например, следующие переменные и константы:
Пример 5.
Var
x, y, z: Complex; Dat, Dat1: Data;
Const
Birthday: Data = (Year:1971; Month:12; Day:9); Ivanov: Person = (Name: 'Иванов';
Sex: Male;
Age: 40; Married: True);
Примечание. Так же, как и при введении типа массив, тип запись
можно вводить непосредственно при определении переменных или типизированных констант. Фрагмент (пример 6) определяет те же комплексные переменные, что и в примере 4.
Пример 6.
Var
x, y, z: Record Re,Im: real
End;
Доступ к полям переменной или константы типа запись осуществ- ляется указанием имени переменной (константы) и имени поля, за- писываемого через точку, например:
Man.Name; MyBirthday.Year; X.Re; MyBirthday.Month; Dat.Day; MyBirthday.Day;
и т.д. Такие имена в программах используются так же, как и пере- менные других типов.
| 132 | Лабораторная работа № 12 | 
| 
 | 
 | 
Использование полей записей. Оператор присваивания заносит в соответствующее поле значение компоненты записи:
Пример 7.
X.Re:= 1.5;
X.Im:= 1.7;
Y.Re:= -X.Re;
Y.Im:= -X.Im; Ivanov.Married:= False;
Значения переменных и констант типа Record можно присваивать другим переменным того же типа, например Dat := Dat1; (см. при- мер 5). Паскаль допускает вложение записей друг в друга, т.е. ком- поненты записи (поля) в свою очередь могут иметь тип запись. Уровень вложения не должен превышать 9.
Пример 8.
Type
Student = Record
Surname: string[25]; Birthday: Record
Day: 1..31;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Ocт, Nov, Dec);
Year: integer End;
Sex: (Male, Female); End;
Var
St: Student;
Group: array[1..30] of Student;
К каждому из компонентов записи можно получить доступ, если указать имя переменной типа Record, затем через точку и имя поля. Для вложенных полей приходится продолжать уточнения:
Пример 9.
St.Birthday.Day:= 25; St.Birthday.Month:= Feb; St.Birthday.Year:= 1977;
Для того, чтобы не выписывать каждый раз имя переменной при обращении к полям переменной типа запись, можно использовать оператор присоединения, имеющий вид
