Вложенные структуры

Язык С/С++ допускает вложенность структур. Это позволяет создавать довольно сложные логические структуры данных. Например, необходимо определить структуру, которая описывает окружность. Центр окружности это точка в двумерном пространстве и ее можно описать как структуру. Описание окружности можно выполнит различными способами.

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;

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: