Прежде чем говорить о структурах, вспомним массивы. Как вы, наверное, помните, массивы предназначены для хранения однотипных данных. Другими словами каждый элемент массива представляет собой значение определенного типа: целое число, символ, строка. Но зачастую, в программах, требуется хранить в одном месте данные разных типов.
В качестве примера рассматрим программу которая хранит список книг в библиотеке. Про каждую книгу нам известно: название, автор, год издания, количество экземпляров, стоимость книги
Типы переменных, используемые для хранения подобных данных необходимо взять такие:
string – название, автор
int – год издания, количество экземпляров
float – стоимость книги.
Возможная реализация представляется таким образом: завести для каждого отдельного качества отдельный массив. Например:
string author[100]; // автор
string title[100]; // название
int year[100]; // год издания
int count[100]; // количество экземпляров
float price[100]; //стоимость
Теперь для того, чтобы вывести информацию о какой-либо книге, мы можем обратиться по i-му номеру к соответствующему элементу массиву.
Например:
cout<<author[3]<<". "<<title[3]". "<<year[3]<<" year";
Теперь представим, что нам надо отсортировать список книг в определенном порядке.
Все таки описывая таким образом данные, мы получили 5 массивов, которая логически между собой не связаны. Придется постоянно при сортировке сортировать сразу все массивы. Достаточно неудобно и есть вероятность забыть про что-то.
Все таки хотелось бы, чтобы все эти массивы были объединены в один какой-то блок, с которым можно было бы работать как с единым объектом.
Для таких целей и служат Структуры.
Структура – это тип данных, предназначенный для объединения данных различных типов в единое целое
Структура может включать в себя несколько полей - элементов разных типов (в том числе и другие структуры).
Давайте попробуем нашу информацию описать в виде структуры.
Прежде чем использовать структуру (как и любую другую переменную) ее нужно объявить (описать внутреннюю структуру, можно назвать это шаблоном).
Объявить струткру можно так:
struct /*имя структуры*/ {
/*переменные-члены структуры*/
};
Таким образом, мы можем под одним именем объедиить самые разные данные. Это могут быть простые типы данных или даже массивы. Причем сама структура может также
быть и массивом. Тогда она будет называться массив-структур.
Имя структуры фактически является новым типом данных, который мы можем использовать в программе, также как и любой другой тип.
Обычно структуры описываются сразу после подключения заголовочных файлов.
Иногда, для удобства, описание структур выносят в отдельный заголовочный файл.
Возвращаясь к нашему примеру, опишем структуру
book с полями
author, title, year, count, price соответствующих типов.
struct book {
string author; // автор
string title; // название
int year; // год издания
int count; // количество экземпляров
float price; //стоимость
};
В качестве полей структуры могут выступать любые встроенные типы данных и даже другие структуры.
На имена полей накладываются те же ограничения, что и на обычные переменные. Внутри одной структуры не должно быть полей с одинаковыми именами.
Для обращения к отдельным полям структуры используют так называемую
точечную запись, разделяя точкой имя структуры и имя поля.
Например,
b.author обозначает "
поле author структуры b"
C полями структуры можно обращаться также, как и с обычными переменными соответствующего типа. Можно вводить значения полей с клавиатуры, выводить значения на экран, присваивать значения. То есть работать как с обычной переменной.
Например,
getline(cin, b.author);
getline(cin, b.title);
cin>>b.count;
Давайте потренируемся.
Объявите в программе структуру с именем
person, содержащей поля
s1, s2 строкового типа и целочисленное поле
n.