241.40K
Categories: programmingprogramming databasedatabase

Типи даних створені користувачем

1.

Типи даних
створені
користувачем
typedef
enum
struct
union
-
перейменування типу
іменовані константи/перерахування
структура
об'єднання

2.

Перейменування типу
typedef – дає змогу створити новий тип на базі існуючого
(псевдоним для типу)
Синтаксис створення простого типу
typedef існуючий_тип новий_тип;
Синтаксис створення тип-масив
typedef існуючий_тип новий_тип[розмір];
Синтаксис створення типу від структури
typedef struct{поля} новий_тип;
Синтаксис створення покажчика на функцію
typedef
тип_що_вертає_функція
(*новий_тип)
(параметри функції );

3.

typedef існуючий_тип новий_тип;
Приклад
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef unsigned int uint;
typedef uint myint;
int main()
{
unsigned int a=5;
uint b = 6;
myint c = 7;
//об'єкти a, b, c однакового типу
cout << a + b + c << endl;
system("PAUSE");
return 0;
}

4.

typedef існуючий_тип новий_тип[розмір];
Приклад
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef char Msg[20];
int main()
{
char str1[20] = "help";
Msg str2 = "help";
//об'єкти str1, str2 однакового типу
cout << str1 << endl;
cout << str2 << endl;
system("PAUSE");
return 0;
}

5.

typedef struct{поля} новий_тип;
Приклад
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct
{
int x, y;
} Tpoint;
int main()
{
Tpoint p = {10,20};
cout << p.x << "\t" << p.y << endl;;
system("PAUSE");
return 0;
}

6.

Приклад: Тип покажчик на функцідю
typedef тип_що_вертає_функція (*новий_тип) (параметри функції
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
typedef double (*Tf) (double);
double myF(double x) { return x + 0.7; }
int main()
{
Tf pf;
pf = &sin;
cout << sin(0.6) << endl;
cout << pf(0.6) << endl;
pf = &cos;
cout << pf(0.6) << endl;
pf = &myF;
cout << pf(0.6) << endl;
system("PAUSE");
return 0;
);

7.

Переваги застосування typedef
- задання «довгому» імені типу більш короткий псевдоним;
typedef unsigned int Tcounter; //для створення лічильників
typedef
//тип
-
vector<vector<vector<unsigned long long >>>::const_reverse_iterator
Tit;
для ітератора
маштабовання коду, наприклад щом змінити розмір лічильника
typedef unsigned int Tcounter; достатня змінити його тип typedef
unsigned long long Tcounter
- надавання імені типу сенсового навандаження
typedef unsigned int Tcounter; //для створення лічильників
typedef double Ttime; //для зберігання дати
- імплементація шаблоних типів до фактичного типу (С++)
typedef vector<double> TDvector;
TDvector – вектор який зберігає дійсні числа

8.

Іменовані
константи/перерахування
enum
Дозволяє визначити кілька іменованих констант, для яких потрібно,
щоб всі вони мали різні значення (при цьому конкретні значення
можуть бути не важливі). Усі можливі значення якого задаються
списком цілочисельних констант
Синтаксис
enum новий_тип { список_констант };
Новий синтаксис С++11
enum class новий_тип { список_констант };
Зауваження, вказання новий_тип не обов’язково

9.

#include <iostream>
#include <stdlib.h>
using namespace std;
enum Terr {ERR_R, ERR_W, ERR_O};
int main()
{
cout << ERR_R << endl;
cout << ERR_W << endl;
cout << ERR_O << endl;
Terr er = ERR_R;
switch (er)
{
case ERR_R: cout << "Error
case ERR_W: cout << "Error
case ERR_O: cout << "Error
}
system("PAUSE");
return 0;
}
Приклад іменовані константи
read" << endl; break;
write" << endl; break;
open" << endl; break;
Якщо значення константам не вказані, початкове приймає значення 0,
наступні на 1 більше від попереднього.
Вказання назви типу, дає змогу створити змінну яка може прийняти
одне з вказаних значень

10.

Приклад іменованих констант
#include <iostream>
#include <stdlib.h>
using namespace std;
enum { two = 2, three, four, ten = 10, eleven, fifty = ten + 40 };
int main()
{
cout << two << endl;
cout << three << endl;
cout << four << endl;
cout << ten << endl;
cout << eleven << endl;
cout << fifty << endl;
system("PAUSE");
return 0;
}

11.

Новий синтаксис С++
#include <iostream>
#include <stdlib.h>
using namespace std;
enum class Terr { ERR_R, ERR_W, ERR_O };
int main()
{
cout << (int)Terr::ERR_R << endl;
cout << (int)Terr::ERR_W << endl;
cout << (int)Terr::ERR_O << endl;
Terr er = Terr::ERR_R;
switch (er)
{
case Terr::ERR_R: cout << "Error read" << endl; break;
case Terr::ERR_W: cout << "Error write" << endl; break;
case Terr::ERR_O: cout << "Error open" << endl; break;
}
system("PAUSE");
return 0;
}

12.

Структури С struct
Структура — це сукупність різнотипних елементів, яким присвоюється
одне ім’я (воно може бути відсутнім), що займає одну ділянку пам’яті.
Елементи, що складають структуру, називаються полями/зміні структури
Синтаксис:
struct ім’я_новий_тип {
тип_1 елемент_1; //поля
тип_2 елемент_2; //поля
тип_n елемент_n; //поля
}список_обєктів;
Де ім’я_новий_тип та список_обєктів може бути відсутнім.
Поля, це зміні, які розташовані у структурі
Поля можуть бути довільного типу, крім типу власної структури.
Но можуть бути покажчиком чи посиланням на власну структуру.
Остання застосовується для створення лінійних списків та дерев.
Для ініціалізації структури значення її елементів перераховують
в фігурних дужках в порядку їх опису.

13.

Приклади створення структур
1) Пуста структура
struct {};
2) Tpoint - створений тип
p1, p2 – створені об'єкти
p2 = {10,30} – об'єкт з ініціалізацією
struct Tpoint
{
int x;
int y;
}p1, p2 = {10,30};
3) Створення структури без вказання типу, проте з
об'єктом ivan
struct
{
char pib[20];
int bal;
}ivan= { "Ivanov",90 };

