Структуры

Прежде чем говорить о структурах, вспомним массивы. Как вы, наверное, помните, массивы предназначены для хранения однотипных данных. Другими словами каждый элемент массива представляет собой значение определенного типа: целое число, символ, строка. Но зачастую, в программах, требуется хранить в одном месте данные разных типов.
В качестве примера рассматрим программу которая хранит список книг в библиотеке. Про каждую книгу нам известно: название, автор, год издания, количество экземпляров, стоимость книги
Типы переменных, используемые для хранения подобных данных необходимо взять такие:
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.