Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Документ Microsoft Office Word (2).docx
Скачиваний:
44
Добавлен:
09.02.2015
Размер:
842.69 Кб
Скачать

2. Объединения

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

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

Формат объединения отличается от структуры только служебным словом union:

union имя {

тип1 имя переменной 1;

тип2 имя переменной 2;

};

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

Доступ к элементам объединения осуществляется так же, как к элементам структуры - через точку для имени объединения, или по стрелке для обращения через указатель.

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

union Flag{

long g;

char ch[4];

};

void main()

{

Flag fl;

fl.ch[0] = 1;

fl.ch[1] = 2;

fl.ch[2] = 4;

fl.ch[3] = 8;

printf("Flag = %x\n",fl.g);

fl.g = 0; //Все флаги равны 0

printf("Flag = NULL\n");

for (int i = 0; i < 4; i++)

printf("%d\n",(int)fl.ch[i]);

}

Мы описали объединение, как переменную типа long и, одновременно, в виде массива типа char. Теперь, для переменной типа Flag, мы можем работать с каждым флагом независимо, или, используя операцию с переменной типа long, обнулить все флаги простой операцией присваивания fl.g = 0;.

В следующем операторе вывода мы хотели вывести каждый символ в виде целого числа, поэтому мы поставили оператор явного преобразования типа: (int)fl.ch[i].

Комбинированные типы. Записи

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

     Структурированные типы в отличие от скалярных состоят из компонент.

     Регулярные типы – фиксированное число однотипных компонент.

     Комбинированные типы– фиксированное число компонент различных типов.

     Записи позволяют в компактной форме описывать различные объекты (списки, каталоги, картотеки, таблицы, ведомости и т.д.). Рассмотрим способы описания, ввода/вывода и обработки записей.

 

Описание записей в Паскале

     При использовании записей они д.б. описаны с использованием раздела описания либо непосредственно в разделе описания переменных

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

IZ = RECORD                         Где:  IZ – имя типа записи;             IK1 : T1;                                IK – имя поля (компоненты);             IK2 : T2;                                T   - тип компоненты, м.б. любой стан-              . . .                                                дартный либо предварительно             IKN :TN;                                       определенный (кроме файлового);         END;                                            RECORD – запись;                                                              RECORD-END – операторные скобки.

 

Пример описания записи

       Const  n=25;        Type   Date = Record                                    Year       : integer;    {Год}                                     Month   : 1..12;        {Число}                                     Day        : 1..31;        {Месяц}                                End;               Student = Record                                    FIO        : String[15]; {ФИО}                                    Dr           : Date;          {Дата рождения}                                    Str          : String[20]; {Страна}                         b1,b2,b3,b4,b5  : 2..5;            {Поле оценок}                                End;                      Vec = array[1..n] of Student; Var    EMS_43a, EMS_43a, EMS_43a    :Vec;

 

Порядок следования полей в записи не имеет значения.

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

    Type x=(Yes, No);              Student = Record                                    FIO        : String[25]; {ФИО}                                    Mark      : 2..5;            {Оценки}                                    Variant   :x;                                     Case x of                                            Yes  : (Str  : String[20]); {Страна}                                             No   :  (     );                             End;