МНОЖЕСТВА
ОПРЕДЕЛЕНИЕ Множество – это набор однотипных объектов. Характер связей между объектами подразумевается программистом и никак не контролируется Паскалем. Количество элементов множества может меняться от 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} 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]
Упражнение 6 1) [A,F] + [B,D] = ?1) [A,F,B,D] 2) S1:=[1..5,9]; S2:=[3..7,12]; S:=S1 + S2; S=? 2) [1..7,9,12] 3) [A,F] * [B,D] = ?3) [ ] 4) [1..3,5,7,11]*[3..8,10,12,15..20] = ? 4) [3,5,7] 5) [A,F] - [B,D] = ? 5) [A,F] 6) [1..3,5,7,11] - [3..8,10,12,15..20] = ? 6) [1..2,11] 7) A1:=[A..Z]; A1:=A1 – [A] =? 7) [B..Z] 8) [red, green, blue, black] * [blue, magenta, yellow] =? 8) [blue]
program mnog; uses crt; type mn=set of ; var s:mn; i,k:integer; begin clrscr; s:=[20..50, ]; 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. В заданном числовом промежутке ([20;50] [150;200]) найти числа, кратные 6, и посчитать их количество.
Задача 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
Задача. Дана строка символов. Словом считается любая последовательность цифр. Удалить из строки все симметричные слова (палиндромы). Слова из одной цифры палиндромами не считаются.
program mnog8; Const bkv=['0'..'9']; Var s,w,w1:string[50]; i,j:integer; begin write('text:'); readln(s); i:=1; while i
Задача. Дан текст. Словом считается любая последовательность букв латинского алфавита. Будем называть слово особым, если первая и последняя буквы равны. Определить количество особых слов в тексте. Малые и большие буквы считаются эквивалентными.
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 ioresult0 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.
Задача. Дана строка символов. Напечатать строку без первого знака препинания.
Задача. Дана строка символов. Напечатать строку без знаков препинания.