![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Структури дозволяють об'єднувати в єдиному об'єкті сукупність значень, які можуть мати різні типи. Оголошення структури здійснюється за допомогою ключового слова struct.
Синтаксис опису структури виглядає так:
struct [ім'я_структури]
{
тип1 елемент1;
тип2 елемент2;
........................
типN елемент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.18).
typedef struct dataTypes {
float aFloat;
int anInt;
char aString[8];
char aChar;
char aLong;
} DataTypes;
DataTypes data;
Потрібно відзначити, що на відміну від описів інших типів даних, опис структури не виділяє місця у пам'яті під елементи структури. Її опис визначає лише так званий шаблон, що описує характеристики змінних, що будуть розміщуватися у конкретній структурі. Щоб ввести змінні та зарезервувати для них пам'ять необхідно або після фігурної дужки, що завершує опис структури, вказати список ідентифікаторів, як це зроблено у вищенаведеному прикладі, або окремо оголосити змінні типу, як ми це робимо у звичайних випадках.
Доступ до окремого елемента структури забезпечується операторами вибору:. (прямий селектор) та -> (непрямий селектор), наприклад,
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;
};
struct 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)
{
/* … */
};
Звертання до окремих елементів структури теж не викликає труднощів:
data.year=2005;
printf("%d-%d-%d",data.day,data.month,data.year);
scanf("%d",data.day);
gets(arr[0].day_name);
Доцільним та корисним є зв'язок структур та покажчиків, який дозволяє обійти деякі складні моменти. Так опис date *pdate утворить покажчик на структуру типу date. Використовуючи цей покажчик, можна звернутися до будь-якого елемента структури шляхом застосування операції ->, тобто date ->year, або що еквівалентно операції (*pdate).year. Однак слід зауважити, що спільне використання цих типів потребує від програміста достатньо високої кваліфікації, аби використовувати можливості найбільш ефективно та безпомилково.
Приклад 1.
#include<stdio.h>
#include<conio.h>
#define MAXTIT 41
#define MAXAUT 31
struct book
{
char title[MAXTIT];
char author[MAXAUT];
float value;
};
void main()
{
struct book libry;
printf("Введiть назву книги.\n");
gets(libry.title);
printf("Тепер введiть прiзвище автора.\n");
gets(libry.author);
printf("Тепер введiть цiну.\n");
scanf("%f",&libry.value);
printf("\n%s '%s',%g grn.\n",libry.author,
libry.title,libry.value);
};
Кожний опис структури вводить унікальний тип структури, тому в наступному фрагменті програми:
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; /* помилка */
Дата публикования: 2015-01-23; Прочитано: 952 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!