Інформатика
Структури : Оголошення структури
 

Оголошення структури

     Структури дозволяють об'єднувати в єдиному об'єкті сукупність значень, які можуть мати різні типи. Оголошення структури здійснюється за допомогою ключового слова struct.
Синтаксис опису структури виглядає так :
struct [імя_структури]

{

     тип_1 імя_поля_1;

     тип_2 імя_поля_2;

     ...;

     тип_n імя_поля_n;

};

де імя_структури - ім'я структури шаблону, що задовольняє правилам завдання ідентифікаторів мови C++;

тип_1, тип_2,..., тип_n - будь-які призначені типи;

імя_поля_1,..., імя_поля_n - ідентифікатори полів, що задовольняють правилам завдання ідентифікаторів.

     З метою ознайомлення з цим типом даних розглянемо найпростіший приклад представлення поняття "дата", що складається з декількох частин: число (день, місяць, рік), назва тижня та місяця:
struct date

{
     int day ;
     int month ;
     int year;
     char day_name[15];
     char mon_name[14];
} arr[100],*pd,data,new_data;
     В даному прикладі оголошуються:
data, new_data - змінні типу структури date;
pd - покажчик на тип data;
arr - масив із 100 елементів, кожний елемент якого має тип date.
Можливий і наступний опис структури з використанням typedef:
typedef struct mystruct

{
     int year;
     char size;
     float field;
} MYSTRUCT;
MYSTRUCT s;      /* те саме, що й struct mystruct s; */

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

1.Використовуючи оператор разіменування:

імя _структурної_змінної. імя_поля.

2.Використовуючи оператор покажчика на структуру:

покажчик_на_структуру-> імя_поля.

Наприклад,
struct mystruct

{
     int i;
     char str[21];
     double d;
} s,*sptr=&s;
s.i =3;
sptr->d = 1.23;
     Ініціалізація структури подібна до тієї, що у масивах, але з урахуванням розміщення даних різного типу.
struct person

{
     char frnm[20];
     char nm[30];
     int year;
     char s;
};

person poet={"Taras", "Shevtchenko",1814, 'M'},

classics[]={{"Alfred", "Aho", 1939, 'M'},

     {"Seimour", "Ginzburg"},

     {"Jeffrey", "Ulman", 1938, 'M'}};
     У вищенаведеному прикладі ініціалізується змінна poet і масив структур classics. Значення classics[1].year і classics[1].s мають значення відповідно 0 і '\0'.
     Для змінних одного і того ж самого структурного типу визначена операція присвоювання, при цьому здійснюється поелементне копіювання значень полів.
struct date

{
     int day ;
     int month ;
     int year;
     char day_name[15];
     char mon_name[14];
} data,new_data;
/* ... */
data=new_data;
Але, для порівняння структур необхідно перевіряти рівність відповідних полів цих структур окремо.
struct point
{
     float x,y;
     char c;
} point1,point2;
if ((point1.x==point2.x)&&(point1.y==point2.y)&&(point1.c==point2.c))
{
/* … */
};
     Кожний опис структури вводить унікальний тип структури, тому в наступному фрагменті програми:
struct A

{
     int i,j;
     double d;
} a, a1;
struct B

{
     int i,j;
     double d;
} b;
об'єкти a і a1 мають однаковий тип struct A, але об'єкти a і b мають різні типи структури.      Структурам можна виконувати присвоювання тільки в тому випадку якщо і вихідна структура, і структура, які присвоюється мають один і той же тип.
a = a1;      //можна виконати, так як a і a1 мають однаковий тип
a = b;      // помилка

Приклад 1. Введення і виведення змінної типа структура.
#include<iostream.h>
struct book
{
     char title[45];
     char author[30];
     float value;
};
void main()
{
     book libry;
     cout<<"Введiть назву книги.\n";
     cin>>libry.title;
     cout<<"Тепер введiть прiзвище автора.\n";
     cin>>libry.author;
     cout<<"Тепер введiть цiну.\n";
     cin>>libry.value;
     cout<<"\n"<<libry.author <<" "<<libry.title<<" "<<libry.value;

}

 
© 2008 ХНУРЭ, Інформатики, Сінельнікова Т.Ф., informatika@kture.Kharkov.ua
Розроблено за допомогою LERSUS