Язык С/С++ допускает вложенность структур. Это позволяет создавать довольно сложные логические структуры данных. Например, необходимо определить структуру, которая описывает окружность. Центр окружности это точка в двумерном пространстве и ее можно описать как структуру. Описание окружности можно выполнит различными способами.
struct
{
struct
{
double x, y;
} center;
double radius;
} circle;
Тут описана структурированная переменная sphere, которая содержит два поля center и radius. Причем поле center также является структурой, содержащей 3 координаты центра сферы. Можно также описать поле center с использованием тега структуры.
struct s_center
{
double x, y;
};
struct
{
s_center center;
double radius;
} circle;
Также с использованием тега структуры можно определить и саму сферу.
struct s_center
{
double x, y;
};
struct s_circle
{
s_center center;
double radius;
};
s_circle circle;
Последний вариант является предпочтительным, т.к. он более наглядный и его удобнее использовать в программе.
Доступ к полям вложенных структур выполняется так же, как к полям обычных структур. Имена полей вложенных структур разделяются точками.
|
|
идентификатор.поле1.поле2.поле3
В примере выполняется вычисление точки, в которой окружность пересекает ось Oy. Решается задача следующим образом. Возможны три варианта расположения окружности в системе координат:
1. Если выполняется условие xc > R, то окружность не пересекает ось Oy (Рис. 45).
Рис. 45
2. Если выполняется условие xc = R, то окружность пересекает ось Oy в точке yc (Рис. 46).
Рис. 46
3. Если выполняется условие xc < R, то окружность пересекает ось Oy в двух точках y1 и y2 (Рис. 47). Вычислить координаты точек можно из прямоугольного треугольника y1yсc, используя теорему Пифагора. Зная длину катета |y1yс|, координаты искомых точек буду равны y1 = yc + |y1yс|, y1 = yc - |y1yс|.
Рис. 47
Программа, реализующая предложенный алгоритм представлена ниже.
#include <iostream>
#include <math.h>
struct s_center
{
double x, y;
};
struct s_circle
{
s_center center;
double radius;
};
void main()
{
s_circle circle;
cout << “Введите координату X” << ‘\n’;
cin >> circle.center.x;
cout << “Введите координату Y” << ‘\n’;
cin >> circle.center.y;
cout << “Введите радиус окружности” << ‘\n’;
cin >> circle.center.radius;
if(fabs(circle.center.x) > fabs(circle.center.radius))
{
cout << “Окружность не пересекает ось Oy” << ‘\n’;
return;
}
if(fabs(circle.center.x) == fabs(circle.center.radius))
{
cout << “Окружность пересекает ось Oy в точке” << circle.center.y << ‘\n’;
return;
}
if(fabs(circle.center.x) < fabs(circle.center.radius))
{
double y1, y2;
y1 = circle.center.y + sqrt(pow(circle.center.radius, 2) - pow(circle.center.x, 2));
y2 = circle.center.y - sqrt(pow(circle.center.radius, 2) - pow(circle.center.x, 2));
cout << “Окружность пересекает ось Oy в точках” << y1 << “ и ” << y2 << ‘\n’;
|
|
return;
}
}