Використання структур. Використання об’єднань

Сайт: Навчально-інформаційний портал НУБіП України
Курс: Програмування (КН). Ч2 ☑️
Книга: Використання структур. Використання об’єднань
Надруковано: Гість-користувач
Дата: четвер, 9 квітня 2026, 18:58

Опис


1. Оголошення та ініціалізація структур

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

Структура – це похідний тип даних. Вона створюється з об'єктів інших типів. Загальний формат об'яви нової структури такий:

struct назва_структури {

елементи_структури

                                          };


Приклад. 

struct coord {

char * namePoint;

float X;

float Y;

                    };

Визначення struct coord складається з трьох елементів: одного елементу типу char* (namePoint) та двох елементів типу float (X, Y).


Елементами структури можуть бути як змінні основних типів даних, так і агрегати, такі, як масиви, структури.

Елемент структури не може бути структурою такого ж типу, як структура, в якій він описаний.

 Але такий елемент може бути покажчиком на тип структури, в яку він входить.

Структура, яка містить покажчик, що посилається на структуру такого ж типу, називається структурою, що посилається на саму себе.



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

 Наприклад, в об'яві

struct coord myCoord, arrayCoord[52], *cPtr;

myCoord – змінна типу struct coord;  arrayCoord – масив, що складається із 52 елементів типу struct coord,

 cPtr – покажчик на struct coord.



•Ім'я для структури не є обов'язковим. Якщо воно відсутнє, то змінні для цієї структури можуть бути об'явлені тільки у визначенні структури.
•Наступні операції є допустимими для структур: присвоєння змінних-структур змінним того ж типу; узяття адреси (&); використання операції sizeof для визначення розміру структури.


Ключове слово typedef надає програмістові механізм для створення синонімів (або псевдонімів) для раніш визначених типів даних. Іншими словами, це ключове слово створює нове ім'я без створення нового типу:

typedef struct coord systemCoord;

typedef struct coord Coord;

typedef  longint Integer;



Структури можуть бути ініційовані, як і масиви, із  використанням списку ініціалізації. Наприклад, об'ява

struct coord myCoord = {“Точка 1”, 5.6, 10};

створює змінну myCoord типу struct coord і присвоює елементу namePoint значення  “Точка 1”, елементу X – 5.6, елементу – 10.



Якщо значень у списку ініціації менше кількості елементів у структурі, решті присвоюється 0 (або NULL, якщо елемент – покажчик). Змінним-структурам, якщо вони об'явлені як глобальні, присвоюється значення 0 або NULL. Структури можна ініціювати і за допомогою оператора присвоєння. При цьому можна або присвоїти змінній-структурі змінну того ж типу, або присвоїти значення окремим елементам структури.




2. Використання елементів структур

Для використання в програмі окремого елемента структури використовуються дві операції: операція елемента структури (.), яка ще називається операція-крапка, і операція покажчика структури (->), яка ще називається операція-стрілка. Наступна програма демонструє ці дві операції.


#include <stdio.h>

#include <conio.h>

 struct coord

 {char * namePoint;

 float X;

 float Y;

 };

 int main()

 {

 struct coord myCoord;

 struct coord *cPtr;

 myCoord.namePoint="Point 1";

 myCoord.X=5;

 myCoord.Y=4;



 cPtr=&myCoord;

/* Присвоєння адреси структури змінній-покажчику*/

 printf("%s%s%f ; %f\n

%s%s%f ; %f\n

%s%s%f ; %f\n",

 myCoord.namePoint," has coordinates: ",myCoord.X,myCoord.Y,

/* Використання елементів структури за допомогою операції-крапки*/

 cPtr->namePoint, "  has coordinates: ", cPtr->X,cPtr->Y,

/* Використання елементів структури за допомогою операції-стрілки */

  (*cPtr).namePoint, "  has coordinates: ", (*cPtr).X,(*cPtr).Y);

/* Використання елементів структури за допомогою операції-точки та непрямого адресування */

 getch();

 return 0;

}



Структури можуть передаватися функціям шляхом передачі окремих елементів структури, передачі всієї структури або передачі покажчика на структуру. Коли структури або їхні окремі елементи передаються функціям, вони передаються викликом за значенням. Тому функція, яку викликають, не може змінювати елементи структури у функції, що викликає.

Масиви структур, як і інші структури, викликаються за посиланням. Але, використовуючи структуру, в якій як елемент є масив, можна здійснити виклик масиву за значенням. Викликаючи структуру за значенням, ми і масив викликаємо за значенням.



Приклад програми , яка дозволяє визначити будь-яке комплексне число та вивести це число.

•Визначимо структуру number, яка складається з одного елемента -  int x, та структуру complex, яка складається з двох елементів – number realValue, number imageValue.
•Функція setComplex дозволяє визначити значення комплексного числа.
•Функція printComplex реалізує виведення комплексного числа. Як параметр цим функціям передається адреса структури complex, тобто адреса комплексного числа dataValue, яке визначено у функції main.

#include <conio.h>

#include <stdio.h>

#include <math.h>

//Створення структури number

typedef struct {

int x;

} number;

//Створення структури complex

typedef struct {

number realValue;

number imagValue;

} complex;

void setComplex (complex *);

void printComplex (complex *);



