Определение структур
Структуры
Структуры, объединения, перечисления
Все данные, с которыми работает программа можно разделить на две группы:
· простые;
· структурированные.
Из рассмотренных ранее типов данных к структурированным типам относятся массивы, остальные типы данных – простые – не имеющие внутренней структуры.
Структуры и объединения относятся к структурированным (конгломератным) типам данных, определяемых программистом.
Структуры представляют собой группы связанных между собой, как правило, разнотипных переменных, объединенных в единый объект.
Для работы с некоторой структурой в программе необходимо:
1. описать тип данных этой структуры;
2. определить переменные этого типа для хранения соответствующих данных в памяти.
Рассмотрим пример: сведения о студенте содержат следующие данные:
· фамилия - Fam;
· имя - Name;
· год рождения - Year;
· пол - Sex;
· средний балл - Grade.
Представим все эти данные в виде единой структуры. Введем новый тип данных (назовем его t_Student) для описания этой структуры:
struct t_Student {
char Fam [20],
Name [16];
short Year;
bool Sex;
float Grade;
};
Описание структуры начинается ключевым словом struct. Каждая входящая в структуру переменная называется членом (полем, элементом) структуры и описывается типом данных и именем. Поля структуры могут быть любого типа данных. Их количество не лимитировано.
Вся эта конструкция является инструкцией языка программирования, поэтому после нее всегда должен ставиться символ;.
При описании структуры память для размещения данных не выделяется. Работать с описанной структурой можно только после того, как будет определена переменная (переменные) этого типа данных, только при этом компилятор выделит необходимую память:
t_Student St1, St2; // Определены две переменные типа t_Student
Определение переменных можно осуществить одновременно с описанием типа данных структуры:
struct t_Student {
char Fam [20],
Name [16];
short Year;
bool Sex;
float Grade;
} St1, St2;
Все поля структурных переменных располагаются в непрерывной области памяти одно за другим. Общий объем памяти, занимаемый структурой, равен сумме размеров всех полей структуры. Для определения размера структуры следует использовать инструкцию sizeof (): sizeof (t_Student) или sizeof (St2).
Для того чтобы записать данные в структурную переменную, необходимо каждому полю структуры присвоить определенное значение. Для этого необходимо научиться получать доступ к полям. Для этого используется оператор “точка”. Например:
strcpy (St1.Fam, “Иванов”);
strcpy (St1.Name, “Владимир”);
St1.Year = 1995;
St1.Sex = true; // Надо договориться какое значение соответствует значению пола
St1.Grade = 4.67;
При доступе к определенному полю его следует рассматривать как обычную переменную, тип данных которой соответствует типу этого поля. Поля структур могут участвовать в качестве операндов любых выражений, допускающих использование операндов соответствующего типа данных.
Копирование данных из одной структурной переменной в другую осуществляется простой операцией присваивания не зависимо от количества полей и размера структуры (это можно делать только в том случае, когда обе переменные одного и того же типа):
St2 = St1;
Теперь переменная St2 содержит те же данные, что и переменная St1.
В программировании очень часто используются такие конструкции, как массивы структур. Например, сведения о студентах некоторой учебной группы можно хранить в массиве студентов:
t_Student Gruppa [25];
Здесь мы определили 25-ти элементный массив, каждый элемент которого предназначен для хранения данных одного студента. Получение доступа к данным некоторого студента из группы осуществляется обычной индексацией переменной массива:
St1 = Gruppa [10]; // Переменная St1 содержит сведения об 11-ом студенте
Доступ к некоторому полю студента внутри массива делается так:
double grade = Gruppa[10].Grade; // Переменная grade содержит среднюю оценку 11-ого студента
Если некоторое поле структуры представляет собой массив (например, поле Fam – это массив символов), доступ к отдельному элементу этого массива можно выполнить так:
St1.Fam[5] = ‘ш’;
Или так:
Gruppa[10].Fam[5] = ‘ш’;
Поскольку поля структуры могут быть любого типа данных, то они могут в свою очередь быть другой структурой или массивом других структур. Определим группу, как структуру, содержащую три поля – номер группы, количество студентов в группе и массив студентов этой группы.
Определяем новый тип данных и переменные для двух групп:
struct t_Gruppa {
short NumGr; // Номер группы
short Count; // Количество студентов в группе
t_Student Students[25]; // Массив студентов группы
} Gr1372, St1373;
Получим данные о некотором студенте из группы Gr1372:
St1 = Gr1372.Students[10]; // Переменная St1 содержит сведения об 11-ом студенте
А вот его средний балл:
grade = Gr1372.Students[10].Grade;
В структуре в качестве поля нельзя использовать элемент, тип которого совпадает с типом самой структуры (рекурсивное использование структур запрещено).