- •Теоретичні відомості загальні поняття
- •Struct { список визначень }
- •Об'єднання (суміші)
- •Int vozrast;
- •Int telefon; } inform;
- •Поля бітів
- •Змінні із змінною структурою
- •Int type; /* ознака компоненту */
- •Порядок виконання роботи
- •Приклад виконання завдання
- •1. Розробка алгоритму розв’язку.
- •Int no_children;
- •2. Визначення змінних програми
- •Int cnt; /* кількість ченців */
- •3. Розробка тексту програми
- •4. Відлагодження програми
- •5. Результати роботи програми
- •Варіанти завдань
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 може бути оголошена як перелічуваний тип:
enum figure_chess type;
В цьому випадку компілятор СІ попередить програміста про потенційно помилкові присвоєння, такі, наприклад, як
figure.type = 40;
У загальному випадку змінна структури складатиметься з трьох частин: набір загальних компонент, мітки активного компоненту і частини із змінними компонентами. Загальна форма змінної структури, має наступний вигляд:
struct { загальні компоненти;
мітка активного компоненту;
union { опис компоненти 1 ;
опис компоненти 2 ;
:::
опис компоненти n ;
} ідентифікатор-об'єднання ;
} ідентифікатор-структури ;
Приклад визначення змінної структури з ім'ям helth_record
struct { /* загальна інформація */
char name [25]; /* ім'я */
int age; /* вік */
char sex; /* стать */
/* мітка активного компоненту */
/* (сімейний стан) */
enum merital_status ins;
/* змінна частина */
union { /* неодружений */
/* немає компонент */
struct { /* знаходиться в шлюбі */
char marripge_date[8];
char spouse_name[25];
