Тема: структури та об'єднання. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема: структури та об'єднання.



Питання:

1.Структури

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

Cтруктури

Cтруктура - це складовий об'єкт, в який входять елементи будь-яких типів, за винятком функцій. На відміну від масиву, який є однорідним об'єктом, структура може бути неоднорідною. Тип структури визначається записом виду:

struct {список визначень}

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

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

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

Приклад:

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

struct {int year;

char moth, day;} date1, date2;

Змінні s1, s2 визначаються як структури, кожна з яких складається з двох компонент х і у. Змінна sm визначається як масив з дев'яти структур. Кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day. > P> Існує й інший спосіб асоціювання імені з типом структури, він заснований на використанні тега структури. Тег структури аналогічний тегу перечислимого типу. Тег структури визначається наступним чином:

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 ax;

char al [2];} ua;

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

Питання для контролю:

1.Що таке структура?

2. Який синтаксис має структура?

3. Що таке обєднання?

Література:

1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 170-181

 

Урок №17

(згідно робочої навчальної програми)

Тема:Порівняння і привласнення структур, ініціалізація структур

Питання:

1.Робота з структурами.

2.Ініціалізація структур.

Робота з структурами.

При оголошенні змінної їй можна присвоїти початкове значення, приєднуючи ініціатор до описувач. Ініціатор починається зі знака "=" і має такі форми.

Формат 1: = ініціатор;

Формат 2: = {список - ініціаторів};

Формат 1 використовується при ініціалізації змінних основних типів і покажчиків, а формат 2 - при ініціалізації складових об'єктів.

Приклади:

char tol = 'N';

Змінна tol ініціалізується символом 'N'.

const long megabute = (1024 * 1024);

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

static int b [2] [2] = {1,2,3,4};

Ініціалізація структур

Ініціалізується двомірний масив b цілих величин елементів масиву привласнюються значення зі списку. Ця ж ініціалізація може бути виконана таким чином:

static int b [2] [2] = {{1,2}, {3,4}};

При ініціалізації масиву можна опустити одну або декілька размерностей

static int b [3 [] = {{1,2}, {3,4}};

Якщо при ініціалізації вказано менше значень для рядків, то решта елементи инициализируются 0, тобто при описі

static int b [2] [2] = {{1,2}, {3}};

елементи першого рядка отримають значення 1 і 2, а другий 3 і 0.

При ініціалізації складових об'єктів, потрібно уважно стежити за використанням дужок і списків ініціалізаторів.

Приклади:

struct complex {double real;

double imag;} comp [2] [3] =

{{{1,1}, {2,3}, {4,5}},

{{6,7}, {8,9}, {10,11}}};

У даному прикладі ініціалізується масив структур comp з двох рядків і трьох стовпців, де кожна структура складається з двох елементів real і imag.

struct complex comp2 [2] [3] =

{{1,1}, {2,3}, {4,5}, {6,7}, {8,9}, {10,11}};

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

- Перша ліва фігурна дужка - початок складеного ініціатора для масиву comp2;

- Друга ліва фігурна дужка - початок ініціалізації першого рядка масиву comp2 [0]. Значення 1,1 присвоюються двом елементам першої структури;

- Перша права дужка (після 1) вказує компілятору, що список ініціаторів для рядка масиву закінчено, і елементи залишилися структур в рядку comp [0] автоматично ініціалізувалися нулем;

- Аналогічно список {2,3} ініціалізує першу структуру в рядку comp [1], а що залишилися структури масиву звертаються в нулі;

- На наступний список ініціалізаторів {4,5} компілятор буде повідомляти про можливу помилку так як рядок 3 в масиві comp2 відсутня.

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

Приклад:

union tab {unsigned char name [10];

int tab1;

} Pers = {'A', 'H', 'T', 'O', 'H'};

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

Ініціалізацію масиву символів можна виконати шляхом використання строкового літерала.

char stroka [] = "привіт";

Ініціалізується масив символів з 7 елементів, останнім елементом (сьомим) буде символ '\ 0', яким завершуються всі рядкові літерали.

У тому випадку, якщо задається розмір масиву, а строковий літерал довший, ніж розмір масиву, то зайві символи відкидаються.

Наступне оголошення ініціалізує змінну stroka як масив, що складається з семи елементів.

char stroka [5] = "привіт";

У змінну stroka потрапляють перші п'ять елементів літерала, а символи 'Т' і '\ 0' відкидаються.

Якщо рядок коротший, ніж розмір масиву, то решта елементи масиву заповнюються нулями.

Відзначимо, що ініціалізація змінної типу tab може мати наступний вигляд:

union tab pers1 = "Антон";

і, таким чином, в символьний масив потраплять символи:

'А', 'Н', 'Т', 'О', 'Н', '\ 0',

а інші елементи будуть ініціалізований нулем.

Питання для контролю:

1.Що таке структура?

2. Який ініціалізувати масив символів?

3.Як працювати зі структурою?

Література:

1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 181-183

Урок №18

(згідно робочої навчальної програми)



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 298; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.115.120 (0.01 с.)