int main () {

complex dataValue;

printf("Complex number?\n");

setComplex(&dataValue);

printf("Reprezentation of the complex number:\n");

printComplex(&dataValue);

getch();

return 0;

}



//Встановлення значення комплексного числа

void setComplex(complex *c) {

printf("Real part:\n");

scanf("%d", &(c->realValue.x));

printf( "Image part:\n");

scanf("%d", &(c->imagValue.x));

}

//Виведення комплексного числа

void printComplex(complex *c) {

printf("%4d", c->realValue.x);

printf("%c",(c->imagValue.x < 0 ? '-' : '+'));

printf("%4di", abs(c->imagValue.x));

}



3. Передача структур у функції

Структури можуть передаватися функціям шляхом передачі окремих елементів структури, передачі всієї структури або передачі покажчика на структуру. Коли структури або їхні окремі елементи передаються функціям, вони передаються викликом за значенням. Тому функція, яку викликають, не може змінювати елементи структури у функції, що викликає.

Масиви структур, як і інші структури, викликаються за посиланням. Але, використовуючи структуру, в якій як елемент є масив, можна здійснити виклик масиву за значенням. Викликаючи структуру за значенням, ми і масив викликаємо за значенням.


Приклад програми , яка дозволяє визначити будь-яке комплексне число та вивести це число.

•Визначимо структуру number, яка складається з одного елемента -  int x, та структуру complex, яка складається з двох елементів – number realValue, number imageValue.
•Функція setComplex дозволяє визначити значення комплексного числа.
•Функція printComplex реалізує виведення комплексного числа. Як параметр цим функціям передається адреса структури complex, тобто адреса комплексного числа dataValue, яке визначено у функції main.

#include <conio.h>

#include <stdio.h>

#include <math.h>

//Створення структури number

typedef struct {

int x;

} number;

//Створення структури complex

typedef struct {

number realValue;

number imagValue;

} complex;

void setComplex (complex *);

void printComplex (complex *);



int main () {

complex dataValue;

printf("Complex number?\n");

setComplex(&dataValue);

printf("Reprezentation of the complex number:\n");

printComplex(&dataValue);

getch();

return 0;

}



//Встановлення значення комплексного числа

void setComplex(complex *c) {

printf("Real part:\n");

scanf("%d", &(c->realValue.x));

printf( "Image part:\n");

scanf("%d", &(c->imagValue.x));

}

//Виведення комплексного числа

void printComplex(complex *c) {

printf("%4d", c->realValue.x);

printf("%c",(c->imagValue.x < 0 ? '-' : '+'));

printf("%4di", abs(c->imagValue.x));

}



4. Приклад программи з використанням структур

Приклад

Ввести інформацію про студента (прізвище, ім'я)

 3 бали за  іспити

дата  народження

Вивести цю інформацію та середній бал




#include <stdio.h>

typedef struct {

    int Prog;

    int Math;

    int History;

} markss;

student nubipstudent[10];


typedef struct {

char name [12];

char surname [12];

 markss mark;

/*struct {

    int Prog;

    int Math;

    int History;

}mark;*/

struct {

int day;

int month;

int year;}birth;

} student;

student nubipstudent[10];


void printInformation(student any)

{

    printf("\n Name\n");

    printf("%s\n",any.name);

    printf("%s\n",any.surname);

    printf("\n 3 marks\n");

    printf("%4d ",any.mark.Prog);

    printf("%4d",any.mark.Math);

    printf("%4d",any.mark.History);

    printf("\n  birthday\n");

    printf("%4d",any.birth.day);

    printf("%4d",any.birth.month);

    printf("%6d",any.birth.year);

    printf("\n  rating\n");

    printf("%.2f",(any.mark.Prog+any.mark.Math+any.mark.History)/3.0);

}


student getInformation()

{

    student any;

    printf("\n input name\n");

    scanf("%s",&any.name);

    printf("\n input surname\n");

    scanf("%s",&any.surname);

    printf("\n input 3 marks\n");

    scanf("%d",&any.mark.Prog);

     scanf("%d",&any.mark.Math);

      scanf("%d",&any.mark.History);

      printf("\n input birthday\n");

    scanf("%d",&any.birth.day);

    scanf("%d",&any.birth.month);

    scanf("%d",&any.birth.year);

      return any;

}


int main()

{

    int q,k;

     printf("Input quantity of person \n");

    scanf ("%d",&q);

    k=0;

    printf("\nInput  elenents of struct\n");

    while (k<q)

    {

        nubipstudent[k]=getInformation();

        k++;

    }


 k=0;

     while (k<q)

    {

         printf("\n Person N %d\n",k+1);

          printInformation(nubipstudent[k]);

        k++;

    }

 return 0;

}




5. Використання структур (відео)

https://www.youtube.com/watch?v=TKawAymgG0Q

Доступність

Шрифти Шрифти

Розмір шрифта Розмір шрифта

1

Колір тексту Колір тексту

Колір тла Колір тла

Кернінг шрифтів Кернінг шрифтів

Видимість картинок Видимість картинок

Інтервал між літерами Інтервал між літерами

0

Висота рядка Висота рядка

1.2

Виділити посилання Виділити посилання

Вирівнювання тексту Вирівнювання тексту

Ширина абзацу Ширина абзацу

0