Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив WinRAR / 2_Посібник_С_002.doc
Скачиваний:
39
Добавлен:
17.05.2015
Размер:
2.7 Mб
Скачать

10. Структури, об’єднання, перерахування

7.1 Структури

Структура– це сукупність логічно зв’язаних даних різних типів.

При визначенні структури створюється новий тип, на основі простих і (або) похідних типів.

Синтаксис визначення структури:

struct <назва структури>

{

<опис елементів>

};

де назва структури - це імя типу структури;

опис елементів – програмний блок, де приволиться визначення елементів.

Визначення структури може не містити імені. Такі структури називаються анонімними.

Змінні типу структури називають об’єктом структури. Склад цих об’єктів визначатиметься при оголошенні. Для виділення пам’яті під обєкт структури необхідно оголосити змінну типу структури.

Синтаксис оголошення змінної типу структури:

struct <назва структури> < ім’я змінної>;

де ім’я змінної- це ідентифікатор, який використовується для доступу до обєкту стуктури;

назва структури– імя типу структури.

Приклад 1.Створення структури.

struct lab

{

int num;

char* name;

}; /* визначення структурного типу з іменем lab*/

/* … */

int main(void)

{

/* … */

struct lab Lаb_10;/* створення об’єкту Lab_10 типу структури

lab.*/

/* … */

return 0;

}

Можна одночасно визначати структурний тип і описувати за допомогою нього структуру:

Приклад 2. Оголошення об’єкту зразу після створення структури.

struct gr /* ім’я структурного типу*/

{

short int day; /* елемент структури*/

int month,year; /* однотипні елементи структури*/

} date; /* ім’я структурної змінної*/

Елементи структури називають полями (day, month, year). Поля можуть бути будь-якого базового чи похідного типу, наприклад, масивом, покажчиком, об’єднанням або іншою структурою.

Для звернення до полів структури використовуються уточнені іменачерез операцію вибору: “крапка” (“.”) при зверненні через ім’я структури і операцію непрямого доступу “->” при зверненні через покажчик.

Приклад 3. Присвоєння полям структури деяких значень.

date.day=10; /*звернення до поля day через об’єкт date */

struct gr *ptrdate=&date; /* створення покажчика ptrdate на об’єкт date */

ptrdate->year=2012; /*Ініціалізація поля year через покажчик на об'єкт ptrdate */

Введення/виведення структур виконується поелементно.

Приклад 4.Введення даних в поле day структури date.

scanf(“%i”, &date.day);

Структури одного типу можна копіювати. Структури, пам’ять під які виділяється на етапі компіляції, можна ініціалізувати, перераховуючи значення їх елементів.

Приклад 5.Ініціалізація полів структури Lab_10.

struct gr date = {1, 2, 3}.

Можна створювати масиви структур.

Приклад 6.Створення масиву структур.

/* структура для опису дати*/

structdate

{

intday, month, year;

};

/* … */

intmain(void)

{

/* … */

structdate d[5]={{1,3,1980},{5,1,1990},{1,1,2002}};

/* масив з 5-ти структур типу date , кожна з

яких складається з 3-х елементів типу int,

яким надаються початкові значення*/

/* … */

return 0;

}

Приклад 7.Написати програму, яка зчитуватиме дані про студентів, і видаватиме інформацію про них за введеною фамілією. Приклад структури наведений у таблиці 7.1.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

structSpysok

{

char PIB[20]; /* прізвище студента*/

char Grup[10]; /* назва групи*/

intOt[3]; /*3 оцінки*/

floatS_Bal; /* середній бал*/

} *vid; /* покажчик на структуру*/

voidVvid(int nom, Spysok *vid)

{

printf("\n Vvedit vidomosti \n %i", (nom+1));

printf("\n PIB - ");

scanf("%s", vid->PIB);

printf(" Nomer Gr - ");

scanf("%s", vid->Grup);

floats=0;

for(inti=0; i<3; i++)

{

printf("\n Otsinki - ");

scanf("%i", &vid->Ot[i]);

s+=vid->Ot[i];

}

vid->S_Bal=s/3;

}

