Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Struct studeut st1,st2;





Тип-даних описувач;

де тип-даних вказує тип структури для об'єктів, визначених в описувачах. У простій формі описувачі є ідентифікаторами або масивами.

Приклад:

struct { double x,y; } s1, s2, sm[9];

struct { int year; char moth, day; } date1, date2;

Змінні s1, s2 визначаються як структури, кожна з яких складається з двох компонент х і у. Змінна sm визначається як масив з дев'яти структур. Кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day.

Існує і інший спосіб асоціювання імені з типом структури, він заснований на використанні тега структури. Тег структури аналогічний тегу перелічуваного типу. Тег структури визначається таким чином:

struct тег { список описів; };

де тег є ідентифікатором.

У приведеному нижче прикладі ідентифікатор student описується як тег структури:

struct student { char name[25]; int id, age; char prp; };

Тег структури використовується для подальшого оголошення структур даного вигляду у формі:

struct тег список-ідентифікаторів;

Приклад:

struct studeut st1,st2;

Використання тегів структури необхідне для опису рекурсивних структур. Нижче розглядається використання рекурсивних тегів структури.

struct node { int data; struct node * next; } st1_node;

Тег структури node дійсно є рекурсивним, оскільки він використовується в своєму власному описі, тобто у формалізації покажчика next. Структури не можуть бути прямо рекурсивними, тобто структура node не може містити компоненту, що є структурою node, але будь-яка структура може мати компоненту, що є покажчиком на свій тип, як і зроблено в приведеному прикладі.

Доступ до компонентів структури здійснюється за допомогою вказівки імені структури і наступного через крапку імені виділеного компоненту, наприклад:

st1.name="Іванов";

st2.id=st1.id;

st1_node.data=st1.age;

Об'єднання (суміші)

Об'єднання подібно структурі, проте в кожен момент часу може використовуватися (або іншими словами бути у відповідь) тільки один з елементів об'єднання. Тип об'єднання може задаватися в наступному вигляді:

Union {опис елементу 1;

...

опис елементу n; };

Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється одна і та ж область пам'яті, тобто вони перекриваються. Хоча доступ до цієї області пам'яті можливий з використанням будь-якого з елементів, елемент для цієї мети повинен вибиратися так, щоб одержаний результат не був безглуздим.

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур. Тег об'єднання може бути формалізований точно так, як і тег структури.

Об'єднання застосовується для наступних цілей:

· ініціалізації використовуваного об'єкту пам'яті, якщо в кожен момент часу тільки один з багатьох об'єкт є активним;

· інтерпретації основного представлення об'єкту одного типу, неначебто цьому об'єкту був привласнений інший тип.

Пам'ять, яка відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найдовшого елементу об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити невживану пам'ять. Всі елементи об'єднання зберігаються в одній і тій же області пам'яті, починаючи з однієї адреси.

Приклад:

union { char fio[30];

char adres[80];

Int vozrast;

int telefon; } inform;

union { int ах;

char al[2]; } ua;

При використовуванні об'єкту infor типу union можна обробляти тільки той елемент який набув значення, тобто після присвоєння значення елементу inform.fio, не має сенсу звертатися до інших елементів. Об'єднання ua дозволяє дістати окремий доступ до молодшого ua.al[0] і до старшого ua.al[1] байтам двобайтового числа ua.ax.

Поля бітів

Елементом структури може бути бітове поле, що забезпечує доступ до окремих біт пам'яті. Поза структурами бітові поля оголошувати не можна. Не можна також організовувати масиви бітових полів і не можна застосовувати до полів операцію визначення адреси. У загальному випадку тип структури з бітовим полем задається в наступному вигляді:

struct { unsigned ідентифікатор 1: довжина-поля 1;

unsigned ідентифікатор 2: довжина-поля 2; }

довжина-поля задається цілим виразом або константою. Ця константа визначає число бітів, відведене відповідному полю. Поле нульової довжини позначає вирівнювання на границю наступного слова.

Приклад:

struct { unsigned a1: 1;

unsigned a2: 2;

unsigned a3: 5;

unsigned a4: 2; } prim;

Структури бітових полів можуть містити і знакові компоненти. Такі компоненти автоматично розміщуються на відповідних межах слів, при цьому деякі біти слів можуть залишатися невикористаними.

Посилання на поле бітів виконуються точно так, як і на компоненти загальних структур. Саме ж бітове поле розглядається як ціле число, максимальне значення якого визначається довжиною поля.

Змінні із змінною структурою

Дуже часто деякі об'єкти програми відносяться до одного і того ж класу, відрізняючись лише деякими деталями. Розглянемо, наприклад, представлення геометричних фігур. Загальна інформація про фігури може включати такі елементи, як площа, периметр. Проте відповідна інформація про геометричні розміри може виявитися різною залежно від їх форми.

Розглянемо приклад, в якому інформація про геометричні фігури представляється на основі комбінованого використання структури і об'єднання.

struct figure {

double area,perimetr; /* загальні компоненти */

int type; /* ознака компоненту */

union /* перелік компонент */

{ double radius; /* коло */

double а[2]; /* прямокутник */

double b[3]; /* трикутник */

} geom_fig;

} fig1, fig2;

У загальному випадку кожен об'єкт типу figure складатиметься з трьох компонентів: area, perimetr, type. Компонент type називається міткою активного компоненту, оскільки він використовується для вказівки, який з компонентів об'єднання geom_fig є активним в даний момент. Така структура називається змінною структурою, тому що її компоненти міняються залежно від значення мітки активного компоненту (значення type).

Відзначимо, що замість компоненти type типу int, доцільно було б використовувати перелічуваний тип. Наприклад, такий

enum figure_chess { CIRCLE,

BOX,

TRIANGLE };

Константи CIRCLE, BOX, TRIANGLE одержать значення відповідно рівні 0, 1, 2. Змінна type може бути оголошена як перелічуваний тип:

Date: 2016-07-25; view: 247; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию