Top Banner
Бублик Володимир Васильович Програмування - 2 Лекція 6. Базові поняття програмування. Структури даних Лекції для студентів 2 курсу
29

06 Data Structures

Jul 11, 2015

Download

Technology

olegapster
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 06 Data Structures

Бублик Володимир Васильович

Програмування - 2

Лекція 6. Базові поняття програмування.Структури даних

Лекції для студентів 2 курсу

Page 2: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

2

Структури даних

1. Структури2. Бітові поля3. Об'єднання

Page 3: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

3

Структури

Визначення структури ― це окремий оператор

• struct Point• { • double _x;• double _y;• };

Ми не робимо жодних припущень про розміщення полів структури в пам'яті

Page 4: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

4

C vs. C++

C• struct Point u;

C++• Point u;

Page 5: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

5

Графічне зображення

Тепер можна визначити об'єкт типу Point, змінний або сталий

• Point u = {1,1};• const Point zero = {0, 0};

Page 6: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

6

Загадка

Чому компілятор не пропустить визначення компілятора без ініціалізації

• const double pi; //ERRORта вимагатиме const double pi=3.141592653589793;

але дозволить неповне визначення сталої структури

const Point zero;хоча воно мало б бути некоректним?

Page 7: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

7

Діаграма об'єкту

• Point u = {1,1};

Page 8: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

8

Діаграма структури

• struct Point• { • double _x;• double _y;• };

Page 9: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

9

Графічне зображення

Ми не робимо жодних припущень про розміщення полів структури в пам'яті

• struct Collection• {• char _chr;• double _d;• short int _si;• float _f;• };

Адреси пам'яті

1245032

1245032 + 11245040 + 81245048 + 21245052 + 4

Page 10: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

10

Cтруктура vs. масив

• Point u = {1,1};

Page 11: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

11

Cтруктура vs. масив

• Point u = {1,1}; double u[2] = {1,1};

Page 12: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

12

Указник на структуру

• Point u = {1,1}; double u[2] = {1,1};• Point *p = &u;

Point*

Page 13: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

13

Елемент масиву vs. поле структури

Для доступу до елементів масиву застосовується адресна арифметика; індекси елементів масиву можна обчислювати, за індексами можна організовувати цикли;

Поля структури задаються оператором доступу до члена структури (крапка-оператор)

• Point u = {1, 1}; double u[2] = {1,1};• u._x; u._y; u[0] == *u;• u[1] == *(u+1);

Page 14: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

14

Указник на поле структури

• Point u = {1,1};

За допомогою указника структури• Point *p = &u;• p -> _x == (*p)._x

За допомогою указників окремих полів• double *px = &u._x;• double *py = &u._y;

Page 15: 06 Data Structures

© Бублик В.В. Програмування-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 не впливає

Page 16: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

16

Присвоєння структур vs. присвоєння масивів

Присвоєння масивів не визначено. ― Чому?• double x[2] = {1, 2};• double y[2] = {10, 20};

• x = y; // ERROR!Приводить до помилки компіляції

Page 17: 06 Data Structures

© Бублик В.В. Програмування-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

Page 18: 06 Data Structures

© Бублик В.В. Програмування-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Чому?

Page 19: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

19

Поверхневе присвоєння масивів

• double *x = new double[2];• double *y = new double[2];• y[0] = 10; y[1] = 20;

Page 20: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

20

Поверхневе присвоєння масивів

• double *x = new double[2];• double *y = new double[2];• y[0] = 10; y[1] = 20;• x = y;

втрата пам'яті

Page 21: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

21

Поверхневе присвоєння масивів

• y[1]=30;• out<<x[0]<<' '<<x[1]<<endl; // 10 30

Page 22: 06 Data Structures

© Бублик В.В. Програмування-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

Page 23: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

23

Поля - указники

• a = b;• out<<a._k[1]<<endl; // 10

Page 24: 06 Data Structures

© Бублик В.В. Програмування-2. 6. Базові поняття програмування. Структури даних

24

Поля - указники

• a = b;• out<<a._k[1]<<endl; // 10

• b._k[1] = 100;• out<<a._k[1];

• знову втрата пам'яті

Page 25: 06 Data Structures

© Бублик В.В. Програмування-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• …………….

Page 26: 06 Data Structures

© Бублик В.В. Програмування-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;• };

Page 27: 06 Data Structures

© Бублик В.В. Програмування-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

Page 28: 06 Data Structures

© Бублик В.В. Програмування-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;• };

Page 29: 06 Data Structures

© Бублик В.В. Програмування-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;