Програмування С, С++теорія та практика (частина 1)
1.13.1 Оголошення структури
Структури дозволяють об’єднувати в єдиному об’єкті сукупність значень, які можуть мати різні типи. Оголошення структури здійснюється за допомогою ключового слова іігисі.
Синтаксис опису структури виглядає так :
5{гис{ [ім’я_структури]
{
типі елементі; тип2 елемент2;
типИ елементИ;
} [список описів];
З метою ознайомлення з цим типом даних розглянемо найпростіший приклад представлення поняття “дата”, що складається з декількох частин: число (день, місяць, рік), назва тижня та місяця:
з'Ьгис'Ь йа'Ье { іп£ йау ; іп£ топ'ЬЬ ; іп£ уеаг;
сЬаг йау_пате[15]; сЬаг топ_пате[14];
} агг[100],*рй,йа'Ьа,пем_йа£а;
В даному прикладі оголошуються:
йаіа, пем>_йаІа - змінні типу структури йаіе; рй - покажчик на тип йаґа
агг - масив із 100 елементів, кожний елемент якого має тип йаґе. Можливий і наступний опис структури з використанням Іурейе/:
£урегіе£ з'Ьгис'Ь туз'Ьгис'Ь { іп£ уеаг; сЬаг зіге;
£1оа£ £іе1гі;
} МЇ8ТКІТСТ;
МЇ8ТКГСТ з; /* те саме, що Й зїгисї туз'Ьгис'Ь з; */
Пам’ять розподіляється у структурі покомпонентно, зліва-направо, від молодших до старших адрес пам’яті (рис. 1.18).
■Ьурегіе£ з'Ьгис'Ь гі.а'ЬаТурез {
£1оа£ аЕІоа'Ь; іп£ апіп^; сЬаг а8^гіпд[8]; сЬаг аСЬаг; сЬаг аЬопд;
} Ба'ЬаТурез;
Ба'ЬаТурез гі.а'Ьа;
![]() |
![]() |
||||
![]() |
|||||
Рис. 1.18. Зберігання елементів структури у пам’яті
Потрібно відзначити, що на відміну від описів інших типів даних, опис структури не виділяє місця у пам’яті під елементи структури. Її опис визначає лише так званий шаблон, що описує характеристики змінних, що будуть розміщуватися у конкретній структурі. Щоб ввести змінні та зарезервувати для них пам’ять необхідно або після фігурної дужки, що завершує опис структури, вказати список ідентифікаторів,
як це зроблено у вищенаведеному прикладі, або окремо оголосити змінні типу, як ми це робимо у звичайних випадках.
Доступ до окремого елемента структури забезпечується операторами вибору: . (прямий селектор) та -> (непрямий селектор), наприклад,
з'Ьгис'Ь туз'Ьгис'Ь { іп£ і ;
сЬаг з'Ьг[21]; йоиЬ1е Й;
} з,*зр£г=&з;
з.і =3;
зр^г->й = 1.23;
Ініціалізація структури подібна до тієї, що у масивах, але з урахуванням розміщення даних різного типу.
з'Ьгис'Ь регзоп { сЬаг £гпт[20] ; сЬаг пт[30]; іп£ уеаг; сЬаг з;
};
зїгисї регзоп рое£={"Тагаз", "8ЬеV^сЬепк;о",1814, 'М'},
с1аззісз[]={{"А1£гей", "АЬо", 1939, 'М'},
{"Зеітоиг", "ЄіпгЬигд",}, /* ... */ {'^е££геу", "и1тап", 1938, 'М'}};
У вищенаведеному прикладі ініціалізується змінна роеґ і масив структур сіаззісз. Значення с1а88іс8[1].уеаг і с1а88іс8[1].8 мають значення відповідно 0 і ‘\0’.
Для змінних одного і того ж самого структурного типу визначена операція присвоювання, при цьому здійснюється поелементне копіювання значень полів.
зїгисї йа'Ье { іп£ Йау ; іп£ топ'ЬЬ ; іп£ уеаг;
сЬаг Йау_пате[15]; сЬаг топ_пате[14];
} Йа£а,пем_йа£а;
/* ... */
Йа£а=пем Йа£а;
Але, для порівняння структур необхідно перевіряти рівність відповідних полів цих структур.
з'Ьгис'Ь роіп£
{
£1оа£ х,у; сЬаг с;
} роіп^1,роіп^2;
і£ (роіп£1.х==роіп£2.х&&роіп'Ь1.у==роіп'Ь2.у&&
роіп£1.с==роіп£2.с)
{
/* ... */
};
Звертання до окремих елементів структури теж не викликає труднощів: йа£а.уеаг=2005 ;
ргіп^£("%й-%й-%й" ,йа'Ьа.йау,йа'Ьа.топ'ЬЬ,йа'Ьа.уеаг); зсап£("%й",йа£а.йау); де^з(агг[0].йау_пате);
Доцільним та корисним є зв’язок структур та покажчиків, який дозволяє обійти деякі складні моменти. Так опис йаіе *рйаїе утворить покажчик на структуру типу іїаґе. Використовуючи цей покажчик, можна звернутися до будь-якого елемента структури шляхом застосування операції -> , тобто йаіе ->уеаг , або що еквівалентно операції (*ріїаІе).уеаг. Однак слід зауважити, що спільне використання цих типів потребує від програміста достатньо високої кваліфікації, аби використовувати можливості найбільш ефективно та безпомилково.
Приклад 1.
#іпс1ийе<з'Ьйіо.Ь>
#іпс1ийе<сопіо.Ь>
#йе£іпе МАХТІТ 41 #йе£іпе МАХАШ? 31
з'Ьгис'Ь Ьоок {
сЬаг £і£1е[МАХТІТ]; сЬаг аи^Ьог[МАХАиТ];
£1оа£ Vа1ие;
};
Vоій таіп ()
{
з'Ьгис'Ь Ьоок ІіЬгу;
ргіп^£("Введіть назву книги.\п"); де£з(ІіЬгу.£і£1е) ;
ргіп^£("Тепер введіть прізвище автора.\п");
де£з(1іЬгу.аи'ЬЬог);
ргіп^£("Тепер введіть ціну.\п");
зсап£("%£",&1іЬгу.Vа1ие);
ргіп^£("\п%з '%з',%д дгп.\п",1іЬгу.аи^Ьог,
1іЬгу.£і£1е,1іЬгу.Vа1ие);
};
Кожний опис структури вводить унікальний тип структури, тому в наступному фрагменті програми:
з'Ьгис'Ь А { іп£ і,і; йоиЬ1е й;
} а, а1; з'Ьгис'Ь В { іп£ і,і; йоиЬ1е й;
} Ь;
об’єкти а і а1 мають однаковий тип кігисі А, але об’єкти а і Ь мають різні типи структури. Структурам можна виконувати присвоювання тільки в тому випадку якщо і вихідна структура, і структура, які присвоюється мають один і той же тип.
а = а1; /*можна виконати, так як а і а1 мають однаковий тип */ а = Ь; /* помилка */
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Схожі підручники
- РЕГІОНАЛЬНА ЕКОНОМІКА (частина 2)
- Как загубить собственный бизнес (онлайн)
- РОЗРАХУНКОВІ РОБОТИ З КУРСУ «ЕКОЛОГІЯ»
- Хрестоматія з Філософії (частина 1) (онлайн)
- ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 4) онлайн
- Конспект лекцій з курсу Введення у фінансову діяльність (частина 2)



