Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...