программирование 2 семестр 1 курс

Множественный тип данных

Лекция №1

Структурированные типы данных. Множества. Объявление множеств. Построение множеств. Операции над множествами. Приоритеты множественных операций. Примеры. Записи. Объявление записей. Вложенные записи.

В языке программирования множество представляет собой ограниченную своеобразную представленную в памяти ( по сравнению с другими типами данных ) совокупность элементов одного и того же базового типа , который выступает в качестве универсального множества (универсума) . В качестве базового типа может выступать : 1) Целочисленный тип : Byte; 2) Символьный тип : char; 3) Перечислимый пользователем тип данных .

В множестве могут присутствовать элементы , порядковые значения которые не выходят за диапазон 0..255. Разрешено объявлять множества , состоящие не более чем из 256 элементов . Нумерация элементов во множестве идет от 0 до 255 . В отличие от других типов данных один элемент множества занимает в памяти 1 бит . Исходя из этого для хранения полного множества из 256 элементов , достаточно 32 байта . Такая двоичная форма хранения информации позволяет эффективно реализовывать представление множества и операций над ними . Для обозначения используются квадратные скобки: [ ].

Объявление множеств :

Исполняется ключевым словом set (набор ) .

Синтаксическое объявление :

Var «Имя переменной »:set of «базовый тип » ;

Примеры:

Type

Charset= set of char;

Var

m_ch1,m_ch2:charset;

m_arr : array [1..5] of charset;

m_b: set of byte;

Описывая множество, бывает удобно сразу указать какие элементы, оно может содержать. Это можно осуществить двумя способами: 1.Перечислить все возможные значения (множественно-перечислимый тип); 2. Указать пары граничащих значений (используется чаще ).

Примеры :

Type

Digits=setoff 0..9;

Charset=set of ‘A’..’Z’;

Var

M1:set of 0..6; (Объем памяти =1 байт)

M2:digits; (Объем памяти =2 байта)

M3:charset;

M4:set of 0..4;

M5:set of( black, white ,grey);

M6:set of 7..16; (объем памяти =3 байта , в первый байт входит 7,в третий 16)

Number1,number2:0..9;

Определение памяти требуется для множеств:

M:set of N1…N2; N2>N1.

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

В общем случае использованное множеств не предполагает значение их машинного представления .Эти знания могут быть необходимы при обращении к множеству напрямую , например, через указатель . Размер , занимаемый множеством можно определить с помощью функции size of():

I:= Size of(m6);

Построение множеств :

На этом этапе решается задача с заполнением множеств . способы заполнения множеств:

1.

1) m1:=[0,1,4];

1

1

0

0

1

0

0

0

012345671байт

2) m1:=[1,4,0];

3) m5:=[gray , white];

4) m3:=[‘K’..’P’]; аналогично m3:=[‘K’ ,’L’ , ‘M’ , ‘N’, ‘O’,’P’ ];

5) m2:=[9,4..7]

2. Задание стартового значения в разделе Const:

Const

M7:set of char=[‘a’..’e’];

3 . Заполнение множеств , использую множественные операции (объединение , пересечение , вычитание , исключение смотри ниже ).

Обнуление множества :m6:=[];

При задание множества можно использовать переменные в соответствии с базисным типом:

Number1:=1; Number2:=2;

M2:=[number1 , number2 , 6 ];

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

M1:=[1,4,6];

M1:=[1,3,6,8,7,10];

1

1

1

1

1

1

0123456789101112131415

M1:=[1,3,6,7];

1

1

1

1

….

01234567815

1

1

….

1

….

1617181920212223242931M6:=[1,2,7,8,16,20,29];

M6:=1,2,7,8,16,20];

Массив множеств.

Type charset=set of char;

Var

M_arr :array [1..3] of charset;

M_arr=([…] , […] , […]);

M_arr[1]:=[‘A’,’B’];

M_arr=([‘A’,’B’], [ ],[ ] );

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

Объединение : + А=В u C

Var

a,b,c: set of byte;

:

:

a:=[1,2,3];

b:=[3,4,5];

c:=a + b;

c=[1..5].

Пересечение: * A=B*C

c:=a*b;

c:=[3];

Вычитание: — A=B/c

c:=b-a;

c=[4,5];

Манипулируя основными операциями возможно добавлять и удалять элементы :

a :=[1,2];

a:=a+[3];

a:=a+[3,4,5];

a:=a-[3,4];

a:=a-[10];

Операция включения и исключения одиночного элемента: реализуется с помощью .

а) Include («множество», «элемент»)

Второй параметр не может быть множеством.

б) Exclude («множество », «элемент ») – исключение Exclude(a,3);

5. Операция проверки на принадлежность элемента множеству: In

(x In A) not(x In A)

Пример: Ввести строку состоящую из не более чем 20 символов принадлежащие к множеству латинских букв и цифр, ввод прекращается по заполнению всей строки , либо по нажатию Enter.

Var

st : string [20];

ch: char;

I:byte;

m: set of char;

begin

:

:

M:=[’a’..’z’,’A’..’Z’,’0’..’9’];

st:=’’;

ch:=#0;

i:=1;

while (ich13) do

begin

ch:=readkey;

if ch in m then

begin

st:=st+ch;

write(ch);

i:=i+1;

end;

end;

Сравнение множеств: к множествам применяются операции отношения : ,=, >=,

*

+,-

=,,>=,

Достоинство и недостатки множеств:

Достоинство: 1. Компактность представления; 2. Удобство со множествами ;

Недостатки : 1. Невозможен прямой доступ к отдельным элементам ; 2. Ограниченность использование типов; 3. Существенно ограничен по количеству элементов .

Рассмотрим способ вывода множества : Для вывода необходимо просмотреть все элементы базового типа и если текущий рассматриваемый элемент содержится в множестве , вывести его

Var

m:set of byte;

i:byte;

:

.

m:= [1,10,100];

for i:=0 to 255 do

if I in m then

write(I, ‘ ‘);

……..

Записи

Лекция №2

Структурированные типы данных. Записи. Оператор присоединения. Совместимость. Записи со стартовыми значениями. Массивы записей, обращение. Варианты записей.

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

Синтаксис переменной типа — запись :

Var

«имя записи »:record;

«поле 1»: «тип 1»;

«поле 2»: «тип 2»;

…..

«поле n»: «тип n»;

End.

Запись можно конструировать двумя способами:

1 способ : через определение соответствие типа

Type

TAdres=record

homeNum:word;

streetName:string[50];

flatNum:word;

end;

var

adres:TAdres;

2 способ : в разделе описания переменных:

var

Adres=record

homeNum:word;

streetName:string[50];

flatNum:word;

end;

Оба способа одинаково приемлемы, однако 1 способ дает дополнительную гибкость при задание записи в качестве параметров подпрограмм. От того , где объявлены записи существенно зависит их совместимость (смотри обращение к записи как к единому объекту ). Размещение в памяти :в памяти поля записи размещаются в порядке их перечисления в объявление и располагаются от младшего к старшему .

Доступ к полям записи.



Страницы: Первая | 1 | 2 | 3 | ... | Вперед → | Последняя | Весь текст