06 Data Structures

394 views

Published on

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
394
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
18
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

06 Data Structures

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

×