Мова С++ Лекція 7 структури та об’єднання
Структура - це агрегатний тип даних, оскільки може містити в собі різнотипні елементи. Синтаксис оголошення структури в мові С ++ (створення нового типу даних): struct Type. Name { type 1 name 1; ……………… type 1 name 1; } ; Створення об’єкта нового типу: Type. Name var_1; Oб’єкт var_1 може бути створений і при оголошенні структури: struct Type. Name { type 1 name 1; ……………… type 1 name 1; } var_1 ; Ініціація елементів структури може бути здійснена безпосередньо при оголошенні: struct My. Struct { int i. Var; long L_Var; char name[10]; }mystruc = {10, 300 L, “Hello”};
Приклад – для створення бази даних необхідно про кожен будинок зберігати наступні дані: номер мікрорайону, назва вулиці, номер будинку, кількість поверхів, кількість квартир, наявність стоянки. Заповнення: struct HOUSE { unsignet short Reg. Num; char Street[51]; char House. Num[6]; unsignet short Max. Floor. Num; unsignet short Max. Flat. Num; bool Parking; }; HOUSE House; House. Reg. Num = 524; strcpy(House. Street, “ul. Kopernika”); strcpy(House. Num, ” 2 -a”); House. Max. Floor. Num =7; House. Max. Flat. Num=84; House. Parking=true; HOUSE House;
Робота із структурами Визначення розміру структурного об”єкта int і = sizeof(HOUSE); Оголошення поля структури з використанням бітових полів: <тип>< ім’я>: константа; struct DATETIME { unsigned short Year; unsigned short Month; unsigned short Date; unsigned short Hour; unsigned short Minute; unsigned short Second; }; struct DATETIME 2 { unsigned short Year: 7; unsigned short Month: 4; unsigned short Date: 5; unsigned short Hour: 6; unsigned short Minute: 6; unsigned short Second: 6; };
Приклад #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { struct DATETIME { unsigned short Year; unsigned short Month; unsigned short Date; unsigned short Hour; unsigned short Minute; unsigned short Second; }; struct DATETIME 2 { unsigned short Year: 7; unsigned short Month: 4; unsigned short Date: 5; unsigned short Hour: 6; unsigned short Minute: 6; unsigned short Second: 6; }; printf("unsigned short %dn", sizeof(unsigned short)); printf("DATETIME %dn", sizeof(DATETIME)); printf("DATETIME 2 %dn", sizeof(DATETIME 2)); system("PAUSE"); return EXIT_SUCCESS; }
Структура як аргумент функції Як параметр у прототипі функції вказується тип даних користувача, зформований при оголошенні структури. Оголошено структуру struct DATETIME { unsigned short Year; unsigned short Month; unsigned short Date; unsigned short Hour; unsigned short Minute; unsigned short Second; }; прототип функції буде мати вигляд: void Func(DATETIME); (Відбувається передача в тіло функції параметра типу структури по значенню. Оригінал структуровного типу не зазнає модифікації) Функція може також повертати об’єкт типу структури: DATETIME Func(DATETIME); В цьому випадку модифіковані дані будуть передані в точку виклику і не будуть втрачені
Приклад #include <cstdlib> #include <iostream> using namespace std; struct HOUSE { unsigned short Reg. Num; char Street[51]; char House. Num[6]; unsigned short Max. Floor. Num; unsigned short Max. Flat. Num; bool Parking; }; void Out. Adress(HOUSE); int main(int argc, char *argv[]) { HOUSE My. House; My. House. Reg. Num=524; strcpy(My. House. Street, "ul. Kopernika"); strcpy(My. House. Num, "3. a"); My. House. Max. Floor. Num=9; My. House. Max. Flat. Num=36; bool Parking=true; Out. Adress(My. House); system("PAUSE"); return EXIT_SUCCESS; } void Out. Adress(HOUSE house) {puts(house. Street); puts(house. House. Num); }
Масиви структур Оголошення масиву структур Приклад #include <cstdlib> #include <iostream> using namespace std; struct HOUSE { unsigned short Reg. Num; char Street[51]; char House. Num[6]; unsigned short Max. Floor. Num; unsigned short Max. Flat. Num; bool Parking; }; int main(int argc, char *argv[]) { HOUSE M_House[30]; for (int i=0; i<30; i++) itoa(i+1, M_House[i]. House. Num, 10); for (int i =0; i<30; i++) cout<<M_House[i]. House. Num<<'n'; system("PAUSE"); return EXIT_SUCCESS; } HOUSE M_House[30];
Вказівники на структури Для роботи з елементами структури через вказівники необхідно оголосити змінну типу вказівник на структуру. Тип_структури * ідент_вказівника; HOUSE * p. House; p. House->Parking=true; cout>>My. House. Parking;
Об‘єднання та операції з ними. Об‘єднання служить для розміщення в одній i тій же області пам‘яті (за тією ж адресою) даних різних типів. В кожен окремий момент часу в пам‘яті може знаходитися лише один із вказаних в оголошенні об‘єднання типів. union My. Data { Int i. Var; Unsigned long il. Freg; Char Symb[10]; }; Резервується місце в пам‘яті для розміщення самого великого елемента (в даному випадку – 10 байт під символьний масив) Ініціювання union My. Data { Int i. Var; Unsigned long il. Freg; Char Symb[10]; }my. X={25};
Неявне перетворення даних, представлених в десятковому форматі в двійково-десятковий код #include <cstdlib> #include <iostream> using namespace std; union BCI { unsigned char data; struct { unsigned char lo: 4; unsigned char hi: 4; }bin; }bcd; int main(int argc, char *argv[]) { bcd. data=152; cout<<"n. High: "<<(int)bcd. bin. hi; cout<<"n. Low: "<<(int)bcd. bin. lo<<'n'; system("PAUSE"); return EXIT_SUCCESS; }