Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Proga_shpory.docx
Скачиваний:
43
Добавлен:
25.03.2015
Размер:
102.57 Кб
Скачать

47.Типы данных, задаваемые пользователем. Оператор typedef. Перечислимый тип

В реальных задачах информация, которую требуется обрабатывать, может иметь достаточно сложную структуру. Для ее адекватного представления используются типы данных, построенные на основе простых типов данных, массивов и указателей. Язык C++ позволяет программисту определять свои типы данных и правила работы с ними. Исторически для таких типов сложилось наименование типы данных, определяемые пользователем, хотя правильнее было бы назвать их типами, определяемыми программистом.

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

Задание нового имени существующему типу данных.

Структуры

Разновидности структур

Битовые поля

Объединение

Перечисления

Задание нового имени существующему типу данных

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

Пример 1:

typedef float real;

Тогда можно использовать следующие описания

float x,y;

или (что тоже самое)

real x,y;

Пример 2:

Если введены следующие новые имена типам

typedef unsigned long DLIN;

typedef char S[50];

typedef struct {

char nazv[50];

int code;

double cena; } izdel;

то можно использовать следующие описания:

DLIN a, b; // a и b переменные типа unsigned long

S otv [20]; // массив из 20 строк по 50 символов

izdel naz[40] // массив из 40 структур

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

Структура – это множество логически связанных именованных элементов различных типов.

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

Различают описание структуры – шаблон, и структурную переменную типа заданного шаблона.

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

Шаблон:

struct [имя_шаблона]

{ тип1 имя1, имя2…;

тип 2 имя 21, имя 22…;

};

Пример шаблона

struct anketa

{

char FIO[30];

char ADRES[40];

int GODR;

long ZARPL;

};

Описание структурной переменной может быть сделано и при описании шаблона либо отдельно от описания шаблона.

struct [имя_шаблона]

{ тип1 имя1, имя2…;

тип 2 имя 21, имя 22…;

} пер1, пер 2…; // структурные переменные

struct anketa

{

char FIO[30];

char ADRES[40];

int GODR;

long ZARPL;

}P,MP[10],*у; // описание структурных переменных:

// структурная переменная P или структура P,

//массив структур MP из 10 элементов,

//указатель на структуру y

отдельно

struct anketa P, MP[10];

Если шаблон структуры описан в typedef, либо используются отличные от BC инструментальные среды, то можно не использовать слово struct, а только имя шаблона.

Например,

typedef struct {

char FIO[30];

char ADRES[40];

int GODR;

long ZARPL;

} anketa;

Тогда описание структурных переменных следующее

anketa P, MP[10];

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

struct List;. // объявление структуры List

struct Link{

List *p; // указатель на структуру List

Link *prev. *succ; // указатели на структуру Link

}:

struct List { / * определение структуры List * / };

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

При описании структурной переменной можно сделать инициализацию ее полей.

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

struct{

char fio[30];

int date, code;

double salary;

}work1 = {"Страусенке", 31, 215, 3400.55};

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

struct complex{

float real, im;

} compl [2][3] = {

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

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

};

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

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

sizeof(anketa)

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

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

ИмяСтруктурнойПеременной . имяПоля

P.FIO

P.GODR

MP[i].ZARPL;

Если задан указатель на структуру, то доступ к элементам (полям) структуры

ИмяУказателяНаСтруктуру -> ИмяПоля

y->GODR

Примеры функций работы со структурами

Пусть имеется описание шаблона anketa и массива структур типа anketa

struct anketa

{

char FIO[30];

char ADRES[40];

int GODR;

long ZARPL;

} mas[50];

// N - номер свободной структуры или количество заполненных структур.

int N=0;

Функция добавления структуры в массив структур.

void dobav()

{

clrscr();

while(1)

{

printf(“Введи FIO(* - конец ввода) ”);

scanf(“%s”,mas[N].FIO);

if (mas[N].FIO[0]==’*’) return;

printf(“\n адрес->”);

scanf(“%s”,mas[N].ADRES);

printf(“\nГод рождения ”);

scanf(“%d”,&mas[N].GODR);

printf(“\nЗарплата”);

scanf(“%ld”,&mas[N].ZARPL);

N++;

}}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]