Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_С++_последная.doc
Скачиваний:
40
Добавлен:
07.05.2019
Размер:
876.54 Кб
Скачать

5.2. Пользовательские типы данных.

Типы данных, определяемые пользователем, являются важнейшим инструментом в современном программировании. Стандартные (встроенные) типы, такие как int, char, double и т.д. являются примитивными, поскольку оперируют с числами и символами, в то время как существующие структуры данных намного сложнее.

Вторая причина, из-за которой следует переходить к пользовательским типам данных, заключается в том, что стандартные типы не информативны, т.е. «int a» может означать целое число студентов, координату пиксела, номер открытого файла. Несмотря на то, что все эти понятия имеют характер целых чисел, их желательно не смешивать, используя один тип.

5.2.1. Ключевое слово typedef

Ключевое слово typedef используется для присвоения нового имени существующему типу. Допустим, утомительно писать в программе объявления с unsigned int, например:

unsigned int x;

unsigned int y;

Присвоим unsigned int новое обозначение с помощью typedef

typedef unsigned int UI;

UI x;

UI y;

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

5.2.2. Перечислимый тип данных

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

enum COLORS { RED, GREEN, BLUE };

COLORS color;

switch (color)

{

case RED: ....;

case GREEN: ....;

case BLUE: ....;

}

При выполнении арифметических операций перечисления преобразуются в целые.

5.2.3. Понятие структуры

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

В отличие от массива, который является однородным объектом, структура может быть неоднородной. Традиционным примером структуры является учетная карточка работника: “служащий“ описывается набором атрибутов, таких как фамилия, имя, отчество, адрес, код социального обеспечения, зарплата и т.д. Некоторые из этих атрибутов сами могут оказаться структурами, например адрес.

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

struct addr

{

список определений;

}

В приведенном ниже примере идентификатор student описывается, как структура:

struct STUDENT

{

char name[25];

int id, age;

}

struct DATE

{

int DAY;

int MONTH;

int YEAR;

}

Описание структуры, за которым не следует списка переменных, не приводит к выделению какой-либо памяти; оно только определяет шаблон или форму структуры.

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

Например:

strcpy(st1.name,"Иванов");

st2.id=st1.id;

Структуры могут быть вложенными, например учетная карточка служащего может фактически выглядеть так:

struct PERSON

{

char NAME[NAMESIZE];

char ADDRESS[ADRSIZE];

long ZIPCODE; /* почтовый индекс */

long SS_NUMBER; /* код соц. Обеспечения */

double SALARY; /* зарплата */

DATE BIRTHDATE; /* дата рождения */

DATE HIREDATE; /* дата поступления на работу */

};