Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LECPAS42.DOC
Скачиваний:
15
Добавлен:
20.04.2015
Размер:
662.53 Кб
Скачать

Описание типа множество

Понятие множества в языке Pascalосновывается на математическом представлении о множествах как ограниченной совокупности различных элементов. Для построения конкретного множественного типа используется перечисляемый или интервальный тип данных. Тип элементов, составляющих множество, называется базовым типом. Область значений типа множество – набор всевозможных подмножеств, составленных из элементов базового типа. На языкеPascalзначения элементов множества указываются в квадратных скобках: [1,2,3,4], [1..10], ['a','b','c','d'], ['a'..'z'].

если множество не имеет не имеет элементов, оно называется пустым и обозначается как []. Количество элементов множества называется его мощностью.

Множественный тип описывается с помощью служебных слов Set of

(множество из …).

Формат записи множественных типов имеет вид:

type

<имя типа >= setof<элемент1,…, элементN>;

var

<идентификатор,…>:<имя типа>;

Пример Описание переменной множественного типа:

type

М = set of 'A'..'D';

var

MS: M;

Принадлежность переменных к множественному типу может быть определена прямо в разделе описания переменных:

var

c:setof0..7;

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

['A', 'C'] [0, 2, 7] [3, 7, 11..14].

Константа вида [ ] означает пустое подмножество.

Множество включает в себя набор элементов базового типа, все подмножества данного множества, а также пустое подмножество. Если базовый тип, на котором строится множество, имеет К элементов, то число

подмножеств, входящих в это множество, равно 2 в степени К.

Пусть имеется переменная Р интервального типа:

var

P: 1..3;

Эта переменная может принимать три различных значения - либо 1, либо 2, либо 3. Переменная Т множественного типа

var

T:Setof1..3;

может принимать восемь различных значений:

[ ] [1,2]

[1] [1,3]

[2] [2,3]

[3] [1,2,3]

Порядок перечисления элементов базового типа в константах безразличен.

Значение переменной множественного типа может быть задано конструкцией вида [T], где T - переменная базового типа.

Операции над множествами

К множественным величинам применимы операции отношения: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип, например trueилиfalse.

При работе с множествами допускается использование операций объединения(+), пересечения(*) и разности(-) и операции in

Операция "равно"(=). Два множества А и В считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравнивае­мых множествах значения не имеет.

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3]

['a','b','c']

['a'..'z'

[1,2,3]

['c','a']

['z'..'a']

A=B

A=B

A=B

true

false

true

Операция "не равно" (<>). Два множества А и В считаются не равными, если они отличаются по мощности или по значению хотя бы одного элемента.

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3]

['a',..,'z']

['a'..'z'

[1,2,3,4]

['b','x']

['z'..'a']

A<>B

A<>B

A<>B

true

true

false

Операция "больше или равно" (>=).операция "больше или равно" используется для определения принадлежности множеств. Результат операцииA>= В равенtrue, если все элементы множества В содержатся в множестве А. противном случае результат равенfalse.

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

['a',..,'z']

['a','b','z'

[1,2,3]

['b','t']

['z'..'a']

A>=B

A>=B

A>=B

true

true

true

Операция "меньше или равно"( <=). Результат выражения А <= В равенTrue, если все элементы множества А содержатся в множестве В.

В противном случае результат равен false.

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3]

['a',..,'c']

['a','x']

[1,2,3,4]

['z',..,'a']

['a','x','y']

A<=B

A<=B

A<=B

true

true

true

Операция in.Операцияinиспользуется для проверки принадлежности кг либо значения указанному множеству. Обычно применяется в условных операторax.

Значение А

Выражение

Результат

2

'y'

z1

if a [1,2,3] then …

if a in ['a','f'] then …

if a in [x1,x2,y1,y2] theh

true

false

true

При использовании операции inпроверяемое на принадлежим значение и множество в квадратных скобках не обязательно предварительно описывать в деле описаний. Операцияinпозволяет эффективно и наглядно производить сложные проверки условий, заменяя иногда десятки других операций. Например, выражение

if(x=l)or(x=2)or(x=3)then...

можно заменить более коротким выражением

ifxin[ 1. .3]then ...

Иногда операцию inпытаются записать с отрицанием:

Xnot inM.

Такая запись является ошибочной, так как две операции следуют подряд; пра­вильная инструкция имеет вид

not (XinM) .

Объединение множеств(+). Объединением двух множеств является ретье множество, содержащее элементы обоих множеств. Няппимеп"

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

['a',..,'c']

[]

[4,5,6]

['d',..,'k']

[]

A+B

A+B

A+B

[1,2,3,4,5,6]

['a'..'k']

[]

Пересечение множеств(*). Пересечением двух множеств является третье мно­жество, которое содержит элементы, входящие одновременно в оба множества.

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3]

