Структури даних та об’єднання в С++
План
Загальні відомості про структури.
Елемент структури типу поля бітів.
Об’єднання.
Загальні відомості про структури.
Структура - це структурований тип даних, що є
іменованою сукупністю різнотипних елементів.
Тип структура зазвичай використовується при
розробці інформаційних систем, баз даних.
Наприклад, відомості про виплату студентам
стипендії потрібно організувати у вигляді:
СТУДЕНТ
Прізвище
Курс
Стипендія
Група
Елементи такої структури (прізвище, курс,
група, стипендія) називаються полями.
Кожному полю повинно бути поставлено у
відповідність ім'я і тип.
Формат опису структурного типу наступний:
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");
}
|