14.

Доступ до полів
структури
Доступ до полів структури виконується за допомогою двох операцій
- операція вибору
- операції ->
.
. (точка, крапка)
Операцій вибору (точка, крапка) застосовується при зверненні до
поля через ім’я об’єкту структури
Операція -> застосовується при зверненні до поля через адресу
об’єкту, наприклад, який зберігається у покажчику

15.

#include <iostream>
#include <stdlib.h>
1) Для структур визначена операція =
using namespace std;
(присвоїти), яка працює як
struct Tpoint
побітове копіювання.
{
2) В мові С++ операцію -> можна
int x;
перевизначити, а операцію . - ні
int y;
};
int main()
{
Tpoint p1;
struct Tpoint p2;// старий синтаксис
p1.x = 10;
p1.y = 30;
p2 = p1; //побітове копіювання
Tpoint * pp;//покажчик на структуру
pp = &p1;
cout << pp->x << " "<<pp->y << endl;
cout << (*pp).x << " " << (*pp).y << endl;
cout << (&p2)->x << " " << (&p2)->y << endl;
system("PAUSE");
return 0;
}

16.

Бітові поля
Бітові поля - це особливий вид полів структури. Вони
використовуються для щільної упаковки даних, наприклад,
прапорців типу «так / ні». Мінімальна комірка пам'яті - 1 байт, а
для зберігання прапорця досить одного біта. При описі бітового
поля після імені через двокрапку вказується довжина поля в бітах
(ціла позитивна константа):
Бітові поля можуть бути будь-якого цілого типу.
Доступ до полю здійснюється звичайним способом - по імені. Адреса
поля отримати не можна, однак в іншому бітові поля можна
використовувати точно так же, як звичайні поля структури.
Слід враховувати, що операції з окремими бітами реалізуються
набагато менш ефективно, ніж з байтами і словами, так як
компілятор повинен генерувати спеціальні коди, і економія пам'яті
під змінні обертається збільшенням обсягу коду програми.
Розміщення бітових полів в пам'яті залежить від компілятора і
апаратури.

17.

#include <iostream>
#include <stdlib.h>
using namespace std;
struct Options {
unsigned int centerX : 1;
unsigned int centerY : 1;
unsigned int shadow : 2;
unsigned int palette : 4;
};
int main()
{
Options op;
op.centerX = 1; // може прийняти тільки значення 0 або 1
op.centerY = 0; // може прийняти тільки значення 0 або 1
op.shadow = 2; // може прийняти тільки значення від 0 до 3
op.palette = 5; // може прийняти тільки значення від 0 до 15
cout << sizeof(op) << endl;
// 4
system("PAUSE");
return 0;
}

18.

Розмір структури
Розмір структури визначається як сума розмірів усіх полів з
можливим вирівнювання до розміру який кратний машиному
слову (кратне 4, 8)
#include <iostream>
#include <stdlib.h>
using namespace std;
struct T1 { char ch; };
struct T2 { int x,y; };
struct T3 { int x; double y; };
struct T4 { char mas[6]; };
struct T5 { int x; char mas[5]; };
struct T6 { double x; char mas; };
struct T7 { int x; char c; };
int main()
{
cout << sizeof(T1)
cout << sizeof(T2)
cout << sizeof(T3)
cout << sizeof(T4)
cout << sizeof(T5)
cout << sizeof(T6)
cout << sizeof(T7)
system("PAUSE");
return 0;
}
<<
<<
<<
<<
<<
<<
<<
endl;
endl;
endl;
endl;
endl;
endl;
endl;
//
//
//
//
//
//
//
1
8
16
6
12
16
8

