Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програм-е на ЯВУ / Программирование на языках выского уровня, алгоритмические языки.doc
Скачиваний:
63
Добавлен:
11.04.2014
Размер:
1.74 Mб
Скачать

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

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

Структуры

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

Пример:

// Хранение информации о рейтинге студентов

//------------------------------------------------------------------

// Правильный подход

//------------------------------------------------------------------

// Студент с точки зрения деканата (объявляем новый тип данных)

struct TStudent

{

char FIO[56]; // ФИО

char Group[10]; // название группы, например, ИВТ-160

int Year; // курс

float Rating; // рейтинг

};

// Создаем массив для хранения информации о рейтинге студентов

struct TStudent Students[100];

//------------------------------------------------------------------

// Неверный подход

//------------------------------------------------------------------

// Создаем массивы для хранения информации о рейтинге студентов

char FIO[100];

char Group[100];

int Year[100];

float Rating[100];

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

– объявление;

– инициализация;

– присваивание (=);

– выбор поля структуры (. , ->).

Объявление структуры:

Объявление структуры включает в себя описание нового типа данных и переменной этого типа.

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

Пример:

// Структура, задающая позицию точки в трехмерной системе

// координат

struct TPosition

{

int x;

int y;

int z;

};

// Структура, задающая сферу в трехмерной системе координат

struct TSphere

{

struct TPosition Center; // центр сферы

int Radius; // радиус сферы

int Color; // цвет сферы

};

// Объявляем указатель на структуру данных

struct TStudent *Student;

struct TSphere *Sphere;

Замечание. Размер структуры не обязательно равен сумме ее элементов (может быть больше).

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

// Создаем студента

struct TStudent Ivanov= {“Иванов А. А.”, “ИВТ-160”, 1, 20.6};

// Создаем студентов

struct TStudent Students[2]= {{“Иванов А. А.”, “ИВТ-160”, 1, 20.6},

{“Петров Б. Б.”, “ИВТ-160”, 1, 17.5}};

Присваивание структуры:

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

Пример:

// В результате первый и второй элемент массива становятся равными

Students[1]= Ivanov;

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

Доступ к полям структуры осуществляется с помощью оператора выбора. При этом имеется два варианта написания данного оператора: ., ->. Второй вариант используется при работе с указателем на структуру.

Пример:

struct TStudent Ivanov;

struct TStudent *Student;

// Записываем информацию о студенте

strcpy(Ivanov.FIO, “Иванов А. А.”);

strcpy(Ivanov.Group, “ИВТ-160”);

Ivanov.Year= 1;

Ivanov.Rating= 16.5;

Student= &Ivanov;

Student->Rating= 20.6; // аналогично (*Student).Rating= 20.6;

Пример:

struct TSphere Sphere;

// Записываем информацию о сфере

// Задаем центр координат

Sphere.Centre.x= 10;

Sphere.Centre.y= 20;

Sphere.Centre.z= 0;

// Задаем остальные свойства сферы

Sphere.Radius= 300;

Sphere.Color= 145;

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

Замечание. Если в структуру данных входит массив и структура передается в функцию по значению, то и массив передается по значению, т.е. создается копия массива.

Окончание занятия №23 (лекция)

Объединения

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

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

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

Размер объединения определяется размером его наибольшего поля.

Пример:

// Ответ на вопрос в анкете: либо номер ответа, либо произвольная

// строка с ответом пользователя

struct TAnswer

{

char Type; // тип ответа: 1 – номер предопределенного ответа

// 0 – произвольная строка с ответом пользователя

union

{

char Number; // либо номер ответа

char String[30]; // либо строка с произвольным ответом

} Contents;

};

// Ответы на вопросы анкеты

struct TAnswer Answers[10];

// Записали предопределенный ответ

Answers[0].Type= 1;

scanf(“%d”, &Answers[0].Contents.Number);

// Записали произвольный ответ

Answers[1].Type= 0;

scanf(“%s”, Answers[1].String);

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

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

Пример:

enum Key {Esc= 0x011b, Enter= 0x1c0d};

enum Key key;

while(bioskey(1)==0);

key= bioskey(0);

switch(key)

{

case Esc:

printf(“Нажали Esc”);

break;

case Enter:

printf(“Нажали Enter”);

break;

}

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

Переименование типов

С помощью ключевого слова typedef типу данных можно задать новое имя. Переименование типов в основном используется для задания более коротких псевдонимов.

Пример:

typedef unsigned int UINT;

UINT i; // переменная типа unsigned int

Окончание занятия №24 (практика)