['a',..,'c']

[]

[1,3,4]

['b',..,'l']

[]

A*B

A*B

A*B

[1,3]

[b]

[]

Разность множеств( - ). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество. - |

Например:

Значение А

Значение В

Выражение

Результат

[1,2,3,4]

['a',..,'z']

[a1,a2,a3,a4]

[4,2,1]

['e',..,'z']

[a3,a4]

A-B

A-B

A-B

[2]

['a'..'d']

[a1,a2]

Результат операций над двумя множествами можно наглядно представить с по­мощью закрашенных частей двух кругов.

Использование в программе данных множественного типа предоставляет ряд преимуществ:

упрощаются сложные операторы if,

увеличивается наглядность про­граммы и алгоритма решения задачи,

экономятся память, время компиляции и выполнения.

Отрицательным моментом является то что в языке Pascalотсутствуют средства ввода-вывода элементов множества, поэтому программист сам должен писать соответствующие процедуры.

При использовании в программах данных множественного типа выполнение операций происходит над битовыми строками данных. Каждому значению множественного типа в памяти ЭВМ соответствует один двоичный разряд. Например, множество

['A','B','C','D']

представлено в памяти ЭВМ битовой строкой

1 1 1 1.

Подмножества этого множества представлены строками:

['A','B','D'] 1 1 0 1

['B','C'] 0 1 1 0

['D'] 0 0 0 1

Величины множественного типа не могут быть элементами списка ввода - вывода.

В языке Pascalколичество элементов базового типа, на котором строится множество, ограничено и не превышает 256.

Инициализация величин множественного типа производится с помощью типизированных констант:

const

ret: set of 'a'..'z'= [];

.

Проиллюстрируем применение данных множественного типа на примерах.

Пример . Программа описания множеств и операций над ними, в которой описаны множества чиселD,Dl,D2,D3. Затем они заполнены следующим образом: множествоDl— четными числами 2,4,6,8; множество D2 — числами 0,1,2,3,5; множество D3 — нечетными числами 1,3,5,7,9. После этого над мно­жествами выполнены операции объединения, разности и пересечения.

program Pr ;{Демонстрация операций над множествами}

type

Digits = set of 0..9;

var

Dl, D2, D3, D : Digits;

begin

D1:=[2,4,6,8]; {Заполнение множеств}

D2:=[0..3,5];

D3:=[1,3,5,7,9];

D:=D1 + D2;{Объединение множествDlи D2}

D:=D- D2;{Разность множеств D и D2}

D:==D* Dl;{Пересечение множеств D и Dl}

{Вывод элементов множества}

f or i:=1 to 9 do

begin

if i in D then write (i,' ');

end;

end.

В программе сначала описан тип Digits=set of0..9, затем описаны переменныеD1,D2,D3,Dэтого типа. В первой части программы осуществляется заполнение множеств, а затем над множествами выполняются операции объединения, пересечения, раз­ности.

Пример Программа заполнения множества.

Опишите множество М (1..50). Сделайте его пустым, вводя целые чис­ла с клавиатуры. Заполните множество 10 элементами.

