- •1. Краткие теоретические сведения
- •1.1. Понятие структуры
- •1.2. Определение (описание) шаблона структуры
- •1.3. Описатель типа
- •1.4. Объявление переменных структурного типа
- •1.5. Инициализация переменной структурного типа
- •1.6. Операции со структурами
- •1.7. Доступ к значениям полей структурного типа
- •1.8. Вложенные структурные типы
- •1.9. Массивы структурного типа
- •1.10. Структурные переменные и указатели
- •1.11. Структуры и функции
- •1.11. Использование синонима типа
- •1.12. Доступ к отдельному биту
- •1.13.Типичные ошибки при разработке структур
- •1.14. Примеры программирования задач на структуры
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Вычисление с использованием структур
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Массив структур
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример выполнения работы
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Структуры данных
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Структуры данных
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 31
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Создание и обработка структур
- •2.4.5.1. Условие задания
- •2.4.6.2. Пример для варианта 30
- •2.4.7.2. Пример для варианта 30
- •2.4.7.3. Программа
- •2.4.7.4. Тестирование
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Понятие структуры 2
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