Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика (начальный курс) - 2 семестр.doc
Скачиваний:
4
Добавлен:
18.11.2019
Размер:
814.08 Кб
Скачать

Множества.

Тип "множество" является одним из сложных типов данных системы

программирования Turbo Pascal 7.0.

Тип "множество" является множеством всевозможных сочетаний объек-

тов исходного порядкового типа. Число элементов исходного множества в

Turbo Pascal не должно превышать 256. Все значения базового типа, об-

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

ны. Порядок "расположения" элементов в множестве никак не фиксируется.

Это соответствует принятой в математике трактовке множества как бес-

повторной неупорядоченной совокупности объектов.

Описание (декларация) типа множество.

-------------------------------------

Для задания типа "множество" следет использовать служебные слова

set и of, а затем указать элементы этого множества, как правило, в ви-

де перечисления или диапазона, например:

Type

Alfa = set of 'A'..'Z';

Ten = set of 0..9;

Count = set of (Plus, Minus);

Введя тип "множество", можно задать переменные этого типа.

Var

CAlfa: Alfa;

U233: Ten;

Так же как и для других структурированных типов тип множество

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

Var

CAlfa: set of 'A'..'Z'

Operation: set of (Plus, Minus);

U233: set of 0..9;

C: set of char;

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

-----------------------------------------

Множеству можно в программе присвоить то или иное значение. Обыч-

но значение задаётся с помощью так называемого конструктора множества.

Конструктор задаёт множество элементов с помощью перечисления в квад-

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

жества. Допустимо использовать диапазоны элементов.

CAlfa := ['A', 'B', 'C'];

C := [chr(0)..chr(31), 'D', 'F'];

В каждое множество включается и т.н. пустое множество [], не со-

держащее никаких элементов. Конструктор множества можно использовать и

непосредственно в операциях над множествами.

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

---------------------------

Так же как и в математике в системе программирования Turbo Pascal

7.0 над множествами применимы следующие операции:

+ - объединение множеств. C := A+B;

------------------------------------

Каждый элемент множества C является элементом либо множества A,

либо множества В.

+---+ +---+ A+---+

¦ААА¦ + ¦ВВВ¦ = ¦С+-+-+B

¦ААА¦ ¦ВВВ¦ ¦С¦С¦С¦

+---+ +---+ +-+-+С¦

+---+

- - разность множеств. C := A-B;

---------------------------------

Каждый элемент множества C является элементом множества A, но не

является элементом множества В.

+---+ +---+ A+---+

¦ААА¦ - ¦ВВВ¦ = ¦С+-+-+B

¦ААА¦ ¦ВВВ¦ ¦С¦ ¦ ¦

+---+ +---+ +-+-+ ¦

+---+

* - пересечение множеств. C := A*B;

-----------------------------------

Каждый элемент множества C является элементом множества A и B од-

новременно.

+---+ +---+ A+---+

¦ААА¦ * ¦ВВВ¦ = ¦ +-+-+B

¦ААА¦ ¦ВВВ¦ ¦ ¦С¦ ¦

+---+ +---+ +-+-+ ¦

+---+

= - проверка эквивалентности двух множеств. A = B;

---------------------------------------------------

Множество A равно множеству B, если каждый элемент множества A

является элементом множества B, и наоборот, каждый элемент множества B

является элементом множества A. Результат операции логическая величи-

на.

<> - проверка неэквивалентности двух множеств. A <> B;

-------------------------------------------------------

Множество A не равно множеству B, если множество A содержит хотя

бы один элемент, не являющийся элементом множества B, или (и) наобо-

рот, множество B содержит хотя бы один элемент, не являющийся элемен-

том множества A. Результат операции логическая величина.

<= - проверка, является ли левое множество подмножетвом правого.

----------------------------------------------------------------

A <= B; Множество A является подмножеством множества B, если все

элементы множества A являются элементами множества B. Результат опера-

ции логическая величина.

>= - проверка, является ли правое множество подмножеством левого.

-----------------------------------------------------------------

A >= B; Действие операции аналогично действию предыдущей опера-

ции. Результат операции логическая величина.

in - проверка, входит ли элемент (слева) в множество (справа).

--------------------------------------------------------------

C in B; Результат операции логическая величина.

Примеры программ.

------------------

ПРИМЕР 1.

---------

Из множества целых чисел 1..20 выделить: множество чисел, деля-

щихся на 6 без остатка; множество чисел делящихся на 2 или на 3 без

остатка. Вывести содержимое этих множеств на экран.

Program a6_23;

