Типы данных, определяемые пользователем

Содержание

Слайд 2

Типы данных, определяемые пользователем Переименование типов (typedef). Перечисления(enum). Структуры (struct). Битовые поля. Объединения (union).

Типы данных, определяемые пользователем

Переименование типов (typedef).
Перечисления(enum).
Структуры (struct).
Битовые поля.
Объединения

(union).
Слайд 3

Переименование типов (typedef) Для того чтобы сделать программу более ясной, можно

Переименование типов (typedef)

Для того чтобы сделать программу более ясной, можно задать

типу новое имя с помощью ключевого слова typedef .
Слайд 4

Переименование типов (typedef). typedef тип новое_имя [ размерность ]; Размерность может

Переименование типов (typedef).

typedef тип новое_имя [ размерность ];

Размерность может отсутствовать.

Примеры:

typedef unsigned

int UINT;
typedef char Msg[100];
typedef struct{
char fio[30];
int date, code;
double salary; } Worker;
Слайд 5

ПЕРЕИМЕНОВАНИЕ ТИПОВ Кроме задания типам с длинными описаниями более коротких псевдонимов,

ПЕРЕИМЕНОВАНИЕ ТИПОВ

Кроме задания типам с длинными описаниями более коротких псевдонимов, typedef

используется для облегчения переносимости программ:
если машинно-зависимые типы объявить с помощью операторов typedef, при переносе программы потребуется внести изменения только в эти операторы
Слайд 6

ПЕРЕИМЕНОВАНИЕ ТИПОВ Новые имена типов можно использовать таким же образом, как

ПЕРЕИМЕНОВАНИЕ ТИПОВ

Новые имена типов можно использовать таким же образом, как и

имена стандартных типов.

UINT i, j; // две переменных типа unsigned int
Msg str[10]; // массив из 10 строк по 100 символов
Worker staff[100]; // массив из 100 структур

Слайд 7

Перечисления (enum) При написании программ часто возникает потребность определить несколько именованных

Перечисления (enum)

При написании программ часто возникает потребность определить несколько именованных констант,

для которых требуется, чтобы все они имели различные значения, при этом конкретные значения могут быть не важны
Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант.
Слайд 8

П Е Р Е Ч И С Л Е Н И

П Е Р Е Ч И С Л Е Н И

Я

Формат:

enum [ имя_типа ] { список_констант };

Имя типа задается в том случае, если в программе требуется определять переменные этого типа.

Компилятор обеспечивает, чтобы эти переменные принимали значения только из списка констант

Константы должны быть целочисленными и могут инициализироваться обычным образом.

При отсутствии инициализатора первая константа обнуляется, а каждой следующей присваивается па единицу большее значение, чем предыдущей

Слайд 9

П Е Р Е Ч И С Л Е Н И

П Е Р Е Ч И С Л Е Н И

Я

Пример:

enum Err {ERR_READ, ERR_WRITE, ERR_CONVERT};
Err error;
......
switch (error){
case ERR_READ; /* операторы */ break;
case ERR_WRITE; /* операторы */ break;
case ERR_CONVERT; /* операторы */ break;
}

Константам ERRREAD, ERRWRITE, ERRCONVERT присваиваются значения 0, 1 и 2 соответственно.

Слайд 10

П Е Р Е Ч И С Л Е Н И

П Е Р Е Ч И С Л Е Н И

Я

Пример:
enum {two = 2, three, four, ten = 10, eleven, fifty = ten + 40};

Константам three и four присваиваются значения 3 и 4, константе eleven — 11.

Слайд 11

Структуры (struct) В языке C++ структура является видом класса и обладает

Структуры (struct)

В языке C++ структура является видом класса и обладает всеми

его свойствами.
Во многих случаях достаточно использовать структуры так, как они определены в языке С.
Слайд 12

С Т Р У К Т У Р Ы Формат: struct

С Т Р У К Т У Р Ы

Формат:

struct [ имя_типа

] {
тип_1 элемент_1;
тип_2 элемент_2;
тип_n элемент_n;
} [ список_описателей ];

Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры,
но могут быть указателями на него.

Слайд 13

С Т Р У К Т У Р Ы struct {

С Т Р У К Т У Р Ы

struct {
char fio[30];
int

date, code;
double salary;
} staff[100], *ps;

Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов.

В этом случае описание структуры служит определением элементов этого списка.

Определение массива структур и указателя на структуру:

Слайд 14

С Т Р У К Т У Р Ы struct Worker{

С Т Р У К Т У Р Ы

struct Worker{ //

описание нового типа Worker
char fio[30];
int date, code;
double salary;
}; // описание заканчивается точкой с запятой
/* определение массива типа Worker и указателя на тип Worker*/
Worker staff[100], *ps;

Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами.

Например:

Слайд 15

С Т Р У К Т У Р Ы struct List;

С Т Р У К Т У Р Ы

struct List; // объявление

структуры List
struct Link{
List *p; // указатель на структуру List
Link *prev, *succ; // указатели на структуру Link
};
. . . . . . . . . . . .
struct List { /* определение структуры List */};

Имя структур можно использовать сразу после объявления в тех случаях, когда компилятору не требуется знать размер структуры.

Например:

Это позволяет создавать связные списки структур.

Слайд 16

Инициализация структур struct{ char fio[30]; int date, code; double salary; }worker

Инициализация структур

struct{
char fio[30];
int date, code;
double salary;
}worker = {"Страусенко", 31, 215,

3400.55};

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:

Слайд 17

Инициализация структур struct complex{ float re, im; } compl[2][3] = {

Инициализация структур

struct complex{
float re, im;
} compl[2][3] = {
{{1, 1}, {1,

1}, {1, 1}}, // строка 1, то есть массив compl[0]
{{2, 2}, {2, 2}, {2, 2}} // строка 2. то есть массив compl[1]
};

При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива:

Учтите, что многомерный массив — это массив массивов

Слайд 18

Доступ к полям структуры Worker worker, staff[100], *ps; ...... worker.fio =

Доступ к полям структуры

Worker worker, staff[100], *ps;
......
worker.fio = "Страусенко";
staff[8].code = 215;
ps

-> salary = 0.12;

Доступ к полям структуры выполняется с помощью :
операции выбора . (точка)
при обращении к полю через имя структуры
->
при обращении через указатель

Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора.

struct A {int a; double x;};
struct В {A a; double x;} х[2];
х[0].а.а = 1;
х[1].х = 0.1;

Слайд 19

Операции со структурами Для переменных одного и того же структурного типа

Операции со структурами

Для переменных одного и того же структурного типа определена

операция присваивания

при этом происходит поэлементное копирование

Структуру можно передавать в функцию и возвращать в качестве значения функции

Другие операции со структурами могут быть определены пользователем

Слайд 20

Битовые поля Битовые поля — это особый вид полей структуры. Они

Битовые поля

Битовые поля — это особый вид полей структуры.
Они используются

для плотной упаковки данных, например, флажков типа «да/нет».
Слайд 21

Битовые поля struct Options{ bool centerX: 1; bool centerY: 1; unsigned

Битовые поля

struct Options{
bool centerX: 1;
bool centerY: 1;
unsigned int shadow: 2;
unsigned int

palette: 4;
};

При описании битового поля, после имени через двоеточие указывается длина поля в битах (целая положительная константа).

Слайд 22

Битовые поля Битовые поля могут быть любого целого типа. Имя поля

Битовые поля

Битовые поля могут быть любого целого типа.

Имя поля может отсутствовать

такие

поля служат для выравнивания на аппаратную границу

Доступ к полю осуществляется обычным способом — по имени

Адрес поля получить нельзя, однако в остальном битовые поля можно использовать точно так же, как обычные поля структуры

Слайд 23

Битовые поля Следует учитывать, что операции с отдельными битами реализуются гораздо

Битовые поля

Следует учитывать, что операции с отдельными битами реализуются гораздо менее

эффективно, чем с байтами и словами и экономия памяти под переменные оборачивается увеличением объема кода программы.
Слайд 24

Объединения (union) Объединение (union) представляет собой частный случай структуры, все поля

Объединения (union)

Объединение (union) представляет собой частный случай структуры, все поля которой

располагаются по одному и тому же адресу.
Объединения применяют для экономии памяти в тех случаях, когда известно, что больше одного поля одновременно не требуется.
Формат описания такой же, как у структуры, только вместо ключевого слова struct используется слово union.
Слайд 25

О Б Ъ Е Д И Н Е Н И Я

О Б Ъ Е Д И Н Е Н И Я

Длина

объединения равна наибольшей из длин его полей

В каждый момент времени в переменной типа объединение хранится только одно значение,
и ответственность за его правильное использование лежит на программисте

Слайд 26

О Б Ъ Е Д И Н Е Н И Я

О Б Ъ Е Д И Н Е Н И Я

#include


int main(){
enum paytype {CARD, CHECK};
paytype ptype;
union payment{
char card[25];
long check;
} info;
/* присваивание значений info и ptype */
switch (ptype){
case CARD: cout << "Оплата по карте: " << info.card; break;
case CHECK: cout << "Оплата чеком: " << info.check; break;
}
return 0;
}

Пример: