Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ 51 - 80.docx
Скачиваний:
133
Добавлен:
30.03.2015
Размер:
2.18 Mб
Скачать

77.2 Стандартные и структурированные типы данных.

Структура данных - это способ хранения данных в компьютере, обеспечивающий их эффективное использование. Зачастую правильно подобранная структура данных позволяет создать более эффективный алгоритм. Выбор структуры данных обычно начинается с выбора абстрактной структуры данных. Хорошо спроектированная структура данных оптимизирует использование ресурсов (таких как время выполнения операций или используемый объём оперативной памяти), требуемых для выполнения наиболее критичных операций.Различают статические и динамические структуры данных.

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

Простейшая статическая структура данных – массив (статический).

Индексный массив - простая статическая структура данных, предназначенная для хранения набора единиц данных, каждая из которых идентифицируется индексом или набором индексов.

Достоинства:

  • легкость вычисления адреса элемента по его индексу (поскольку элементы массива располагаются один за другим);

  • одинаковое время доступа ко всем элементам;

  • малый размер элементов: они состоят только из информационного поля.

Недостатки:отсутствие динамики, невозможность удаления или добавления элемента без сдвига других.

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

Например:

var m1:array[-2..2] of real;

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

Массив - такая структура данных, которая характеризуется:

фиксированным набором элементов одного и того же типа;

каждый элемент имеет уникальный набор значений индексов;

количество индексов определяют мерность массива, например, два индекса - двумерный массив, три индекса - трехмерный массив, один индекс - одномерный массив или вектор;

обращение к элементу массива выполняется по имени массива и значениям индексов для данного элемента.

Синтаксис описания массива представляется в виде:

<Имя> : Array [n1..k1] [n2..k2] .. [nn..kn] of< Тип >.

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

Среди наиболее распространенных динамических структур данных следует выделить следующие:

  • связные списки;деревья;стеки;графы.

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

Работа с динамическими величинами связана с использованием еще одного типа данных — ссылочного типа. Величины, имеющие ссылочный тип, называют указателями.

Указатель содержит адрес поля в динамической памяти, хранящего величину определенного типа. Сам указатель располагается в статической памяти.

Адрес величины — это номер первого байта поля памяти, в котором располагается величина. Размер поля однозначно определяется типом.Величина ссылочного типа (указатель) описывается следующим образом:имя_типа *<идентификатор>;

Вот примеры описания указателей: int *P1; char *P2;

Здесь P1 — указатель на динамическую величину целого типа; P2 — указатель на динамическую величину символьного типа.

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

Каким же образом происходит выделение памяти под динамическую величину? Память под динамическую величину, связанную с указателем, выделяется в результате выполнения стандартной процедуры malloc. Формат обращения к этой процедуре:

идентификатор = (тип_идентификатора*) malloc (sizeof(тип_идентификатора))

Считается, что после выполнения этого оператора создана динамическая величина, имя которой имеет следующий вид:

<имя динамической величины> = *<указатель>

Стандартные и структурированные типы данных

В соответствии с тем, что было сказано раньше, тип данных – система соглашений о том,

как интерпретировать значения (как они размещаются в памяти, какие допустимые

диапазоны и т. д.).

В программах используются как стандартные типы данных, так и типы, определяемые

программистом.

Приведем краткий обзор стандартных типов данных в разных языках и покажем, как

определяются пользовательские типы данных.

>>>>TurboPascal

Типы данных подразделяются на

простые

целый Shortint, Integer, Longint, Byte, Word (знаковые и беззнаковые)

логический Boolean, ByteBool, WordBool, LongBool (версия 7.0)

символьный Char (полный набор ASCII-символов)

перечисляемый

тип-диапазон

вещественный Single, Real, Double, Extended, Comp

структурированные

указатели

процедурные

объектные

Простые типы и использовать просто. Нужно только следить за границами изменения

значений.

Простые перечисляемые типы приближают язык программирования к языку предметной

области. Например,

type

Color = (white, red, green, blue, black);

Operation = (Add, Sub, Mul, Dvd);

Каждое значение из списка отождествляется с целым числом: 0, 1, и так далее.

>>>>>C++

В языках C и C++ к простым типам относятся: char, int, float, double .

( поддерживается разная длина в 16- и 32-битных моделях данных ).

Широко используются модификаторы длины short, long, signed, unsigned .

Например,

unsigned long int 32 бита 0 . . 4294967295

Предусмотрены модификаторы доступа: const и volatile . Первый запрещает изменять

значения переменных (эти значения назначаются при инициализации), а второй

предупреждает транслятор, что значения данных могут изменяться, но не самой

программой, а каким-либо другим образом.

Например,

const volatile unsigned char *port = 0x30;

У перечисляемыхтипов, например

enum suit (clubs, diamonds, hearts, spades);

enum answer (yes, no, maybe = -1);

значениям могут соответствовать любые целые константы, в том числе и отрицательные.

Разрешается автоматическое преобразование типов в смешанных выражениях. Естьдва

основныхправила:

char, short, enum>int, остальное> unsigned

long double > double > float > unsigned long > long > unsigned >int

Приведение типа может быть назначено явно, например так:

x = (float) ((int) y + 1;

>>>>Turbo Pascal

Структурированные типы подразделяются на:

тип-массив

тип-запись

тип-множество

тип-файл

Типы-массивы используются в программах очень часто. Например,

type

Mas = array [1..1000] of Real;

Tab = array [1..10, 1..15] ofInteger;

Формальными параметрами подпрограмм могут быть открытые массивы.

procedure Zero (var x: array of Real);

var j : Integer;

begin

for j := 0 to High(x) do x[j] := 0;

end;

По умолчанию нижняя граница индекса – нуль, а верхняя определяется встроенной

функцией High(). Cимвольные строки в Паскале представляют собой массивы:

string [n] = array [0 . . n] of Char;

Поэтому можно обращаться к отдельным символам строк. Если размер строки не указан,

то память резервируется по максимуму: на 255 элементов.

Пример.

var

s: string[50]; t: string;

В TurboPascal имеются также ASCIIZ-строки – переменные типа PChar. Размер таких

строк может доходить до 65535 байтов, признак конца строки – символ с ASCII-кодом 0.

Если переустановить ключ компилятора $X+ (так по умолчанию) в $X-, то переменные

типа PChar будут рассматриваться как указатели на символьный тип char.

Для объединения в единое целое данных различных типов предусмотрены типы-записи.

Например,

type

Comp = record

Re, Im: Real;

end;

Data = record

Year: Integer;

Month: 1 . . 12;

Day: 1 . . 12;

end;

При доступе к полям записей используются составные имена:

var

D: Data;

begin

D.Year := 2008;

Возможны различные варианты объявления записей, есть несколько способов обращения

к полям. Вопримеры:

var

A, B, C: record Re, Im Real; end;

const

OneR: Comp = (Re : 1; Im : 0);

with A do

begin Re:=1.2; Im := -3.7; end;

Вариантные записи позволяют интерпретировать одни и те же области памяти как аписи с

разными полями. По аналогии с принятыми обозначениями в Delphi можно задавать

размеры прямоугольника разными способами:

Пример.

type

Point = record

x, y : Integer;

end;

Rectangle = record case Word of

0: (Left, Top, Right, Bottom: Integer);

1: (TopLeft, BottomRight: Point);

end;

var R: Rectangle;

begin

R.Left:=0; R.Top:=7; R.Right:=12; R.Bottom:=25;

Writeln(R.TopLeft.x,' ',R.TopLeft.y);

Readln;

end.

C++

В языках C и C++ структурированные типы данных в целом такие же, как в Паскале, но

имеются некоторые отличия.

Переопределяются типы данных с помощью конструкций вида

typedefdoublereal;

У массивов по умолчанию нижняя граница индекса равна нулю.

ПримеризC :

#include<stdio.h>

int main(void)

{

int a[100];

int j;

for (j=0; j<100; ++j) a[j] = j;

for (j=0; j<200; ++j) printf(“%d “, a[j]);

return 0;

}

Здесь есть одно тонкое место (побочный эффект). На печать выводится символов больше,

чем имеется в массиве. Язык C не отслеживает границы индексов у массивов (из

экономии времени, пусть будет виноват программист), но в C++ такая проверка

предусмотрена.

Имя массива рассматривается как указатель на первый элемент массива. Поэтому можно

сделать так:

inta[100];

int *p;

p = &a[0];

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

p = a;

Для размещения массивов в динамической памяти используют функцию malloc(), а для

освобождения памяти – функцию free() .

Например, в C

char *p;

p = malloc(1000);

p[77] = ...... free(p);

Первые две строки этого кода не работают в C++ (типизированные указатели перестали

быть совместимыми), поэтому надо написать

p = (char *) malloc(1000);

У многомерных массивов индексы стали более самостоятельными:

doublematr [10] [20] [30];

Объединения, как и вариантные записи Паскаля, позволяют интерпретировать одни и те

же участки памяти как значения разных типов. Например,

unionintchar {

int i;

charc;

};

Структуры в C++ используются по следующей схеме:

structaddr { объявление структуры,

charname[30]; имя типа часто называют

char building[4]; ярлыкилишаблон,

charstreet[40]; а поля – членами структуры

char city[20];

unsigned long int zip;

};

structaddrvin, pnb; объявление переменных

structaddrprepod[120]; массив структур

structaddr *p; указатель на структуру

p = &pnb; адрес помещается в указатель

pnb.namep->city доступ к полям

vin = pnb; присваивание

Обратим внимание: доступ к полям структуры осуществляется или с помощью оператора

«точка», или с помощью оператора «стрелка»

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