Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.doc
Скачиваний:
77
Добавлен:
02.05.2014
Размер:
55.81 Кб
Скачать

9

Типы и структуры данных

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

В языках программирования используется следующие типы элементарных (простых, неструктурированных) данных.

Целое - множество целых чисел в диапазоне разрядной сетки ЭВМ.

Характеристикой этого типа данных может быть длина, выражаемая максимальным объемом памяти (в байтах) или максимальным числом десятичных позиций для записи данных (в случае двоично-десятичного представления целых чисел).

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

Для хранения целого числа в памяти ЭВМ выделяется фиксированное количество двоичных позиций (или полубайтов для двоично-десятичного числа).

Используется в ЭВМ формат представления чисел с фиксированной точкой, при этом представляется, что точка фиксирована после самого младшего разряда числа.

Действительные числа - множество вещественных чисел в диапазоне их представления в разрядной сетке ЭВМ.

ЭВМ точность представления действительного числа является ограниченной из-за конечности (ограниченности) разрядной сетки ЭВМ. Так, число 0.1 в ЭВМ представляется неточно, так как его двоичное представление является бесконечной дробью.

Характеристикой вещественных чисел является минимальное число, которое может быть представлено в ЭВМ.

Типичные операции над действительными числами – сложение, вычитание, умножение, деление, вычисление тригонометрических функций, возведение в степень, извлечение квадратного корня, логарифмирование, нахождение минимального и максимального числа из некоторого конечного множества чисел и некоторые другие.

Вещественные числа хранятся и используются в операциях над ними в формате с плавающей точкой.

X = M * E P ,

где М- мантисса со знаком, /М/>1,

Е- фиксированное основание (для десятичных чисел Е= 10, в ЭВМ чаще используется основание 16, но может быть и 2 или 8, во всяком случае, кратное 2).

Символьный тип (или данное типа строка) включает множество символов или литер, доступных в конкретной ЭВМ. Как следует из этого определения, множество символов фиксировано и в разных ЭВМ эти множества могут различаться. Типовыми операциями над символьными данными является операция читать и писать.

В ЭВМ символы представляются в двоичном коде. Эти коды упорядочены и для каждого символа может быть определен соответствующий ему порядковый номер.

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

Обратите внимание! Особенностью символьного представления в ЭВМ является то, что часто двоичные коды представления одного и того же

символа на разных устройствах ЭВМ различны. Это необходимо учитывать, если придется разрабатывать программы обмена на машинном языке для разных устройств ЭВМ или переносить программу с одной платформы на другую. Упомянутые выше команды работы с символами на языке Паскаль могут дать совсем не тот результат, который Вы ожидаете!

Тип логический или BOOLEAN характеризуется тем, что может принимать два значения “истина” или “ ложь”. В разных языках программирования эти два логических значения могут записываться по разному. Например, в Паскале это true и false, в Фортране TRUE и FALSE, в языке ЛИСП- T и NIL, в языке ПЛ/1 в качестве логического значения используется однобитные строки ‘1’B (true) и ‘0’B (false).

Типовыми операциями над этими данными является конъюнкция (и), дизъюнкция (или), отрицание (не). Часто в языках программирования используются и более сложные логические операции: исключающее или, импликация, эквивалентность. Кроме того, логическое значение является результатом выполнения операций (, , , , , ) над целыми и вещественными числами, символьными и другими данными, над которыми эти операции имеют смысл.

Для запоминания логического значения в памяти ЭВМ достаточно 1 двоичного разряда. Но поскольку в настоящее время минимальным адресуемым элементом памяти является байт, то логическое значение хранят в байте, при этом код его представления в ЭВМ является избыточным.

Тип указатель (или POINTER) представляет собой множество адресов данных в пределах объема памяти ОЗУ (количество адресуемых байтов, слов).

Типичными операциями над такими данными являются операции присвоения адреса памяти или присвоение значения другого указателя. Указатели имеют важное значение при создании и обработке связных структур данных – списков.

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

Структуру данных можно определить, как

S=(D,R),

где D- множество элементов данных, R-множество отношений (связей) между элементами данных.

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

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

Обобщенная структура в определенном выше смысле без учета ее представления в памяти ЭВМ называется абстрактной или логической. Чаще применяется термин “логическая” и мы тоже будем этот термин применять для структуры данных с точки зрения пользователя или программиста. ЭВМ может обрабатывать только те структуры, которые тем или иным образом представлены в машинной памяти. Такая структура данных называется физической структурой, структурой хранения, внутренней структурой или структурой памяти. Т.о. и физическая структура данных отражает способ представления данных в памяти ЭВМ , между логической и физической структурой существует различие, которое зависит от особенностей структуры и особенностей организации памяти ЭВМ, в которой структура должна быть отражена. Вследствие этого различия в ЭВМ должны существовать процедуры, осуществляющие отображение логической структуры в физическую и наоборот. Эти процедуры осуществляют доступ к физическим структурам и выполнение над ними различных операций.

Например, доступ к элементу двумерного массива на логическом уровне реализуется указанием номеров строки и столбца. На физическом уровне к элементу массива доступ осуществляется с помощью функции адресации, которая при известном начальном адресе массива в машиной памяти преобразует номер строки и столбца в адрес памяти соответствующего элемента массива.

