Лекции. Основные понятия и определения
Скачать 1.94 Mb.
|
10.7. Структуры и объединения10.7.1. СтруктурыСтруктура (запись) – это составной объект, содержащий один или более элементов любых типов, кроме функций. Элементом структуры может быть массив любого типа. В отличие от массива, каждый элемент которого имеет одинаковый тип и доступ к ним осуществляется по значениям индексов, каждый элемент структуры имеет имя, по которому и выполняется обращение. Пример. Структура "Работник" (Worker): - таб. номер; - Фамилия И.О.; - должность; - сумма. Формат структуры: struct [<тип структуры>]{ <список описаний элементов> }[<список объектов>]; Пример. struct{ // Сведения о звезде long nom_GC; // Номер по каталогу GC float mv; // Блеск (звездная величина) char spectr[5]; // Спектр. класс double alfa; // Прямое восхождение double delta; // Склонение double mu_alfa; // Собственное движение по alfa double mu_delta; // ------------------- ------------- по delta char rem[15]; // Особенности (примечания) } star; Структура star содержит сведения об одной звезде. Это определение, т.е. под нее выделяется память, объем которой определяется суммарным размером всех элементов, входящих в структуру. В нашем примере он составляет 56 байтов. Пример. Определение нескольких структур одного строения. struct{ ....... } ref_star, // Опорная звезда view_star; // Наблюдаемая звезда Часто применяется описание (не определение!) типа структуры с последующим его использованием при объявлении переменных данного типа. Фактически это способ введения типа данных пользователя в отличие от предопределенных типов языка C++. Тип часто называют ярлыком или меткой структуры. В большинстве случаев без него можно обойтись, однако он необходим при описании рекурсивных структур, которые излагаются ниже в данном разделе. Пример. Описание типа star. struct star{ ............ }; Определение переменных данного типа: star ref_star, // Опорная звезда view_star; // Наблюдаемая звезда В качестве элемента структуры могут использоваться другие структуры, т.е. программист может вводить иерархию. Внутренние (входящие в состав других) структуры иногда называют подструктурами. Примеры. struct star{ long nom_GC; float mv; char spectr[5]; struct{ // Подструктура double alfa; double delta; } koord; struct{ // Подструктура double alfa; double delta; } move; char rem[15]; }; struct data{ // Дата int day; // День месяца int month; // Номер месяца int year; // Год char month_name[4]; // Название месяца }; struct form{ // Анкета char name[15]; // Фамилия И.О. char address[30]; // Адрес char post[20]; // Должность data birth_date; // Дата рождения data work_date; // Дата поступления на работу }; Обращение к элементу структуры выполняется перечислением имен структур, начиная с верхнего уровня. В качестве разделителя уровней используется . (точка). Пример. ref_star.koord.delta form.birth_date.year Допустимы массивы структур. Пример. struct{ /* Сведения о погоде за год */ struct{ double max, min, mid; } temperature; struct{ double max, min, mid; } humidity; struct{ double max, min, mid; } pressure; short number_of_observations; } weather[12]; В языке Basic для объявления структур используют ключевое слово Structure. Формат объявления Dim Structure <тип> <список элементов> End Structure Это описание нового типа данных. Для определения (выделения памяти) переменных этого типа необходимо объявление вида <тип> <переменная>[, <переменная>]… Пример. Объявление типа Dim Structure star ‘ Сведения о звезде nom_GC As Long ‘ Номер по каталогу GC mv As Single ‘ Блеск (звездная величина) spectr As String ‘ Спектр. класс alfa As Double ‘ Прямое восхождение delta As Double ‘ Склонение mu_alfa As Double ’ Собственное движение по alfa mu_delta As Double ’ ------------------- ------------- по delta rem As String ‘ Особенности (примечания) End Structure Объявление переменных Dim view_star, ref_star As star Обращение к элементам структуры выполняется по тем же правилам, что в языке C++. Пример. view_star.mu_alfa ref_star.rem Все правила языка C применимы и к языку Basic. 10.7.2. Рекурсивные структуры (С++)Рекурсией, в общем случае, можно назвать правило, позволяющее определить некоторый объект с помощью другого объекта той же структуры. Наиболее распространены рекурсивные функции, простейшим примером которых является формула вычисления факториала: n!=n*(n-1)! При реализации структур данных таких, как: списки, стеки и т.п., используются объекты программы вида, приведенного ниже в примере. Пример. struct node{ int data; node *next; }; Здесь в состав структуры включают указатель на структуру того же типа. Такие структуры называют рекурсивными. Их применение будет рассмотрено в курсе "Структуры данных". 10.7.3. Поля битов (С)До сих пор минимальными адресуемыми элементами программы являлись объекты размером в 1 байт. Примерами таких объектов являлись данные типа char в языке C и типа Byte в языке Basic. Однако байт содержит 8 битов (двоичных цифр). Язык C позволяет манипулировать с отдельными битами информации. Такая необходимость возникает, в основном, при программировании аппаратуры, входящей в состав ПК, или программно-аппаратного комплекса. Средством реализации такой возможности является особый вид структуры, имеющий в качестве элементов так называемые поля битов. Записываются такие структуры следующим образом: struct{ unsigned [<имя>]: <число битов>; .......................... } Пример. Формат регистра состояния ГД RX211. struct{ unsigned error :1; unsigned initialize :1; unsigned addr :2; unsigned rx02 :1; unsigned :2;/* Hе используются */ unsigned density :1; unsigned trreg :1; unsigned enable :1; unsigned done :1; unsigned select :1; unsigned funct :3; unsigned go :1; }save_211; Поле битов без имени нулевой длины вызывает выравнивание последующих полей на границу объявленного типа данных, т.е они располагаются с адреса, кратного 32. 10.7.4. Объединения (смеси) (С)Иногда возникает необходимость располагать в одной области памяти программные объекты разных типов и даже разной организации, например, скалярные переменные и массивы. Для этой цели используется конструкция, называемая объединением или смесью, правило объявления которой имеет вид: union [<тип>]{ описание элемента 1; описание элемента 2; ...................; описание элемента n; }[<список>]; Пример. union{ float radius; // Окружность float side[2]; // Прямоугольник float triangle[3]; // Треугольник float point[2]; // Точка }GeomFig; В каждый момент времени в памяти, отведенной объединению, может находиться только один элемент, т.е. память используется элементами поочередно. Размер отводимой памяти определяется размером наиболее "длинного" элемента. В примере это "треугольник" – 12 байтов. Заметим, что обобщением понятия объединения является тип данных Object в языке Basic. 10.7.5. Переменные структурыПеременной называют структуру, в состав которой входит хотя бы 1 смесь. Общая схема построения такой структуры следующая: struct{ общие компоненты, признак активной компоненты (тэг), union{ переменные компоненты }<имя>; ........................................................ }<имя структуры>; Тэгом называют переменную, значение которой определяет, какой элемент объединения занимает память в данный момент. Пример. Паспортные данные: - фамилия и.о., - серия,номер, - дата рождения, - место рождения, - национальность, - прописка, - семейное положение:холост|женат|разведен, - переменная часть, - военнообязанный:да|нет. enum sem_pol{holost, genat, razveden}; struct pasport{ char fio[30]; char nomer[12]; struct data birthdate; char mesto[15]; char nation[15]; char propis[40]; enum sem_pol pr; union{ /* холост - пусто */ /* женат */ struct{ struct data svadba; char wife_fio[30]; unsigned chislo_children; struct{ char name[15]; char pol; struct data birthdate; }children[PAZMEP]; }sostav; /* разведен */ struct data razvod_day; }sem_sost; unsignedchar priziv; }; Весьма вероятно, что подобные структуры можно реализовать и в языке Basic, используя вместо union тип Object. |