Структуры
Цель лекции: изучить понятия, оформления и определения структур, доступа к элементам структур, научиться решать задачи с использованием структур на языке C++.
В языке С++ возможно формирование производных (пользовательских) типов данных прежде всего на основе массивов, структур и объединений. Комбинирование этих типов данных позволяет программно моделировать достаточно сложные объекты реальности.
Агрегатным типом данных называется тип, конструируемый из элементов независимых (возможно различных) типов.
Структура – это составной объект, в который входят элементы любых типов, за исключением функций. В отличие от массива, который является однородным объектом (все элементы относятся к одному типу данных), структура может быть неоднородной. Таким образом, структура – это тип данных, сформированный из объектов однородных либо разнообразных типов данных.
Структуру можно представить себе как запись, состоящую из нескольких полей или элементов. Структуры обеспечивают удобный способ организации связанных по смыслу переменных. Структуры являются одновременно агрегатным и производным типом данных.
В некоторых языках программирования, в частности в Pascal, структуры называются записями. Структуры помогают в организации сложных данных (особенно в больших программах), поскольку позволяют группу связанных между собой переменных трактовать не как множество отдельных элементов, а как единое целое.
Традиционный пример структуры – строка платежной ведомости. Она содержит такие сведения о служащем, как его полное имя, адрес, номер карточки социального страхования, зарплата и т.д. Некоторые из этих характеристик сами могут быть структурами: например, полное имя состоит из нескольких компонент (фамилии, имени и отчества); аналогично адрес и даже зарплата. Другой пример – из области графики: точка на плоскости есть пара вещественных координат, шар в пространстве моделируется четырьмя вещественными числами и т. д.
Объявление структур и определение структурных объектов
Использование в программе структуры предполагает вначале определение (объявление) структуры-шаблона (типа структуры) и его структурного объекта (структурной переменной). Возможны их раздельное и совместное определения. Для шаблона структуры (с именем или без него) компилятор не выделяет в памяти компьютера место под структуру, а лишь фиксирует правила, необходимые для формирования структурного объекта (структурной переменной).
В момент определения структурного объекта компилятор выделяет место в памяти, где размещаются все компоненты структуры в соответствии с заданным шаблоном.
Ключевое слово struct сообщает компилятору об объявлении структуры. Допустимы три основные формы объявления структур.
1) С поименованным шаблоном:
struct ИмяСтруктурногоТипа {ОпределенияЭлементов};
где ИмяСтруктурногоТипа – идентификатор типа структуры. Следует обратить внимание на точку с запятой, которой заканчивается определяемая структура;
ОпределенияЭлементов – список определений типизированных компонентов (полей), из которых образуется шаблон структуры. Он в общем случае представляется так:
Тип1 Компонент11 [,Компонент12,...]; ................................... ТипК КомпонентК1 [,КомпонентК2,...];
Здесь допустимы компоненты различных типов. Все имена компонентов уникальны. Шаблон имеет видимость. Если он объявлен внутри блока, то это локальный шаблон, видимый только внутри него.
Например:
struct STUDENT { char name[50]; //Ф.И.О int passw; //шифр зачетной книжки };
При указанной форме объявления структуры структурные объекты определяются ниже в виде отдельной строки:
ИмяСтруктурногоТипа СписокСтруктур;
где СписокСтруктур – список идентификаторов, соответствующих именам структурных объектов.
Структурные объекты можно определить так:
STUDENT group0l, group02, //структурные объекты *univers, //указатель на структурный объект fam[100]; //массив структурных объектов
При определении структурного объекта (структурной переменной) СтруктурныйОбъект допустима инициализация его компонентов (полей):
struct ИмяСтруктурногоТипа СтруктурныйОбъект = {Инициализатор1, Инициализатор2, .............. ИнициализаторK };
Для вышеприведённого примера возможно следующее:
struct STUDENT group0l = { "Сидоров ", 6374268 };
2) С совмещением определения структуры и структурных объектов:
struct ИмяСтруктурногоТипа {ОпределенияЭлементов} СписокСтруктур;
Структурный объект при такой схеме определения может быть также инициализирован.
Например, структура типа STUDENT с элементами ФИО и номером зачётной книжки:
struct STUDENT { char name[50]; int passw; } *univers,//указатель на структурный объект fam[100],//массив структурных объектов group0l = {"Сидоров А.И.", 26276}; //инициализированный объект
При рассматриваемом подходе ИмяСтруктурногоТипа (STUDENT) можно опустить.
В пределах программы допустим один непоименованный тип структуры.
3) С использованием оператора typedef:
typedef struct [ИмяСтруктурногоТипа] {ОпределенияЭлементов} ОбозначениеСтруктурногоТипа;
где ОбозначениеСтруктурногоТипа – синонимы типа структуры. Это упрощает программу при определении структурных объектов. Кроме того, в упрощённом определении имя типа структуры можно опустить.
Например:
typedef struct { char name[50]; int passw; } NSTUstudent; //NSTUstudent - псевдоним типа структуры
Определение структурного объекта для данного случая можно организовать так:
NSTUstudent *pt, //указатель на структуру groupStudent; //структурная переменная
Здесь также допускается инициализация определяемых структурных объектов.
Можно определить структуру с использованием макроопределения:
#define Идентификатор struct ИмяТипа
Далее следует
Идентификатор {ОпределенияЭлементов};
Например:
#define COMPLEX struct R7 COMPLEX { float real; float imag; };