Главная страница

Лекции. Основные понятия и определения


Скачать 1.94 Mb.
НазваниеОсновные понятия и определения
Дата27.03.2018
Размер1.94 Mb.
Формат файлаdocx
Имя файлаЛекции.docx
ТипКонтрольные вопросы
#39570
страница28 из 58
1   ...   24   25   26   27   28   29   30   31   ...   58

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.
1   ...   24   25   26   27   28   29   30   31   ...   58


написать администратору сайта