06 Data Structures
-
Upload
olegapster -
Category
Technology
-
view
271 -
download
0
Transcript of 06 Data Structures
Бублик Володимир Васильович
Програмування - 2
Лекція 6. Базові поняття програмування.Структури даних
Лекції для студентів 2 курсу
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
2
Структури даних
1. Структури2. Бітові поля3. Об'єднання
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
3
Структури
Визначення структури ― це окремий оператор
• struct Point• { • double _x;• double _y;• };
Ми не робимо жодних припущень про розміщення полів структури в пам'яті
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
4
C vs. C++
C• struct Point u;
C++• Point u;
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
5
Графічне зображення
Тепер можна визначити об'єкт типу Point, змінний або сталий
• Point u = {1,1};• const Point zero = {0, 0};
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
6
Загадка
Чому компілятор не пропустить визначення компілятора без ініціалізації
• const double pi; //ERRORта вимагатиме const double pi=3.141592653589793;
але дозволить неповне визначення сталої структури
const Point zero;хоча воно мало б бути некоректним?
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
7
Діаграма об'єкту
• Point u = {1,1};
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
8
Діаграма структури
• struct Point• { • double _x;• double _y;• };
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
9
Графічне зображення
Ми не робимо жодних припущень про розміщення полів структури в пам'яті
• struct Collection• {• char _chr;• double _d;• short int _si;• float _f;• };
Адреси пам'яті
1245032
1245032 + 11245040 + 81245048 + 21245052 + 4
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
10
Cтруктура vs. масив
• Point u = {1,1};
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
11
Cтруктура vs. масив
• Point u = {1,1}; double u[2] = {1,1};
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
12
Указник на структуру
• Point u = {1,1}; double u[2] = {1,1};• Point *p = &u;
Point*
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
13
Елемент масиву vs. поле структури
Для доступу до елементів масиву застосовується адресна арифметика; індекси елементів масиву можна обчислювати, за індексами можна організовувати цикли;
Поля структури задаються оператором доступу до члена структури (крапка-оператор)
• Point u = {1, 1}; double u[2] = {1,1};• u._x; u._y; u[0] == *u;• u[1] == *(u+1);
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
14
Указник на поле структури
• Point u = {1,1};
За допомогою указника структури• Point *p = &u;• p -> _x == (*p)._x
За допомогою указників окремих полів• double *px = &u._x;• double *py = &u._y;
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
15
Присвоєння структур
Присвоєння структур визначено; воно виконується поелементно
• Point u = {1, 1};• Point v = {2, 3};• u=v;• cout<<u ._x <<u._y<<endl; // 2 3• v._x = 10; v._y = 20;• cout<<u ._x <<u._y <<endl; // 2 3
Зміна значення v на u не впливає
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
16
Присвоєння структур vs. присвоєння масивів
Присвоєння масивів не визначено. ― Чому?• double x[2] = {1, 2};• double y[2] = {10, 20};
• x = y; // ERROR!Приводить до помилки компіляції
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
17
Присвоєння структур vs. присвоєння масивів
Але присвоєння указників визначене• double *x = new double[2];• double *y = new double[2];• y[0] = 10; y[1] = 20;
• x = y;• out<<x[0]<<' '<<x[1]<<endl; // 10 20
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
18
Присвоєння структур vs. присвоєння масивів
Присвоєння указників визначене• double *x = new double[2];• double *y = new double[2];• y[0] = 10; y[1] = 20;
• x = y;• out<<x[0]<<' '<<x[1]<<endl; // 10 20Але• y[1]=30;• out<<x[0]<<' '<<x[1]<<endl; // 10 30Чому?
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
19
Поверхневе присвоєння масивів
• double *x = new double[2];• double *y = new double[2];• y[0] = 10; y[1] = 20;
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
20
Поверхневе присвоєння масивів
• double *x = new double[2];• double *y = new double[2];• y[0] = 10; y[1] = 20;• x = y;
втрата пам'яті
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
21
Поверхневе присвоєння масивів
• y[1]=30;• out<<x[0]<<' '<<x[1]<<endl; // 10 30
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
22
Поля - указники
• struct BuiltInArray• {• int *_k;• };• BuiltInArray a, b;• a._k = new int[2];• a._k[0] = 1;• a._k[1] = 2;• b._k = new int[2];• b._k[0] = 10;• b._k[1] = 20
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
23
Поля - указники
• a = b;• out<<a._k[1]<<endl; // 10
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
24
Поля - указники
• a = b;• out<<a._k[1]<<endl; // 10
• b._k[1] = 100;• out<<a._k[1];
• знову втрата пам'яті
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
25
Поля - указники
Елементи масиву b._k[i] не вдасться просто переписати на місце масиву a._k[2] через відмінність в розмірності
• BuiltInArray a, b;• a._k = new int[2];• a._k[0] = 1;• a._k[1] = 2;• b._k = new int[100];• b._k[0] = 10;• b._k[1] = 20• …………….
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
26
Бітові поля
• struct StatusByte• {• unsigned clear_to_send: 1;• unsigned data_ready: 1;• unsigned record_end: 1;• unsigned received_line: 1;• unsigned trans_allowed: 1;• unsigned line_ready: 1;• unsigned ring_detected: 1;• unsigned signal_accepted: 1;• };
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
27
Об'єднання
• union Word• {• unsigned int _k;• float _x;• };
• Word w;• w._x = 1; • out<<dec<<w._x<<' '<<hex<<w._k<<endl;• // 1 3f800000
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
28
Об'єднання
• union Word• {• unsigned int _k; //a1b1c1d1• struct Bytes4• {• unsigned _byte1: 8; //d1• unsigned _byte2: 8; //c1• unsigned _byte3: 8; //b1• unsigned _byte4: 8; //a1• } _word;• };
© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних
29
Визначення типів
Деякі стандартні типи• typedef unsigned short wchar_t;• typedef long time_t;• typedef unsigned int size_t;
Старомодне визначення структури• typedef struct {• char *a0; // pointer to the first argument• int offset; // byte offset of next parameter• } va_list;