СТРУКТУРИ ДАНИХ ТА ОБ’ЄДНАННЯ В С++.
План
Загальні відомості про структури.
Елемент структури типу поля бітів.
Об’єднання.
ЗАГАЛЬНІ ВІДОМОСТІ ПРО СТРУКТУРИ.
Структура - це структурований тип даних, що є
іменованою сукупністю різнотипних елементів.
Тип структура зазвичай використовується при
розробці інформаційних систем, баз даних.
Наприклад, відомості про виплату студентам
стипендії потрібно організувати у вигляді:
СТУДЕНТ
Прізвище
Курс
Стипендія
Група
Елементи такої структури (прізвище, курс, група,
стипендія) називаються полями. Кожному полю
повинно бути поставлено у відповідність ім'я і тип.
Формат опису структурного типу наступний:
struct ім’я_типу
{визначення_елементів};
Для розглянутого прикладу визначення відповідного
структурного типу може бути наступним:
struct student {
char fam[30];
int kurs;
char grup[3];
float stip;
};
Після цього student стає ім'ям структурного типу,
який може бути призначений деяким змінним. У
відповідність із стандартом С це потрібно робити
так:
struct student stud1, stud2;
Правила С++ дозволяють в цьому випадку службове
слово struct опускати і писати
student stud1, stud2;
Тут stud1 і stud2 — змінні структурного типу.
Можна взагалі не задавати ім'я типу, а описувати відразу змінні:
struct {
char fam[30];
int kurs;
char grup[3];
float stip; } stud1, stud2, *pst;
Звернення до елементів (полів) структурної величини
проводиться за допомогою уточненого імені
наступного формату:
ім'я_структури.ім’я_елемента
Приклади уточнених імен для описаних вище
змінних:
stud1.fam;
stud1.stip
Значення елементів структури можуть визначатися
введенням, привласненням, ініціалізацією.
Приклад ініціалізації в описі:
student stud1={"Кротов", 3, "Ф32",
350};
Нехай в програмі визначений покажчик на структуру
student *pst, stud1;
Тоді після виконання оператора привласнення
pst=&stud1;
до кожного елементу структурної змінної stud1 можна
звертатися трьома способами. Наприклад, для поля
fam
stud1.fam або (*pst).fam або pst->fam
У останньому варіанті використовується знак операції
доступу до елементу структури: —>. Аналогічно
можна звертатися і до інших елементів цієї змінної:
pst->FIO, pst->grup, pst->stip.
Допускається використання масивів структур.
Наприклад, відомості про 100 студентів можуть
зберігатися в масиві, описаному таким чином:
student stud[100];
Тоді відомості про окремих студентів
позначатимуться, наприклад, так:
stud [1].fam, stud[5].kurs
Якщо потрібно узяти першу букву прізвища 25-го
студента, то слід писати:
stud[25].fam[0].
Приклад 13.1. Ввести відомості про N студентів. Визначити прізвища студентів, що отримують найвищу стипендію.
#include <stdio.h>
#include <conio.h>
void main() {
const N=5;
int i;
float maxs;
struct student {
char fam[15];
int kurs;
char grup[3];
float stip; } ;
student stud[N] ;
clrscr();
for(i=0;i<N;i++)
{ printf("%d-y student", i);
printf("\n Prizvishe:");scanf("%s",&stud[i].fam);
printf("Kurs:"); scanf("%d",&stud[i].kurs);
printf("Grupa:"); scanf("%s",&stud[i].grup);
printf("Stupendiya:"); scanf("%f",&stud[i].stip);
}
maxs=0;
for(i=0;i<N;i++)
if(stud[i].stip>maxs) maxs=stud[i].stip;
printf("\n Student, sho otrimuyut maximalnu stipendiyu.",maxs);
for(i=0; i<N; i++)
if(stud[i].stip==maxs) printf("\n%s",stud[i].fam);
getch();
}
Елемент структури типу поля бітів.
Використання структури в програмі на С дозволяє працювати з
окремими бітами, тобто з розрядами двійкового коду. Для цього
використовуються елементи структури типу поля бітів.
Формат структури, що містить поля бітів, наступний:
struct ім’я_структури
{ тип ім’я_поля_1: довжина_ в_бітах;
тип ім’я_поля_2: довжина_ в_бітах;
. . .
тип ім’я_поля_N: довжина_в_бітах;
} ;
Як тип полів можуть використовуватися
специфікатори int, unsigned, signed.
Мінімальною величиной такого типу може бути
структура, що складається всього з одного бітового
поля.
Приклад опису такої структури:
struct onebit
{ unsigned bit:1;
} cod;
Звичайно, для змінної cod в пам'яті буде виділено 8
біт (1 байт), але використовуватися буде тільки
один перший біт.
ОБ'ЄДНАННЯ.
Об'єднання — це ще один структурований тип
даних.
union ім’я_типу
{ визначення_елементів};
Об'єднання відрізняється від структури способом
організації у внутрішній пам'яті. Всі елементи
об'єднання в пам'яті починаються з одного байта.
Хай в програмі описана структура:
struct s
{ int i;
char ch;
long int L;};
Розташування її елементів в пам'яті буде наступним:
Розглянемо об'єднання з наступним описом:
union s
{ int i;
char ch;
long int L;
};
Величина з таким типом в пам'яті буде розташована
таким чином:
Приклад 13.2. Складемо програму рішення наступної задачі: з клавіатури вводиться символ. Вивести на екран двійковий код цього символу.
//Отримання двійкового коду символа
#include <stdio.h>
#include <conio.h>
//Структура бітових полів
struct byte{
int b1:1;
int b2:1;
int b3:1;
int b4:1;
int b5:1;
int b6:1;
int b7:1;
int b8:1;
};
//Об’єднання - змінна
union bits
{char ch; byte cod;} u;
//Прототип функції декодування
void decode(bits x);
//Основна програма
void main()
{
do {u.ch=getche(); //Введеня символа з клавіатури
printf (":"); decode(u);
} while(u.ch!='q'); //Символ q- признак кінця введення
}
//Функція декодування
void decode(bits u)
{ if (u.cod.b8) printf("1"); else printf ("0");
if (u.cod.b7) printf ("1"); else printf ("0");
if (u.cod.b6) printf("1"); else printf("0");
if (u.cod.b5) printf("1"); else printf("0");
if( u.cod.b4) printf("1"); else printf("0");
if (u.cod.b3) printf("1"); else printf("0");
if (u.cod. b2 ) printf("1"); else printf ("0" );
if (u.cod.b1) printf("1"); else printf ("0"); printf("\n");
}
|