- •Структуры и алгоритмы обработки данных Введение
- •1. Структуры данных
- •1.1 Уровни структур данных
- •1.2 Классификация структур данных
- •1.3. Информация и ее представление в памяти эвм
- •2. Простые структуры данных
- •2.1. Понятие о типах данных
- •2.2. Перечисляемый тип данных
- •2.3. Стандартные типы данных
- •2.3.1. Целочисленные типы
- •2.3.2. Вещественные числа
- •2.3.3. Представление и структуры хранения логической информации
- •2.4. Указатели
- •2.4.1. Назначение и смысл указателей
- •2.4.2 Операции с адресами
- •2.4.3 Указатели на указатели
- •2.5. Алгоритмы обработки простых структур данных
- •3. Линейные статические структуры данных
- •3.1 Массивы
- •3.2. Динамические массивы
- •3.3. Многомерные массивы
- •3.4. Связь массивов с указателями
- •3.5. Строки
- •3.6. Массивы указателей
- •3.7. Интерпретация составных описателей
- •3.8 Алгоритмы обработки статических линейных струткур
- •4. Ссылки
- •5. Интегральные типы данных (структуры, битовые поля, объединения)
- •5.1. Структуры
- •5.2. Битовые поля
- •5.3. Объединения
- •6. Файлы
2. Простые структуры данных
2.1. Понятие о типах данных
Вычислительный процесс на ЭВМ реализуется с помощью программы и данных, которые программа использует или формирует. Но и сама программа представляет собой совокупность данных, и поэтому можно считать, что данные описывают любую информацию, с которой может работать ЭВМ. Все данные в общем случае характеризуются рядом признаков, или атрибутов, в том числе своим значением, смысл которого различен для разных данных. Независимо от содержания и сложности любые данные в памяти ЭВМ выражаются последовательностями двоичных разрядов, или битов, а их значениями могут служить соответствующие двоичные числа. Данные, рассматриваемые в виде последовательности битов, имеют очень простую организацию. Однако для человека описывать и исследовать сколько-нибудь сложные данные в терминах последовательностей битов весьма неудобно.
Более крупные и содержательные, нежели бит, "строительные блоки" для организации произвольных данных можно получить на основе понятия типов данных.
Тип некоторых данных определяется множеством значений этих данных и набором операций, которые можно выполнять над этими значениями в соответствии с их известными свойствами. Следовательно, тип данных специфицирует те операции, которые допустимы над соответствующими данными. На машинном уровне тип данных используется для выбора машинных команд, в выполнении которых участвуют такие данные. Тип данных, кроме того, используется при выборе представления данных в памяти.
В большинстве случаев новые типы данных определяются с помощью ранее определенных типов данных. Значения такого нового типа обычно представляют собой совокупности значений компонент, относящихся к определенным ранее составляющим типам, такие значения называются составными.
Если имеется только один составляющий тип, т.е. все компоненты относятся к одному типу, то он называется базовым.
Поскольку составляющие типы также могут быть составными, то можно построить целую иерархию структур, но конечные компоненты любой структуры, разумеется , должны быть атомарными. Следовательно, система понятий должна допускать введение и простых, элементарных типов. Самый прямолинейный метод описания простого типа – перечисление всех значений, относящихся к этому типу.
Если для значений некоторого типа существует отношение порядка, то такой тип называется упорядоченным или скалярным.
2.2. Перечисляемый тип данных
Любой новый простейший тип определяется простым перечислением входящих в него различных значений. Такой тип называется перечисляемым. Его определение, например, на языках Си/Си++, имеет следующий вид:
enum Seasons { winter, spring, summer, autumn } s1,s2,s3;
Имена в перечислении Seasons – целые константы: winter = 0, spring = 1 и т.д.
enum days { Su = 5, Mo, Tu, We = 11, Th, Fr, Sa };
2.3. Стандартные типы данных
К простейшим стандартным типам относятся целые числа, логические значения, символы, вещественные числа.
2.3.1. Целочисленные типы
ЭВМ оперирует с числами, содержащими конечное число разрядов. Возможны следующие типы чисел:
Целые двоичные числа длиной 8,16 и 32 и двоично-кодированные десятичные числа длиной 8 бит. Двоичные числа допускают интерпретацию как целых без знака и целых со знаком, а десятичные числа знака не имеют. В двоичных целых числах без знака все разряды считаются значащими и диапазон представляемых чисел составляет 0…255 для чисел длиной 8 бит и 0…65535 для чисел длиной 16 бит.
Все разряды числа являются значащими, а двоичная точка находится справа или, как говорят, фиксирована после младшего значащего разряда. Отсюда появляется еще одно название этого формата и других аналогичных форматов – формат с фиксированной точкой. Следовательно, в этом формате представимы только целые числа 0, 1, 2, ..., 2n–1 и любая комбинация битов (двоичный набор) является допустимой.
Среди стандартных типов языков программирования может быть целый набор целочисленных типов, например, в Си/Си++:
char k1; // знаковый символьный тип (целочисленный)
int a; // знаковый целый тип
int b, c; // знаковый целый тип
Переменные беззнаковых типов должны быть явно указаны как беззнаковые:
unsigned char k2; // беззнаковый символьный тип (1 байт)
unsigned int d; // беззнаковый целый тип (2 – 4 байта, в зависимости от разрядности ЭВМ)
unsigned e; // беззнаковый целый тип
unsigned long int a1; // беззнаковый длинный целый тип ( не короче 4-х байт)
unsigned long a2; // беззнаковый длинный целый тип
unsigned short int s1; // беззнаковый короткий целый тип (не длиннее 2-х байт)
unsigned short s1; // беззнаковый короткий целый тип
Символьные типы языков Си/Си++ также являются целочисленными и имеют размер в 1 байт.
Целые знаковые двоичные числа. Чтобы компьютеры могли оперировать положительными и отрицательными числами, один из разрядов необходимо отвести для изображения знака чисел S. Обычно им является старший (левый) бит, а стандартное кодирование имеет такой вид: S=0 – число положительное; S=1 – число отрицательное.
В языках Си/Си++ знаковые типы могут быть явно указаны:
signed char k1; // знаковый символьный тип
signed int a; // знаковый целый тип
но в большинстве случаев в этом нет необходимости:
char k1; // знаковый символьный тип
int b, c; // знаковый целый тип (слово signed можно не указывать)
long int alpha; // знаковый длинный целый тип
long beta; // знаковый длинный целый тип (слова int можно не указывать)
short int gamma; // знаковый короткий целый тип
short delta; // знаковый короткий целый тип
Для новых 64-разрядных процессоров семейства x86 в некоторых версиях языка Си++ используется 64-разрядный целочисленный тип int64.