Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЯзыки прогрИб.doc
Скачиваний:
27
Добавлен:
12.11.2019
Размер:
922.11 Кб
Скачать

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

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

Структуры

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

Пример:

struct tip_rab //Объявление типа структура tip_rab

{

int tabn;

char fio[20];

float zarp;

};

tip_rab rab1,rab2,brigada[10];//Объявление переменных типа

//структура tip_rab

Типы полей структуры - это любые типы, включая тип структура. Таким образом, возможно создание иерархической структуры данных.

Доступ к полям структуры осуществляется с помощью составного идентификатора: per.pole

,где pole – идентификатор (имя) поля структуры;

символ (.) - операция выбора поля структуры.

Пример:

rab1.tabn=1200;

Пример указателей на структуры:

tip_rab rab; //Объявление переменной типа структура tip_rab

tip_rab *p; //Объявление указателя p на тип tip_rab

p=&rab; //Инициализация указателя p адресом rab

//или tip_rab *p=&rab;//Объявление и инициализация указателя

Доступ к полям структуры осуществляется помимо операции (.)-операции прямого выбора поля структуры (rab.tabn), с помощью операции (->) -операции косвенного выбора поля структуры или операции указателя поля (p->tabn). p->tabn==(*p).tabn.

Определение адреса поля структуры выполняется с помощью операции адресации: &prab->tabn, где операция -> имеет более высокий приоритет.

Над целыми структурами, имеющими один и тот же идентификатор типа, возможна операция присваивания.

Пример:

rab1=rab2;

Операции над полями структуры вариируются в зависимости от типа полей. Тип структура является основным типом данных в экономических и управленческих задачах. В качестве параметров функций используются ссылки на тип структура.

Пример:

//Вызываемая функция //Вызывающая функция

void vyvod(tip_rab &x) tip_rab rez;

{ //rez имеет значение

cout<<x.tabn<<'\n' ...

<<x.fio<<'\n' vyvod(rez);

<<x.zarp<<'\n';

}

Если необходимо заблокировать изменение переменной rez от функции vyvod, то необходим модификатор const: const tip_rab &x.

Объединения

Объединение - это поименованная совокупность данных, состоящая из фиксированного числа компонентов разных типов, но активным может быть только один компонент. Многие синтаксические и функциональные свойства объединений совпадают со структурами.

Пример:

union tip_rab //Объявление типа объединение

{

int tabn; //Размер 2 байта

char fio[20]; //размер 20 байт

float zarp; //размер 4 байта

};

tip_rab rab1,rab2;//Объявление переменных типа tip_rab

Размер объединения равен размеру своего максимального компонента, в нашем примере - 20 байт. Одновременно в памяти может находиться значение только одного компонента. Переменная rab1 может одновременно хранить в 20 байтах либо значение int, либо массив char, либо значение float. Значение какого типа, хранимого в памяти в данный момент, контролируется только самим программистом. Операция sizeof (rab1) возвращает значение 20, но когда rab1 содержит объект типа int, 18 байтов остаются неиспользованными (туда помещаются символы-заполнители), а когда rab1 содержит объект типа float, - то 16 байтов.

Доступ к полям объединения такой же, как и в структуре. Объединение может быть инициализировано только одним значением. Объединения соответствуют типам вариантных записей языков Паскаль и Модула-2. Используется как компонент структуры при создании записей с переменной частью.

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

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

Упорядоченность идентификаторов пользователя определяется возрастающей последовательностью целочисленных значений идентификаторов.По умолчанию идентификаторы инициализируются значениями 0,1 и т.д.

Примеры:

enum selector {vyhod,sozd,prosm,ud,zam};//vyhod=0,sozd=1,...

enum dni {pn,vt,sr,cht,pt,sb,vs};//pn=0,vt=1,...

selector sel1;//Объявление переменной типа selector

dni d; //объявление переменной типа dni

При объявлении перечисления можно явно инициализировать идентификаторы пользователя целыми значениями.

Пример:

enum dni {pn=1,vt,sr,cht=pn+7,pt,sb,vs};//pn=1,vt=2,sr=3,

//cht=8,pt=9,sb=10,vs=11

Пример неименованного перечисления:

enum {false,true}; //символические константы false=0,true=1

Над переменной перечисляемого типа возможны операции:

операция присваивания, например, sel1=sozd; d=vs;

операции отношения, например, if (sel1==sozd) ...;

любые операции, выполняемые над типом int.

Преимущество перечислений - возможность использования идентификаторов, несущих смысл, вместо числовых значений, в результате чего облегчается программирование и повышается читабельность программы.

Контрольные вопросы

  1. Дайте понятие массива.

  2. Как осуществляется доступ к элементам массива?

  3. Как проинициализировать массив при его объявлении?

  4. Перечислите типы данных, определяемые пользователем.

  5. Дайте понятие структуры.

  6. Как осуществляется доступ к элементам структуры?

  7. Дайте понятие объединения.

  8. Дайте понятие перечисления.