В разделе описания опишем множество целых чисел от 1 до 50, перемен­ную Х целого типа будем использовать для считывания числа-кандидата в множество, це­лую переменную I используем для подсчета количества введенных чисел. В начале программы применим операцию инициализации множества М:= [], так как оно не имеет элементов и является пустым.

Заполнение множества элементами произведем с использованием оператора цикла for, параметр которого будет указывать порядковый номер вводимого элемента. Операцию заполнения множества запишем оператором присваивания М:=М+[Х]. Контроль заполнения множества запишем с использованием операции проверки принадлежности. Если условия ХinMвыполняется, выведем сообщение о том, что число Х помещено в множество.

programPr;

Uses WinCrt;

var

M : set of 1. . 50;

x, i : integer;

begin

M:= []; {M - пустое множество}

for i:= 1 to 10 do

begin

Write('Введите ',i,' - й элемент множества: ');

Readin(x);

if not (x in M) then{Если число не входит в множество М}

begin

Writeln(x, ' помещен в множество 1..50');

М:= М+[x];

end;

end;

Writeln;

{Вывод элементов множества}

f or i:=1 to 50 do

begin

if i in M then write (i,' ');

end;

end.

Пример .Программа и вывода на экран дисплея наборов случайных чисел для игры в "Спортлото 5 из 36". Для заполнения каждой карточки спортлото необходимо получить набор из пяти псевдослучайных чисел. К этим числам предъявляются два требования:

- числа должны находиться в диапазоне 1..36;

- числа не должны повторяться.

Program Lotto;

Uses WinCrt;

var

nb, k: set of 1..36;

kol, l, i, n: Integer;

begin

Randomize;

WriteLn('Введите число наборов');

ReadLn(kol);

nb:=[1..36];

for i:=1 to kol do

begin

k:=[];

for l:=1 to 5 do

begin

repeat

n:=Random(36)

until (n in nb) and not (n in k);

k:=k+[n];

Write(n:4)

end;

WriteLn

end;

end.

Пример . Программа ввода фамилии, имени отчества на русском языке.

В разделе описания переменных опишем множество Lit, включающее в себя всевозможные символы, переменнуюNameдля хранения Ф.И.0.,Chдля посимвольного ввода.

Переменная логического типа Rusбудет указывать, принадлежит ли очередной вводимый символ множеству букв русского языка. Для ввода символов используется стандартная функцииReadKeyчтения кода нажатой клавиши. Текст программы имеет следующий вид:

program FIORus; {Ввод Ф.И.0. только на русском языке)

usesCrt;

var

Lit : set of char;

Name : string ;

Ch : char ;

Rus : boolean;

begin

Lit:=[' ','А' .. 'п','р' .. 'я'];

Write('Введите фамилию, имя, отчество ');

repeat {Считать всю строкуName}

repeat (Считать один символ}

Ch:=ReadKey; {Считать код нажатой клавиши}

if Ch<>#13 then

begin

Rus:=Ch in Lit;

ifrus{Если символ входит в множествоLit}Then

begin

Name:=Name+Ch;{Добавление символа кName}

Write(Ch); {Вывод символа в строке ввода} ;

end;

else{Код клавиши не входит в множествоLit}

begin

Writeln('Переключитесь в русский регистр');

Write('и введите Ваше имя ');

end;

end;

untilRus;{Завершить ввод символа на русском языке}

untilCh=#13; {Завершить ввод строки нажатием клавишиEnter}

Writein;

Writeln('Здравствуйте, ',Name) ;

end.

Вопросы для самопроверки

1. Тип данных множество. Элементы множества.

2. Как задается множественный тип данных.

3. Что такое пустое множество и как оно обозначается?

4. Какие операции допустимы над множествами?

6. Какие множества считаются равными, неравными?

7. Для чего применяются операции отношения ">=", "<=".

8. Для чего применяется операция in? Особенности ее применения.

9.Что называется объединением, пересечением и разностью множеств?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]