лабораторные на 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;
Для того, чтобы не выписывать каждый раз имя переменной при обращении к полям переменной типа запись, можно использовать оператор присоединения, имеющий вид