Var

N6 : set of integer; {множество чисел, делящихся на 6}

N23 : set of integer; {множество чисел, делящихся на 2 и 3}

k: integer; {параметр цикла с параметром}

Begin

N6 := []; {"обнуление" множества N6}

N23 : = []; {"обнуление" множества N23}

{ формирование множеств

---------------------}

For k:=1 to 20 do begin

if k mod 6 = 0 then N6 := N6 + [k];

if (k mod 2 = 0) or (k mod 3 = 0) then N23 := N23 + [k];

end;

{ вывод содержимого множеств

--------------------------}

Writeln(' На 6 без остатка делятся числа: ');

for k:=1 to 20 do

if k in N6 then write(k:3);

Writeln;

Writeln(' На 2 или 3 без остатка делятся числа: ');

for k:=1 to 20 do

if k in N6 then write(k:3);

Readln; { пауза }

End.

ПРИМЕР 2.

---------

Ввести строку символов, состоящую из латинских букв цифр и пробе-

лов. Осуществить проверку правильности введённых символов.

Program Verify_string;

Var

s: string;

m: set of char;

k: integer;

Done: boolean;

Begin

{ формирование контрольного множества символов

-------------------------------------------- }

m := [ '0'..'9', 'A'..'Z', 'a'..'z', ' '];

{ ввод строки

----------- }

Writeln(' Введите строку: ');

Readln(s);

{ проверка правильности строки

---------------------------- }

done := true;

for k:=1 to Length(s) do

if not (s[k] in m) then done := false;

{ вывод результата

---------------- }

if done then

writeln('Правильная строка. ');

else

writeln('Неправильная строка. ');

Readln; { пауза }

End.

Записи.

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

Описание записи в языке Паскаль осуществляется с помощью служебного слова record, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом end.

Например, телефонный справочник содержит фамилии и номера телефонов, поэтому отдельную строку в таком справочнике удобно представить в виде следующей записи:

type TRec = Record

FIO: String[20];

TEL: String[7]

end;

var rec: TRec;

Описание записей возможно и без использования имени типа, например:

var rec: Record

FIO: String[20];

TEL: String[7]

end;

Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля, например:

rec.FIO, rec.TEL

Такое имя называется составным. Компонентой записи может быть также запись, в таком случае составное имя будет содержать не два, а большее количество имен.

Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения with.

Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения:

with rec do оператор;

Здесь rec - имя записи, оператор - оператор, простой или составной. Оператор представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена. Например для нашего случая:

with rec do begin

FIO:='Иванов А.А.';

TEL:='2223322';

end;

Такая алгоритмическая конструкция полностью идентична следующей:

rec.FIO:='Иванов А.А.';

rec.TEL:='2223322';

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

type

RecType = Record

x,y: Word;

ch: Char;

dim: Array[1..3] of Byte

end;

const

Rec: RecType = ( x: 127;

y: 255;

ch: 'A';

dim: (2, 4, 8) );

 

Подробнее..

Особой разновидностью записей являются записи с вариантами, которые объявляются с использованием зарезервированного слова case. С помощью записей с вариантами вы можете одновременно сохранять различные структуры данных, которые имеют большую общую часть, одинаковую во все структурах, и некоторые небольшие отличающиеся части.

Например, сконструируем запись, в которой мы будем хранить данные о некоторой геометрической фигуре (отрезок, треугольник, окружность).

type

TFigure = record

type_of_figure: string[10];

color_of_figure: byte;

...

case integer of

1: (x1,y1,x2,y2: integer);

2: (a1,a2,b1,b2,c1,c2: integer);

3: (x,y: integer; radius: word);

end;

var figure: TFigure;

Таким образом, в переменной figure мы можем хранить данные как об отрезке, так и о треугольнике или окружности. Надо лишь в зависимости от типа фигуры обращаться к соответствующим полям записи.

Заметим, что индивидуальные поля для каждого из типов фигур занимают тем не менее одно адресное пространство памяти, а это означает, что одновременное их использование невозможно.

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

Динамическая память

В IBM PC-совместимых компьютерах память условно разделена на сегменты. Компилятор формирует сегменты кода, данных и стека, а остальная доступная программе память называется динамической (хипом).

Динамические переменные создаются в хипе во время выполнения программы. Обращение к ним осуществляется через указатели. С помощью этих переменных можно обрабатывать данные, объем которых до начала выполнения программы не известен. Память под такие данные выделяется блоками, которые связываются друг с другом. Этот способ хранения данных называется динамическими структурами.