250 likes | 456 Views
МНОЖЕСТВА. ОПРЕДЕЛЕНИЕ. Множество – это набор однотипных объектов. Характер связей между объектами подразумевается программистом и никак не контролируется Паскалем.
E N D
ОПРЕДЕЛЕНИЕ Множество– это набор однотипных объектов. Характер связей между объектами подразумевается программистом и никак не контролируется Паскалем. Количество элементов множества может меняться от 0 до 256. Переменностью количества элементов множества отличаются от массивов и записей.
ОПРЕДЕЛЕНИЯ • Множество, не содержащее элементов, называется пустым. • Два множества эквивалентны, если они состоят из одинаковых элементов, причем порядок следования элементов в множествах безразличен. • Если все элементы одного множества входят в другое, то говорят о включениимножества. Пустое множество включено в любое.
Описание множества 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. >= <= in
Оптимизированные процедуры для работы с одиночными элементами множества 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 при выполнении следующего оператора присваивания • p:= [i+3, j div 2, j.. sqr(i) – 3]; • p := [2*i .. j]; • p:= [i, j, 2*i, 2*j]
Упражнение №5 a) false б) true в) true г) false д) true е) true ж) true з) true и) true к) ошибка, нет операции < л) ошибка, т.к. сравнивается число с множеством Вычислить значения отношений: 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]
Упражнение №6 1) [‘A’,’F’] + [‘B’,’D’] = ? 1) [‘A’,’F’,’B’,’D’] 2) [1..7,9,12] 2) S1:=[1..5,9]; S2:=[3..7,12]; S:=S1 + S2; S=? 3) [‘A’,’F’] * [‘B’,’D’] = ? 3) [ ] 4) [3,5,7] 4) [1..3,5,7,11]*[3..8,10,12,15..20] = ? 5) [‘A’,’F’] 5) [‘A’,’F’] - [‘B’,’D’] = ? 6) [1..2,11] 6) [1..3,5,7,11] - [3..8,10,12,15..20] = ? 7) [‘B’..’Z’] 7) A1:=[‘A’..’Z’]; A1:=A1 – [‘A’] =? 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); IFst[1] in [‘A’..’Z’, ‘a’ ..’z’,’_’] then {проверка первого символа} begin i:=2; f:=true; While (i<=length(st)) and fdo {проверка остальных символов} ifst[i] in [‘A’..’Z’, ‘a’ ..’z’,’_’, ’0’..’9’] then inc(i) else f:=false; IFfTHENWriteLn(‘Строка’,st, ‘идентификатор.’) ELSE WriteLn(‘Строка’,st, ‘содержит недопустимые символы’); end elseWriteLn (‘Строка’,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) dobegin w:=''; w1:=''; while (i<=length(s)) and (s[i] in bkv) dobegin 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 beginread(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.
Задача. Дана строка символов. Напечатать строку без первого знака препинания.
Задача. Дана строка символов. Напечатать строку без знаков препинания.