Выводы:

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

2. Очень часто, говоря о той или иной структуре данных, имеют в виду ее логическое представление, так как физическое представление обычно скрыто от “внешнего наблюдателя”.

3. Логическое представление не зависит от языка программирования и ЭВМ, а физическое представление зависит от трансляторов и ЭВМ. Так, двумерный массив в Фортране и Паскаль представляется одинаково, а физическое представление в одной и той же ЭВМ в этих языках разное.

Прежде чем приступить к изучению конкретных структур данных, дадим им общую классификацию.

В зависимости от отсутствия или наличия явно заданных связей между элементами данных различают структуры несвязные (вектор, массив, строка, стек, очередь) и связные (списки). Важный признак структуры – ее изменчивость. Под изменчивостью будем понимать изменение числа элементов структуры и (или) связей между элементами структуры. По этому признаку различают структуры статические, полустатические и динамические. В зависимости от характера взаимного расположения элементов в памяти ЭВМ структуры делят на структуры данных с последовательным расположением элементов в памяти (вектор, массив, стек, очередь) и структуры с произвольным распределением – (односвязные, двусвязные, ассоциативные списки). Рассмотрим структуры данных подробнее в рамках их классификации по изменчивости.

Статические структуры данных

Этот класс структур характеризуется тем, что для их размещения в памяти ЭВМ выделяется фиксированный объем памяти.

Вектор – конечное упорядоченное множество простых данных или скаляров одного и того же типа. Элементы вектора находятся между собой в отношении непосредственного следования. В памяти ЭВМ элементы вектора представляются последовательностью одинаковых по длине участков памяти, как правило, расположенных в порядке следования элементов в группе. Важнейшая операция над вектором – доступ к заданному элементу. Кроме того, над вектором можно выполнять операции определения верхней и нижней границ индекса. По сути эти операции дают описание вектора.

Массивом называют такой вектор, каждый элемент которого вектор. В свою очередь элементы вектора “вектора массива” могут быть вектором (3-х и более мерные массивы). Процесс последовательного перехода к элементам вектора рано или поздно должен завершиться на скалярном элементе некоторого типа данных, причем этому типу должны соответствовать все скалярные элементы массива. Поэтому может быть более точным является скалярное определение массива:

к-мерным массивом называется конечное упорядоченное множество (к-1) мерных массивов, все элементы которых принадлежат одному и тому же типу. При к=1 получаем вектор.

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

линеаризации, элементы двухмерного массива могут быть расположены строка за строкой или столбец за столбцом.

В связи с массивом следует упомянуть и такую их разновидность, как разреженные матрицы. Это также массивы, большинство элементов которого равны “0”. К таким матрицам приходят в технике при получении ММ систем.

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

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

Поскольку запись можно рассматривать как обобщение понятия вектор, то для записи характерны аналог операции – доступ к полям записи, и последовательное расположение полей записи в памяти ЭВМ.

Для организации доступа в ЭВМ, как правило, создается дескриптор записи, в котором указывается смещение начала поля записи относительно начала записи в целом.

Например, запись:

ЗАП

  1. личный N студента, целое 2-значное;

  2. ФИО – символьное 15 – значное;

  3. Аббревиатура факультета – символьное 4-значное,

может иметь следующий дескриптор:

ЗАП

Личный номер студента 0

ФИО 2 (целое занимает 2 байта)

Факультет 17 (1-символ – 1байт)

Таблица - конечное упорядоченное множество записей, имеющих одну и ту же организацию. Наиболее распространена форма таблицы, в которой элемент представляет собой одноуровневую запись, состоящую из упорядоченной последовательности полей, имеющих в общем случае различный размер и соответствующих различным типам простых данных. Логическая структура представляется в виде последовательности расположенных друг под другом строчек одинаковой длины, представляющих элементы таблицы и разделенных на графы. Обычно одно из полей всех элементов таблицы отводится для хранения ключа, являющегося уникальным для каждой записи таблицы. Иногда ключом записи таблицы является некоторая совокупность полей записи. Тогда говорят, что ключ записи – сцепленный. Иногда таблицы определяют в виде совокупности (k,v), где k-поле ключа (сцепленного или простого), v- набор остальных полей записи (неключевых).

Таблица представляет собой обобщение понятия двумерного массива, в которой свойство однотипности элементов массива требуется лишь для элементов, расположенных в одном и том же столбце. Доступ к записям таблицы может осуществляться по номеру записи (аналог номера строки в двумерном массиве), но чаще доступ осуществляется по ключу, причем целью доступа является получение не отдельного поля записи, а как правило, сначала ищется какая-то одна запись (или группа записей), а затем осуществляется обработка полей этой записи или группы записей.

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

Физические структуры таблицы представляет собой линейную последовательность ячеек памяти, число которых определяется числом и размером полей записей в таблице и числом записей в таблице. Адресом таблицы является адрес первого поля первого поля первой записи таблицы. Область памяти отводится для таблицы в момент ее создания и в дальнейшем размер этой области обычно не изменяется.

Типичные операции над таблицей: включение в таблицу новой записи, поиск записи по заданному ключу с целью доступа и обработки полей записи и исключение записи из таблицы.

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

На основе таблиц (отношений) строится реляционная база данных.