Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

Множества

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;

Для того, чтобы не выписывать каждый раз имя переменной при обращении к полям переменной типа запись, можно использовать оператор присоединения, имеющий вид