Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика ЗКМЗКЕ_1курс / Основы алг-ции и прог-ие.doc
Скачиваний:
80
Добавлен:
05.06.2015
Размер:
1.88 Mб
Скачать
    1. Операции над множествами.

  1. * - пересечение множеств (произведение).

Пусть X=[1,2,3,4,7,9], аY=[1,2,3,10,5], тогда при выполнении оператораZ: =X*Y; множествоZсодержит элементы, которые принадлежат как множествуX, так и множествуY, т.е.Z=[1,2,3].

  1. + - объединение множеств (сумма).

Пусть X=[1,2,3,4,7,9], аY=[1,2,3,10,5], тогда при выполнении оператораZ:=X+Y; множествоZсодержит элементы, которые принадлежат либо множествуX, либо множествуY, т.е.Z=[1,2,3,4,5,7,9,10].

  1. - - разность множеств или относительное дополнение.

Пусть X=[1,2,3,4,7,9], аY=[1,2,3,10,5], тогда при выполнении оператораZ: =X-Y; множествоZсодержит элементыX, которые не принадлежат множествуY, т.е.Z=[4,7,9].

  1. = - проверка на равенство.

Если все элементы множества Xявляются элементами множестваY, то результатом выполнения операции будетTRUE, в противном случае –FALSE. ПустьX=[1,2,3,4,7,9], аY=[1,2,3,10,5], тогда при выполнении оператораF: =X=Y;F=FALSE.

5) <> - проверка на неравенство.

Если какие-то элементы множества Xне являются элементами множестваYили наоборот, то результатом выполнения операции будетTRUE, в противном случае –FALSE. ПустьX=[1,2,3,4,7,9], аY=[1,2,3,10,5], тогда при выполнении оператораF:=X<>Y;F=TRUE.

6) >= - проверка на включение.

Если все элементы множества Yявляются элементами множестваX, то результатом выполнения операции будетTRUE, в противном случае –FALSE. ПустьX=[1,2,3,4,7,9], аY=[1,2,3], тогда при выполнении оператораF: =X>=Y;F=TRUE.

7) <= - проверка на включение.

Если все элементы множества Xявляются элементами множестваY, то результатом выполнения операции будетTRUE, в противном случае –FALSE. ПустьX=[1,2,3], аY=[1,2,3,10,5], тогда при выполнении оператораF: =X< =Y;F=TRUE.

8) IN- проверка принадлежности отдельного элемента множеству.

Слева от знака операции записывается выражение того же типа, что и базовый, а справа – множество. Если левый операнд является элементом множества Y, то результатом выполнения операции будетTRUE, в противном случае –FALSE. ПустьA=5, аY=[1,2,3,10,5], тогда при выполнении оператораF: =AINY;F=TRUE.

Отношения > и < для множеств не определены.

Рассмотрим некоторые примеры, в которых используются операции над множествами.

Вводится строка символов. Требуется составить программу, распознающую является ли введенная строка идентификатором.

var

sim:char;

fl:boolean;

s:string[127];

i,l:byte;

begin

readln(s);

l:=length(s);

sim:=s[1];

if not(sim in ['a'..'z']) then fl:=false

else fl:=true;

i:=2;

while(i<=l) and fl do

begin

sim:=s[i];

if not (sim in ['a'..'z','0'..'9','_']) then fl:=false

else i:=i+1

end;

If fl then writeln('идентификатор')

else writeln(' нет ')

end.

Базовым типом множества в данной программе является тип CHAR. Поэтому для выполнения операции проверки принадлежности элемента множеству в правой части также требуется типCHAR. Для выделения символа из строки используется индексирование, т.к. выделение символа с помощью функцииCOPY дает результат типаSTRING, что недопустимо для множеств.

В следующем примере требуется вывести на экран все простые числа из интервала от 2 до 255.

USES CRT;

CONST N=255;

VAR ISX, REZ: SET OF 2..N;

I,J: INTEGER;

BEGIN

CLRSCR;

REZ:=[ ];

ISX:=[2..N];

I:=2;

REPEAT

WHILE NOT(I IN ISX) DO

I:=SUCC(I);

REZ:=REZ+[I];

J:=I;

WHILE J<=N DO

BEGIN

ISX:=ISX-[J];

J:=J+I

END;

UNTIL ISX=[ ];

WRITELN;

FOR I:=1 TO 255 DO

IF I IN REZ THEN

WRITE (‘ ‘,I,’ ‘);

READKEY

END.

В основу программы положен алгоритм, известный под названием «решето Эратосфена», т.е. метод отсеивания составных чисел, при котором последовательно вычеркиваются числа, делящиеся на 2, 3, 5 и т.д.; первое число, остающееся после каждого этапа, является простым и добавляется к результату. Исходное множество в начале программы содержит все натуральные числа от 2 до 255. Результат также является множеством, к которому последовательно добавляются элементы. Условием окончания работы является пустое множество, получившееся вместо исходного.

В следующем примере вводится строка символов. Разделителями будем считать символы «;?,. <>”’». Назовем словом любую последовательность символов, ограниченную с одной или с двух сторон разделителями. Требуется удалить слова, состоящие не более, чем из 2 различных символов. Если таких слов нет, то выдать сообщение.

program delwd;

uses crt;

const r:set of char= [' ',';',',','<','"','''','>','?','.'];

var s,c:string;

i,ns:byte;

f:boolean;

begin

clrscr;

write('s='); readln(s);

i:=1; F:=TRUE;

while i<=length(s) do

begin

if not(s[i] in r) then

begin

ns:=i; c:=’’;

while (i<=length(s)) and

not(s[i] in r) do

begin

if pos(s[i],c)=0 then c:=c+s[i];

inc(i);

end;

if length(c)<=2 then

begin

delete (s,ns,i-ns);

f:=false;

i:=ns-1

end;

end;

i:=i+1

end;

if f then writeln('no')

else writeln(s);

readkey

end.

Во вспомогательную строку С выбираются различные буквы во время прохода по слову. Если длина этой строки оказывается меньше или равна 2, слово нужно удалять. После удаления необходимо скорректировать значение переменной основного цикла для выделения очередного слова.

В следующем примере вводится строка символов. Требуется определить, содержит ли данная строка цифры и выдать сообщение об этом. Распечатать имеющиеся в строке цифры.

program digit;

uses crt;

var

cf:set of 0..9;

s:string;

i,k:byte;

begin

clrscr;

write('s='); readln(s);

cf:=[ ];

i:=1;

while i<=length(s) do

begin

k:=ord(s[i])-ord('0');

if k in [0..9] then cf:=cf+[k];

i:=i+1

end;

if cf=[ ] then writeln('no')

else

begin

for i:=0 to 9 do

if i in cf then write(i:3);

writeln

end;

readkey

end.

Так как цифры имеют последовательные коды, значение самой цифры можно определить, вычитая из кода цифры код цифры 0, что и выполняется в программе. Цифры, обнаруженные в строке, записываются во множество, которое затем выводится на экран.