19.

Об’єднання union
Об'єднання (union) являє собою окремий випадок структури, всі поля
якої розташовуються за однією адресоюадресою.
Формат опису такої ж, як у структури, тільки замість ключового слова
struct використовується слово union.
union ім’я_новий_тип { поля}список_обєктів;
Довжина об'єднання визначається найбільшою довжиною з його полів.
В кожен момент часу в зміній типу об'єднання зберігається тільки одне
значення, і відповідальність за його правильне використання лежить
на програмістові.
Об'єднання застосовують для економії пам'яті в тих випадках, коли
відомо, що більше одного поля одночасно не потрібно.
У порівнянні зі структурами на об'єднання накладаються деякі
обмеження.
- об'єднання може инициализироваться тільки значенням його
першого елемента;
- об'єднання не може містити бітові поля;
- об'єднання не може містити віртуальні методи, конструктори,
деструктори і операцію присвоювання; (с++)
- об'єднання не може входити в ієрархію класів. (с++)

20.

#include <iostream>
#include <stdlib.h>
using namespace std;
a
union T
{
int a;
double b;
};
int main()
b
{
cout << sizeof(T) << endl; //8
T t;
t.a = 5;
cout << t.a << endl; //5
t.b = 2.5; // в цей момент значення поля а затерте полем b
cout << t.a << endl; //0 логічна помилка
cout << t.b << endl; //2.5
system("PAUSE");
return 0;
}

21.

Вкладені структури
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct Tpoint{
int x,y;
};
struct Triangle
{
Tpoint p1; // Вкладена структура
Tpoint p2; // Вкладена структура
Tpoint p3; // Вкладена структура
char comment[50]; // коментарій
};
int main()
{
Triangle t;
t.p1.x = 25;
t.p1.y = 36;
t.p2.x = 100;
t.p2.y = 55;
t.p3.x = 60;
t.p3.y = 56;
strcpy(t.comment, "Triangle #1");
system("PAUSE");
return 0;
}

22.

