Описание. Основные свойства. Задачи

Download Report

Transcript Описание. Основные свойства. Задачи

МНОЖЕСТВА
ОПРЕДЕЛЕНИЕ
Множество – это набор однотипных
объектов.
Характер связей между объектами
подразумевается программистом и никак
не контролируется Паскалем.
Количество элементов множества может
меняться от 0 до 256. Переменностью
количества элементов множества
отличаются от массивов и записей.
ОПРЕДЕЛЕНИЯ
1. Множество, не содержащее элементов,
называется пустым.
2. Два множества эквивалентны, если они
состоят из одинаковых элементов,
причем порядок следования элементов в
множествах безразличен.
3. Если все элементы одного множества
входят в другое, то говорят о включении
множества. Пустое множество включено
в любое.
Описание множества
Type
<имя типа>=set of <базовый тип>;
В качестве базового типа может использоваться
любой порядковый тип, кроме integer, word, longint,
что определяется слабой мощностью множества. В
качестве базового типа могут использоваться только
диапазоны значений этих типов.
Пример:
type scif=set of ‘0’..’9’;
cif=set of 0..9;
var
s1,s2,s3:scif;
s4,s5,s6:cif;
Множественный тип можно определить и непосредственно при
объявлении переменных программы, например:
VAR number: set of 1 .. 31; {переменная- множество целых
чисел от 1 до 31}
cif: set of 0..9 ;{переменная – множество цифр}
kods: set of #0..#255; {переменная – множество кодов
таблицы ASCII}
ИНИЦИАЛИЗАЦИЯ МНОЖЕСТВ
Возможна инициализация переменных множественного типа с
использованием типизированных констант. Например:
TYPE setnum=set of byte;
Const S:setnum[1..10]; {S - инициализированная
переменная, её исходное
значение в программе
равно множеству,
включающему целые
числа от 1 до 10}
Конструктор множества
Используется для создания множества.
Представляет собой список элементов
множества, заключенный в квадратные
скобки.
Пример: begin
...
s1:=[‘1’,’2’,’3’]; s2:= [‘3’,’2’,’1’]; s3:=[’2’,’3’];
s4:=[0..3,6]; s5:=[4,5]; s6:=[3..9];
…
Операции над множествами
• пересечение множеств, т. е. элементы, входящие
в оба множества, например:
s4*s6 – [3,6], а s4*s5=[ ].
+ объединение множеств. Результат содержит
элементы первого множества, дополненные
элементами второго множества:
s4+s5 [0,1,2,3,4,5,6] s5+s6 [3,4,5,6,7,8,9]
- разность множеств. Результат содержит
элементы первого множества, которые не
принадлежат второму
s4-s5 [0,1,2,3,6]
s6-s5 [3,6,7,8,9]
Операции над множествами
проверка эквивалентности;
проверка неэквивалентности;
проверка вхождения одного множества в
другое ;
проверка принадлежности элемента
множеству.
Пример: x in A , где
x - операнд, принадлежащий базовому типу
А - операнд множественного типа
Результат всех этих операций имеет тип boolean.
Оптимизированные процедуры для работы
с одиночными элементами множества
Include(A,x);
- включение элемента x в множество A.
Exclude(A,x);
- исключение элемента x из множества A.
Главные недостатки множественного
типа
• малый размер множества
• невозможность вывода множества на экран
(ввод множества возможен только по элементам).
Значения множественного типа нельзя вводить и выводить!
Однако можно ввести значения элементов множества и
добавить их к множеству, используя операцию объединения
множеств, например:
S:=[]; {исходное множество пусто}
ReadLn(n);
While not Eof Do
begin
S:=S + [n]; {объединяем исходное множество с элементом}
Read(n); {вводим следующий элемент}
end;…
Для того чтобы вывести элементы множества, используют
специальный приём: в цикле проверяют вхождение во
множество всех элементов базового типа и выводят те, которые
входят во множество, например:
For i:=‘a’ to ‘z’ Do
If i in S then Write(i:3);
Упражнение №1
Type bits = set of 0..1;
Var x: bits;
Y: set of (a,b,c);
z: set of ‘*’..’*’;
Сколько и какие значения может
принимать каждая из переменных x, y, и z?
Упражнение №2
Какие из следующих конструкций являются
множествами ( в смысле языка Паскаль), а какие
нет?
a) [9,6,3,0];
б) [ 2..3,5,7];
в) [1..15,4..18];
г) [‘*’, ‘*’];
д) [0..0];
е) [ true .. false];
ж) [2, sqrt(9)];
з) [‘=’, ‘>=’, ‘>’];
и) [[ ], [5]]
True > false !
Упражнение №3
Какие из следующих описаний неверны и
почему?
Type points = set of real;
Bt = array [1..8] of 0..1;
Dat = set of bt;
Month = ( jan, feb, mar, apr, may, jun, jul, aug,
sep, oct, nov, dec);
M1 = set of month;
M2 = set of jun..aug;
M3 = set of dec..feb;
M4 = set of (jun, jul, aug);
Упражнение №4
var p: set of 0..9 ;
i,j: integer;
Если i:=3 и j = 5, то какое значение
получит переменная p при
выполнении следующего оператора
присваивания
1. p:= [i+3, j div 2, j.. sqr(i) – 3];
2. p := [2*i .. j];
3. p:= [i, j, 2*i, 2*j]
Упражнение №5
Вычислить значения отношений:
a) [2] <> [2,2,2]
б) [ ‘a’, ‘b’] = [ ‘b’, ‘a’]
в) [4,5,6] = [4..6 ]
г) [‘c’, ‘j’] = [‘c’, ‘f’]
д) [2,3,5,7] <=[1..9]
e) [ 3,6..8] <= [2..7,9]
ж) [ ] <=[ ‘0’..’9’]
з) ‘q’ in [‘a’..‘z’]
и) trunc (3.9) in [1,3,5]
к) [2] < [1..3]
л) 66 = [66]
a) false
б) true
в) true
г) false
д) true
е) true
ж) true
з) true
и) true
к) ошибка, нет операции <
л) ошибка, т.к. сравнивается число с
множеством
Упражнение №6
1) [‘A’,’F’] + [‘B’,’D’] = ?
1) [‘A’,’F’,’B’,’D’]
2) S1:=[1..5,9]; S2:=[3..7,12];
S:=S1 + S2; S=?
3) [‘A’,’F’] * [‘B’,’D’] = ?
2) [1..7,9,12]
4) [1..3,5,7,11]*[3..8,10,12,15..20] = ?
5) [‘A’,’F’] - [‘B’,’D’] = ?
3) [ ]
4) [3,5,7]
5) [‘A’,’F’]
6) [1..3,5,7,11] - [3..8,10,12,15..20] = ?
7) A1:=[‘A’..’Z’]; A1:=A1 – [‘A’] =?
6) [1..2,11]
7) [‘B’..’Z’]
8) [red, green, blue, black] * [blue, magenta, yellow] =?
8) [blue]
Задача 1. В заданном числовом промежутке
([20;50][150;200]) найти числа, кратные 6, и
посчитать их количество.
program mnog; uses crt;
type
mn=set of 20..200;
var
s:mn;
i,k:integer;
begin clrscr; s:=[20..50,150..200]; k:=0;
for i:=20 to 200 do
if (i mod 6=0) and (i in s) then begin
k:=k+1;
writeln('i=',i); end;
writeln('k=',k);readln;
end.
Задача 1. Определить, является ли введённое слово
идентификатором, т.е. начинается ли оно с буквы или
знака подчёркивания и не содержит ли специальных
символов.
Суть решения: 1) Строим множество символов, которые
допустимы в качестве первого: это строчные и прописные буквы
латинского алфавита и символ подчёркивания:
[‘A’..’Z’, ‘a’ ..’z’,’_’]
2) Аналогично определяем множество допустимых символов,
которые могут встретиться, начиная со второго символа слова:
[‘A’..’Z’, ‘a’ ..’z’,’_’,’0’..’9’]
3) Программа должна
вводить строку,
проверять допустимость первого символа,
а затем в цикле проверять допустимость остальных символов.
PROGRAM z2;
VAR st: string; f: boolean; i: integer;
BEGIN
WriteLn(‘Введите строку’); ReadLn(st);
IF st[1] in [‘A’..’Z’, ‘a’ ..’z’,’_’] then {проверка первого символа}
begin
i:=2; f:=true;
While (i<=length(st)) and f do {проверка остальных символов}
if st[i] in [‘A’..’Z’, ‘a’ ..’z’,’_’, ’0’..’9’] then inc(i)
else f:=false;
IF f THEN WriteLn(‘Строка’,st, ‘идентификатор.’)
ELSE WriteLn(‘Строка’,st, ‘содержит недопустимые
символы’);
end
else WriteLn (‘Строка’,st, ‘начинается с недопустимого
символа.’);
END.
Задача. Дана строка символов.
Словом считается любая
последовательность цифр.
Удалить из строки все
симметричные слова
(палиндромы). Слова из одной
цифры палиндромами не
считаются.
program mnog8;
Const bkv=['0'..'9'];
Var s,w,w1:string[50]; i,j:integer;
begin
write('text:'); readln(s);
i:=1;
while i<=length(s) do begin
w:=''; w1:='';
while (i<=length(s)) and (s[i] in bkv) do begin
w:=w+s[i]; w1:=s[i]+w1; inc(i) end;
if (length(w)>1) and (w=w1) then
begin i:=i-length(w); delete(s,i,length(w)) end;
inc(i); end;
write('new text:'); writeln(s) end.
Задача.
Дан текст.
Словом считается любая
последовательность букв
латинского алфавита.
Будем называть слово особым, если
первая и последняя буквы равны.
Определить количество особых
слов в тексте. Малые и большие
буквы считаются эквивалентными.
program mnog3; uses crt;
const TFA=‘c:\classes\ …\in1.txt';
BKV=['A'..'Z','a'..'z'];
var
n:integer;
c:char;
t:text;
w:string;
begin clrscr; assign(t,TFA);
{$i-} reset(t); {$i+}
if ioresult<>0 then begin writeln(' no file'); exit end;
n:=0;
while not eof(t) do begin read(t,c); w:='';
while not eof(t) and (c in BKV) do begin
w:=w+upcase(c); read(t,c) end;
if c in bkv then w:=w+upcase(c);
if (length(w)>0) and (w[1]=w[length(w)]) then begin inc(n);
writeln(w) end;end; close(t);
write(' spetial words:'); writeln(n); end.
Задача. Дана строка символов. Напечатать
строку без первого знака препинания.
Задача. Дана строка символов. Напечатать
строку без знаков препинания.