intmain(void)

{

structSpysok Stud[50];

inti, N;

charLitera;

printf ("\n Vvedit kilkist studentiv u grupi < 50 ");

scanf("%i", &N);

for(i=0; i<N; i++)

Vvid(i, &Stud[i]);

printf("\n Spysok studentiv");

for(i=0;i<N;i++)

printf("\n %s \n %s \n %f", Stud[i].PIB,

Stud[i].Grup, Stud[i].S_Bal);

printf("\n Poshuk vidomostey pro studentiv za

pershoyu literoyu prizvyscha\n");

scanf("%c", &Litera);

if(islower(Litera))

toupper(Litera);

printf("\n Vidomosti pro Students:");

int kod_p = 0;

for(i=0; i<N; i++)

if(Stud[i].PIB[0]==Litera)

{

kod_p = 1;

printf("\n %s \n %s \n %f", Stud[i].PIB,

Stud[i].Grup, Stud[i].S_Bal);

}

if(kod_p==0)

printf(" Takyx nemae!");

system("PAUSE");

return 0;

}

Результат роботи програми:

Таблиця 7.1 – Структура з даними про студентів (Приклад 6).

Назва

Індекси

0

1

2

3

Stud.PIB

Філіпчук

Олєйнікова

Білоус

Подольський

Stud.Grup

1СІ-10

1СІ-10

1СІ-10

1СІ-10

Stud.Ot

5

5

4

4

5

5

5

5

5

5

4

5

Stud.S_Bal

4.66

4.66

5

4.66

Stud[0].PIB=”Філіпчук”

Stud[3].S_Bal=4.66

Stud[0].Ot[2]=4 (тому що рахуючи з 0, 2-га оцінка Філіпчук - 4)

Так само можна звертатись до кожного символу рядкових полів:

Stud[0].PIB[2]=’л’

Stud[1].Grup[3]=’-’

Перевизначення структур в межах однієї області видимості не дозволяються, за виключенням випадку коли перевизначення здійснюється в різних програмних блоках. У випадку визначення структури у окремому програмному блоці, область видимості цього визначення закінчується з закінченням програмного блоку, в якому міститься це визначення.

Приклад 8.Області видимості визначень структур.

struct st /* Глобально-видиме визначення */

{

intivar;

charpstr[8];

};

voidfunc(void)

{

struct st;/* Визначення, яке видиме тільки в межах

функції func */

{

int ivar;

char pstr[8];

float fvar;

};

/* ... */

}

/* ... */

Код, наведений у прикладі 8 є коректним. Але слід застерегти від подібного роду перевизначень, що суттєво ускладнюють розуміння і супроводження програм, написаних у такому стилі.

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

Бітове поле – це число, що займає деякий набір бітів і напряму не може бути адресоване процесором. Синтаксис визначення полів і доступу до них базується на синтаксисі структур.

Приклад 9.Визначення бітових полів.

struct pol

{

unsigned charR:2;

unsigned charG:3;

unsigned charB:3;

} color;

Рисунок *.* Розташування бітових полів у памяті

У прикладі 8 розглятуто варіант визначення структури pol, що містить бітові поля. Число, наступне за двокрапкою у описі елементу структури, задає ширину бітового поля. Зображення образу об’єкту color, який має тип pol у памяті представлено на рисунку *.*.

Приклад 10.Робота з бітовими полями.

#include <stdio.h>

#include <stdlib.h>

structpol

{

unsigned charR:2;

unsigned charG:3;

unsigned charB:3;

};

intmain (void)

{

structpol color;

color.R = 3;

color.G = 6;

color.B = 3;

printf("R=%d\nG=%d\nB=%d\n", color.R, color.G, color.B);

system("pause");

return 0;

}

Результат роботи програми:

Соседние файлы в папке Архив WinRAR