Раньше для хранения данных использовались простые типы данных: числа, строки и т.д. Тем не менее, многие объекты, которые возникают в программировании, нельзя охарактеризовать только одной числовой или строковой величиной. Например, точка на плоскости задается парой действительных чисел (x, y), а данные о человеке можно задавать при помощи нескольких строк (фамилии, имени, отчества) и числового параметра: года рождения.
Поэтому удобным является использование объектов, объединяющих сразу ряд параметров, каждый из которых может фигурировать, как отдельная переменная.
Для этого используются специальные типы данных, которые в языке C
называются структурами, а в языке C++ – классами.
Например, структура Point
, задающая точку на плоскости и
содержащая два действительных числа x
и y
может быть задана следующим образом:
struct Point { double x; double y; };
Переменные x
и y
, входящие в структуру Point
, называются
полями структуры. Определение структуры дается вне всех функций (и, обычно делается перед
объявлением всех функций). Определение структуры обязательно завершается точкой с запятой.
После этого мы можем работать с Point
, как с новым типом данных, содержащим два поля:
x
и y
. Примеры создания переменной и массива переменных типа Point
:
Point P, Arr[10];
Чтобы обратиться к полю какой-либо структуры, используется оператор "точка". Его
левый операнд – идентификатор переменной типа структура, правый операнд –
имя поля. Например, P.x
или Arr[i].y
.
Например, считать координаты точки, сохранить их в переменной P
и
вывести на экран расстояние от начала координат до этой точки можно следующим образом:
cin>>P.x>>P.y; cout<<sqrt(P.x*P.x+P.y*P.y);
По сути, величины P.x
и P.y
являются независимыми переменными, скомбинированными
в один объект. С этим объектом можно работать, как с единым целым, например, можно выполнять
присваивания вроде Arr[i]=P
, можно сохранить набор точек в одном массиве и т.д.
Аналогично, можно определить структуру типа Person
для хранения информации о человеке:
struct Person { string FirstName; // Имя string LastName; // Фамилия int BirthYear; // Год рождения };
Теперь можем работать с данными типа Person
:
Person Vasya; Vasya.FirstName="Василий"; Vasya.LastName="Пупкин"; Vasya.BirthYear=1990; cout<<Vasya.FirstName<<" "<<Vasya.LastName<< " родился в "<<Vasya.BirthYear<<" году"<<endl;
Полями структур могут быть произвольные типы данных. Можно, например, создать структуру, полями которой будут массивы или другие структуры.
Например, пусть мы хотим определить структуру Circle
для определения окружности. Окружность
задается центром и радиусом. Радиус – это действительное число (поле Radius
типа double
), а центр –
это, конечно же, точка, то есть поле Center
имеет тип Point
. Получили:
struct Circle { Point Center; double Radius; };
Дальше с такими "вложенными" структурами можно работать так:
Circle A; A.Radius=10; A.Center.x=-3; A.Center.y=15;
Программа получает на вход набор точек на плоскости.
Сначала задано количество точек n, затем идет
последовательность из n строк, каждая из которых
содержит два числа: координаты точки. Величина n
не превосходит 100, все исходные координаты – целые
числа, не превосходящие 103.
Например, четыре точки в вершинах единичного квадрата задаются так:
4 0 0 0 1 1 1 1 0
Создайте структуру Point
и сохраните исходные
данные в массиве структур Point
.
Если в задаче ответом является действительное число,
его необходимо выводить с точностью в 15 значащих знаков
(перед выводом необходимо дать инструкцию cout.precision(15)
).
Дан текстовый файл содержащий список учащихся и их оценки
по трем предметам: математике, физике, информатике. Формат файла:
сначала количество учащихся n
, затем n
строк, каждая
из которых содержит фамилию, имя и три числа. Данные в строке
разделены одним пробелом. Оценки принимают значение от 1 до 5.
Пример входного файла:
4 Ivanov Vasiliy 5 3 4 Petrov Sergey 4 3 5 Konstantinov Nikolay 5 5 5 Kuznetsov Ivan 5 4 4
Если в программе требуется вывести фамилии и имена учащихся, то необходимо вывести их по одному на строке разделяя одним пробелом. Выводить оценки не нужно. Порядок вывода должен быть таким же, как в исходных данных, если не оговорено другое. Например:
Petrov Sergey Kuznetsov Ivan