Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР14-С++-24-мая-2012.doc
Скачиваний:
34
Добавлен:
23.09.2019
Размер:
2.26 Mб
Скачать

1.8. Вложенные структурные типы

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

Тип вложенной структуры должен быть объявлен раньше. Кроме того, структура не может быть вложена в структуру того же типа.

Например, структурный тип PersonInfo для записи роста, веса и даты рождения человека может быть определен, как показано в примере 14.5.

Пример 14.5

struct Date

{

int month; //месяц

int day; //число

int year; //год

};

struct PersonInfo

{

float height; // рост

float weight; // вес

Date birthday; // дата рождения

};

Обратите внимание, что структура Date, являющаяся вложенной для структуры PersonInfo, объявлена раньше структуры PersonInfo.

Пример объявления переменной person типа PersonInfo:

PersonInfo person;

Чтобы получить доступ к значению поля birthday - переменной структурного типа PersonInfo, нужно использовать операцию точка: person.birthday, но так как birthday в свою очередь является полем структурного типа Date, то доступ, например, к году рождения осуществляется добавлением операции точка с именем year: person.birthday.year

Приведем еще несколько примеров на вложенные структуры.

Пример 14.6

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

struct tag_fio

{

char last[100];

char first[100];

char otch[100];

};

struct tag_people

{

struct tag_fio fio; //вложенная структура

char job[100];

int old;

};

Рассмотрим способ инициализации и доступ к полям структуры people на следующем примере.

Пример 14.7

Работа с вложенными структурами.

int main()

{

struct people man =

{

{“Иванов”, “Иван”, “Иванович”},“Электрик”, 50 };

printf(“Ф.И.О.:%s %s %s\n”,man.fio.last,man.fio.first, man.fio.otch);

printf(“Профессия : %s \n”,man.job);

printf(“Возраст : %d\n”,man.old);

return 0;

}

В данном примере показано, что для инициализации структуры внутри другой структуры следует использовать дополнительные фигурные скобки, в которых содержится информация для инициализации полей фамилии, имени и отчества сотрудника. Для того чтобы получить доступ к полям вложенной структуры, выполняется сначала обращение к ней по имени man.fio, а затем к ее полям: man.fio.last, man.fio.first и man.fio.otch. Используя данное правило, можно создавать многоуровневые вложения для эффективного хранения и извлечения данных.

Пример 14.8

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

struct fn //описан структурный тип с именем fn,

{

char fam[25]; //включающий фамилию

char name [15]; // имя

char otch[30]; // и отчество

};

struct student //описан тип student, включающий

{

fn namestud; //фамилию и имя студента,

int age ; //его возраст,

int mark [5] ; //оценки в сессию по пяти предметам

}stud [30]; //определен массив stud из 30 элементов,

// каждый элемент которого типа student