Вкладені структури
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct Tpoint{
int x,y;
};
struct Triangle
{
Tpoint p1; // вкладена структура
Tpoint p2; // вкладена структура
Tpoint p3; // вкладена структура
char comment[50];
};
int main()
{
Triangle t;
t.p1.x = 25;
t.p1.y = 36;
t.p2.x = 100;
t.p2.y = 55;
t.p3.x = 60;
t.p3.y = 56;
strcpy(t.comment, "Triangle #1");
system("PAUSE");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct Triangle
{
struct {
int x, y;
}p1 , p2,p3; // вкладена структура
char comment[50];
};
int main()
{
Triangle t;
t.p1.x = 25;
t.p1.y = 36;
t.p2.x = 100;
t.p2.y = 55;
t.p3.x = 60;
t.p3.y = 56;
strcpy(t.comment, "Triangle #1");
system("PAUSE");
return 0;
}

23.

Варіант1 опис вкладеної структури
#include <iostream>
#include <stdlib.h>
using namespace std;
struct T1
{
int a;
struct
{
int b;
};
char c;
};
int main()
{
T1 t;
t.a = 1;
t.b = 2;
t.c = 3;
cout << sizeof(t) << endl;//12
system("PAUSE");
return 0;
}

24.

Варіант2 опис вкладеної структури
#include <iostream>
#include <stdlib.h>
using namespace std;
struct T2
{
int a;
struct
{
int b;
}d;
char c;
};
int main()
{
T2 t;
t.a = 1;
t.d.b = 2;
t.c = 3;
cout << sizeof(t) << endl;//12
system("PAUSE");
return 0;
}

25.

Варіант3 опис вкладеної структури
#include <iostream>
#include <stdlib.h>
using namespace std;
struct T3
{
int a;
struct T
{
int b;
};
char c;
};
int main()
{
T3 t;
t.a = 1;
t.c = 3;
cout << sizeof(t) << endl;//8
T3::T t2;
t2.b = 2;
cout << sizeof(t2) << endl;//4
system("PAUSE");
return 0;
}

26.

Варіант4 опис вкладеної структури
#include <iostream>
#include <stdlib.h>
using namespace std;
struct T4
{
int a;
struct T
{
int b;
}d;
char c;
};
int main()
{
T4 t;
t.a = 1;
t.d.b = 2;
t.c = 3;
cout << sizeof(t) << endl;//12
T4::T t2;
t2.b = 2;
cout << sizeof(t2) << endl;//4
system("PAUSE");
return 0;
}

27.

Простий фіксований лінійний список
#include <iostream>
current
#include <stdlib.h>
using namespace std;
struct Tnod
a
{
int num;
Tnod* next;
};
c
int main()
{
Tnod a, b, c;
a.num = 1;
a.next = &b;
b.num = 2;
b.next = &c;
c.num = 3;
c.next = &a;
Tnod* current = &a;
for (int i = 0; i < 5; ++i)
{
cout << "Current nod is " << current->num << endl;
current = current->next;
}
cout << "Finish nod is " << current->num << endl;
system("PAUSE");
return 0;
}
b

28.

Приклад створення динамічного лінійного списку
#include <iostream>
#include <stdlib.h>
using namespace std;
struct Tnod
{
int num;
Tnod* next;
};
int main()
{
int n = 10;
//приклад створення лінійного списку з n елементів
Tnod *pbeg = NULL;
for (int i = 0; i < n; ++i)
{
Tnod* tmpNod = new Tnod; // 1 свторення нового вузла списку
tmpNod->num = i;// 2 заповення num
tmpNod->next = pbeg;// 3 елемент вставляється в голову списку
pbeg = tmpNod; // 4 голова pbeg перевизначається на вставлений елемент
}
//Проходження лінійного списку
Tnod* current_element = pbeg;
while (current_element)
{
cout << current_element->num << endl;
current_element = current_element->next;// перехід на наступние елемент
}
//Видалення лінійного списку
while (pbeg)
{
Tnod* cur_del_el = pbeg;
pbeg = pbeg->next;
delete cur_del_el;
}
system("PAUSE");
return 0;
}

29.

Приклад
Створити структуру яка зберігає інформацію про студента. Студент характеризується
полями: Ім’я, Прізвище, Середній бал, Адреса проживання. Адреса проживання являється
також структурою з полями: Вулиця , Номер будинку, Номер квартири.
Створити об’єкт і ввести усю інформацію з клавіатури. Вивести усі поля структури.
#define
_CRT_SECURE_NO_WARNIN
GS
#include <iostream>
#include <string.h>
using namespace std;
struct Adr
{
char street[100];
int numBuild;
int numFlat;
};
struct Tstud
{
char name[100];
char
secondName[100];
int bal;
Adr adr;
};
int main()
{
Tstud ivanov;
cout << "Input secondName:";
cin.getline(ivanov.secondName, 99);
cout << "Input name:";
cin.getline(ivanov.name, 99);
char tmpStr[100];
cout << "Input bal:";
cin.getline(tmpStr, 99);
ivanov.bal = atoi(tmpStr);
cout << "Input street:";
cin.getline(ivanov.adr.street, 99);
cout << "Input numBuild:";
cin.getline(tmpStr, 99);
ivanov.adr.numBuild = atoi(tmpStr);
cout << "Input numFlat:";
cin.getline(tmpStr, 99);
ivanov.adr.numFlat = atoi(tmpStr);
//Виведння результату
cout << "Result: "<<endl;
cout << ivanov.secondName << " " << ivanov.name << endl;
cout << ivanov.bal << endl;
cout << ivanov.adr.street<<" "
<< ivanov.adr.numBuild << " "
<< ivanov.adr.numFlat << " "<<endl;
system("PAUSE");
return 0;
}

30.

Приклад
#define _CRT_SECURE_NO_WARNINGS
Створити структуру яка зберігає інформацію про студента.
#include <iostream>
Студент характеризується полями : Ім’я Середній бал.
#include <string.h>
using namespace std;
Створити масив структур, який зберігає інформацію про групу.
struct Tstud
{
Відсортувати елементи масиву за абеткою та вивести на екран.
char pib[100];
int bal;
};
int main()
{
const int n = 5;
Tstud masInv[n];
for (int i = 0; i < n; ++i)
{
cout << "Input Name:";
cin.getline(masInv[i].pib, 99);
char tmpStr[100];
cout << "Input bal:";
cin.getline(tmpStr, 99);
masInv[i].bal = atoi(tmpStr);
}
//Сортування
for (int k = 0; k < n - 1; ++k) //повторення порівнання усіх сусідів
for (int i = 0; i < n - 1 - k; ++i)//процедура порівняння усіх сусідів
{
if (strcmp (masInv[i + 1].pib , masInv[i].pib)<0)
{//перестановка елементів за правилом трьох стаканів
Tstud c = masInv[i + 1];
masInv[i + 1] = masInv[i];
masInv[i] = c;
}
}
//Виведння результату
cout << "Result: " << endl;
for (int i = 0; i < n; ++i)
{
cout << masInv[i].pib << " " << masInv[i].bal << endl;
}
return 0;
}
English     Русский Rules