Структура. Определение структур.
В самом начале изучения языка С мы с Вами познакомились с понятием типы
данных. Сегодня мы попробуем расширить это понятие. Дело в том, что помимо
стандартных типов программист может создавать свои собственные составные типы
данных под названием структуры. Именно они и будут являться темой нашего
занятия.
Структура - это множество, состоящее из одного или более объектов, возможно
имеющих различные типы, объединенных под одним именем.
Тип данных struct - один из основных строительных блоков данных в языке. Он
предоставляет удобный способ объединения различных элементов, связанных между
собой логической связью.
Рассмотрим особенности работы со структурами на примере.
#include <iostream>
using namespace std;
/*
Создание пользовательского типа данных
(структуры) для хранения даты.
Все данные касающиеся одного объекта
собраны вместе.
*/
struct date
{
int day; //день
int month; //месяц
int year;//год
int weekday; //день недели
char mon_name[15];// название месяца
};
void main(){
//создание объекта с типом date и инициализация его при создании
date my_birthday={20,7,1981,1,"July"};
// показ содержимого объекта на экран
// обращение к отдельному члену структуры производится через
// оператор точка (.)
cout<<"________________MY BIRTHDAY____________________\n\n";
cout<<"DAY "<<my_birthday.day<<"\n\n";
cout<<"MONTH "<<my_birthday.month<<"\n\n";
cout<<"YEAR "<<my_birthday.year<<"\n\n";
cout<<"WEEK DAY "<<my_birthday.weekday<<"\n\n";
cout<<"MONTH NAME "<<my_birthday.mon_name<<"\n\n";
// Создание пустого объекта и заполнение его с клавиатуры
date your_birthday;
cout<<"DAY ? ";
cin>>your_birthday.day;
cout<<"MONTH ?";
cin>>your_birthday.month;
cout<<"YEAR ?";
cin>>your_birthday.year;
cout<<"WEEK DAY ?";
cin>>your_birthday.weekday;
cout<<"MONTH NAME ?";
cin>>your_birthday.mon_name;
cout<<"________________YOUR BIRTHDAY____________________\n\n";
cout<<"DAY "<<your_birthday.day<<"\n\n";
cout<<"MONTH "<<your_birthday.month<<"\n\n";
cout<<"YEAR "<<your_birthday.year<<"\n\n";
cout<<"WEEK DAY "<<your_birthday.weekday<<"\n\n";
cout<<"MONTH NAME "<<your_birthday.mon_name<<"\n\n";
}
|
Особенности структур.
1. Описание структуры начинается со служебного слова struct, за которым может
следовать необязательное имя, называемое именем типа структуры (здесь это date).
Это имя типа структуры используется в дальнейшем для создания конкретного
объекта.
2. За именем типа структуры идет заключенный в фигурные скобки список
элементов структуры, с описанием типа каждого элемента (элементом структуры
может быть переменная, массив или структура). Элементы структуры отделяются друг
от друга точкой с запятой. Например:
struct date
{
int day;
int month;
int year;
int yearday;
char mon_name[5];
};
|
3. За правой фигурной скобкой, закрывающей список элементов, может следовать
список объектов. Например, оператор struct date {...} x,y,z; определяет
переменные x,y,z в качестве структур описанного типа и приводит к выделению
памяти.
Изобразим распределение памяти для структуры x типа date:
4. Описание структуры, за которым не следует список объектов, не приводит к
выделению памяти (как в программе выше); оно только определяет шаблон (форму)
структуры. Однако, если такое описание снабжено именем типа (например, date), то
это имя типа может быть использовано позднее при определении объектов структур
(определение структур your_birthday и my_birthday в программе).
5. Структуру можно инициализировать, поместив вслед за ее определением список
инициализаторов для ее компонент, заключенный в фигурные скобки. В программе
таким образом инициализирована структура my_birthday.
date my_birthday={20,7,1981,1,"July"};
|
6. Обращение к определенному члену структуры производится с помощью
конструкции вида:
<имя структуры>.<имя элемента>
|
7. Структуры могут вкладываться одна в другую, но самовложение структур
запрещено!
Например, учетная карточка служащего может выглядеть так:
struct date
{
int day; // День.
char month[10]; // Месяц.
int year; // Год.
};
struct person
{
char name[namesize]; // Имя, фамилия, отчество.
char address[adrsize]; // Домашний адрес.
int zipcode[2]; // Почтовый индекс.
int s_number [2]; // Код соц.обеспечения.
int salary[4]; // Зарплата.
date birthdate; // Дата рождения.
date hiredate; // Дата поступления на работу.
};
|
Структура person содержит две структуры типа date и наша программа должна
содержать шаблон для структуры date.
Если определить переменную Nick следующим образом:
то Nick.birthdate.month будет обозначать месяц рождения. Операция доступа к
элементу структуры "." вычисляется слева направо.
А, теперь, рассмотрев основы, перейдем к тому, что же можно делать со
структурами. Для этого открываем следующий раздел данного урока.