Оголошення структури
Структури дозволяють об'єднувати в єдиному об'єкті сукупність значень, які можуть мати різні типи. Оголошення структури здійснюється за допомогою ключового слова 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;
}