Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Infa.docx
Скачиваний:
10
Добавлен:
07.07.2019
Размер:
311.28 Кб
Скачать

Билет 3. Массивы

Массив – наиболее широко используемая структура данных. Массив всегда состоит из компонент, имеющих одинаковый тип, называемый базовым. Поэтому о массиве говорят как о однородной структуре. Массив допускает произвольный доступ, т.к. можно произвольно выбрать любую компоненту, и доступ к каждой будет осуществляться одинаково быстро. Чтобы обозначить компоненту, к имени массива присоединяется индекс, который должен быть целым числом в диапазоне от 0 до n-1. Тип индекса – любой простой тип, для которого существуют операции inc и dec. Имя массива не является переменной типа указатель, а есть константа – адрес начала массива.

A[i]=*(A+i) – имя массива есть указатель на 0 элемент.

Мощность – все возможные значения, которые может принимать данный тип структур данных.

#array[Tindex] of Titem = (#Titem)#Tindex

sizeof(array) = sizeof(Titem)*#Tindex

Представление одномерного массива в памяти:

Операции над массивами:

  • Индексация

  • Присваивание

Выполняется поэлементно или через блоки памяти:

for(…) A[i]=B[i];

memcpy(A,B,sizeof(B));

  • A[5:9]=B[1:5]

  • Сравнение

Выполняется поэлементно или через блоки памяти

  • Инициализация

Представление массивов в памяти – это отображение (абстрактного) массива, компоненты которого имеют тип Т, на память компьютера, которая сама есть массив компонент типа BYTE. Массив должен представляться в памяти таким образом, чтобы вычисление адресов его компонент было как можно более простым (и поэтому эффективным). Адрес I для j-й компоненты вычисляется линейно:

i0 – адрес первой компоненты, s – количество слов, которые занимает 1 компонента. Весьма желательно, чтобы s было целым числом. В противном случае s округляется до ближайшего большего целого S. В этом случае каждая компонента занимает S слов, а S-s слов остаются неиспользованными. Такое округление называется выравниванием.

Эффективность использования памяти u определяется как отношение минимального объема памяти, нужного для представления структуры, к реально использованному объекту: u=s/S. Выравнивание уменьшает эффективность использования памяти.

Другой способ размещения элементов в памяти называется упаковкой. Упаковка – размещение более одного элемента массива в каждом слове. Если в одном слове упаковано n компонент, то u=n*s/(n*s)округл.

Билет 4. Записи

Структура - это набор из одной или более переменных, возможно различных типов, сгруппированных под одним именем для удобства обработки. Формат определения структурного типа таков:

struct имя_структурного_типа

{ T1 s1; T2 s2; … ; Tn sn; };

имя_структурного_типа – идентификатор, произвольно выбираемый программистом

T1 s1; T2 s2; … ; Tn sn; – совокупность одного или более описаний объектов, каждый из которых служит прототипом для элементов структур вводимого структурного типа.

#struct=#T1 * #T2 * … * #Tn

Идентификаторы s1,s2,…,sn , суть имена, данные отдельным компонентам переменных этого типа. Компоненты записи называются полями, а их имена – идентификаторами полей.

Компонента записевого типа сама может быть составной. Поэтому селекторы (точки) будут применяться один за другим.

И запись, и массив обеспечивают произвольный доступ к своим компонентам. Запись является более обширной в том смысле, что ее составляющие типы могут быть разными. Массив, в свою очередь, допускает большую гибкость в том отношении, что селекторы его компонент могут вычисляться, тогда как селекторы компонент записи суть идентификаторы полей, объявленные в определении типа записи.

Операции над записями:

  • Индексация по имени

A.name

  • Присваивание

A=B (без for)

  • Сравнение (через блоки памяти)

memcmp

  • Инициализация

Записи представляются в памяти простым расположением подряд их компонент. Адрес компоненты (поля) ri относительно адреса начала записи r называется смещением (offset) поля ki и вычисляется как:

Общность записевой структуры не позволяет использовать простую линейную функцию (как в массиве) для вычисления смещения компоненты. Именно поэтому требуют, чтобы компоненты записи выбирались с помощью фиксированных идентификаторов. Упаковка может привести к выигрышу, если несколько компонент записи могут поместиться в одном слове памяти. Поскольку смещения могут быть вычислены компилятором, то смещение поля, упакованного внутри слова, также может быть вычислено. Это означает, что многих системах упаковка записей в гораздо меньшей степени снижает эффективность доступа к полям, чем упаковка массивов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]