, : arrays4, : Top


13 Структуры

Раньше для хранения данных использовались простые типы данных: числа, строки и т.д. Тем не менее, многие объекты, которые возникают в программировании, нельзя охарактеризовать только одной числовой или строковой величиной. Например, точка на плоскости задается парой действительных чисел (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)).

  1. (A) Выведите координаты наиболее удаленной от начала координат точки.
  2. (B) Выведите координаты центра тяжести данного множества точек (учтите, что это – два действительных числа).
  3. (C) Выведите диаметр данного множества – максимальное расстояние между двумя данными точками. В реалиализации программы должна быть функция вычисления расстояние между двумя точками.
  4. (D) Выведите все исходные точки в порядке возрастания их расстояний от начала координат. Программа выводит только последовательность точек, их количество выводить не надо.
  5. (E) Среди исходных точек найдите три, образующие треугольник с максимальным периметром. Выведите данный периметр.
  6. (F) Среди исходных точек надите три, образующие треугольник максимальной площади. Выведите данную площадь.

Дан текстовый файл содержащий список учащихся и их оценки по трем предметам: математике, физике, информатике. Формат файла: сначала количество учащихся 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
  1. (G) Определите средний балл всех учащихся по каждому предмету. Выведите три действительных числа: средний балл всех учащихся по математике, по физике, по информатике.
  2. (H) Выведите фамилии и имена учащихся, не имеющих троек (а также двоек и колов).
  3. (I) Определите учащихся с наилучшей успеваемостью, то есть с максимальным средним баллом по трем предметам. Выведите одного или нескольких учащихся, имеющих максимальный средний балл.
  4. (J) (Демо-версия ЕГЭ-2007 по информатике, задача C4) Определите трех учащихся с наилучшим средним баллом по трем предметам. Выведите фамилии и имена этих учащихся. Если при этом у нескольких учащихся средний балл совпадает со средним баллом учащегося "занявшего 3-е место", то необходимо вывести их всех (то есть если средние баллы учащихся равны 1, 2, 3, 4, 5, то нужно вывести трех учащихся со средним баллом 3, 4, 5, а если средние баллы равны 1, 2, 3, 4, 4, 5, 5, то нужно вывести четырех учащихся со средним баллом 4 или 5). Выводить фамилии и имена необходимо в порядке ввода.
  5. (K) Выведите фамилии и имена учащихся в порядке убывания их среднего балла.