Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 36

ООП . Геометрические тела

06.03.2020, 00:49. Показов 1664. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте , нужна ваша помощь . Дан класс Geometric_object . И у него есть два подкласса Plane_figure_2d и Volumetric_body_3d , и у каждого дочернего класса есть свои подклассы . Нужно посчитать площадь и периметр для плоских фигур , площадь и объем для геометрических тел . Программа у меня работает , но если я задаю больше одного раза , то программ выдает ошибку . Помогите ,пожалуйста исправить . И вот еще что . У сферы и у куба только одна площадь , как исправить ,чтобы не было -1 ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
#include <iostream>
#include <cmath>
using namespace std;
class Geometric_object
{
public:
};
class Plane_figure_2d : public Geometric_object // Класс для плоских фигур .
{
public:
    virtual double CalcPerimeter() = 0; // Используется динамическое связывание
    //Функция вычисления объема будент унаследована всеми классами наследниками класса Geometric_object
    virtual double CalcArea() = 0;
    virtual ~Plane_figure_2d() // Деструктор
    {
 
    }
};
//===============================================================
class Without_a_corner : public Plane_figure_2d // Класс для плоских фигур без углов 
{
public:
};
class Circle : public  Without_a_corner // Класс круга
{
    double pi = 3.1415926;
    double r;
public:
    double CalcArea() // площадь круга
    {
        cout << " Площадь круга равна : ";
        return  pi * r * r;
    }
    double CalcPerimeter()// периметр круга
    {
        cout << " Периметр круга равен : ";
        return 2 * pi * r;
    }
    Circle()
    {
        cout << " Введите радиус : ";
        cin >> r;
    }
};
class Oval : public  Without_a_corner
{
    double pi = 3.1415926;
    double a, b;
public:
    double CalcArea()
    {
        cout << " Площадь Овала равна : ";
        return pi * a * b;
    }
    double CalcPerimeter()
    {
        cout << " Периметр  Овала  равен : ";
        return 2 * pi * sqrt((a * a + b * b) / 2);
    }
    Oval()
    {
        cout << " Введите полуоси : ";
        cin >> a >> b;
    }
};
class Four_corner : public Plane_figure_2d // Класс для плоских фигур с 4 углами 
{
public:
};
class  Parallelogram : public Four_corner
{
    double a, b, h;
public:
    double CalcArea()
    {
        cout << " Площадь параллелограма равна : ";
        return a * h;
    }
    double CalcPerimeter()
    {
        cout << " Периметр параллелограма равен : ";
        return 2 * (a + b);
    }
    Parallelogram()
    {
        cout << " Введите длину , ширину и высоту : ";
        cin >> a >> b >> h;
    }
};
class  Square : public Four_corner
{
    double a;
public:
    double CalcArea()
    {
        cout << " Площадь квадрата равна : ";
        return a * a;
    }
    double CalcPerimeter()
    {
        cout << " Периметр  квадрата равен : ";
        return 4 * a;
    }
    Square()
    {
        cout << " Введите сторону квадрата : ";
        cin >> a;
    }
};
class Rhombus :public Four_corner
{
    double a, h;
public:
    double CalcArea()
    {
        cout << " Площадь ромба равна : ";
        return a * h;
    }
    double CalcPerimeter()
    {
        cout << " Периметр ромба равен : ";
        return 4 * a;
    }
    Rhombus()
    {
        cout << " Введите длину и высоту : ";
        cin >> a >> h;
    }
};
class Trapeze :public Four_corner
{
    double a, b, c, h, d;
public:
    double CalcArea()
    {
        cout << " Площадь трапеции равна : ";
        return ((a + b) / 2) * h;
    }
    double CalcPerimeter()
    {
        cout << " Периметр трапеции равен : ";
        return a + b + c + d;
    }
    Trapeze()
    {
        cout << "Введите cтороны трапеции и высоту : ";
        cin >> a >> b >> c >> d >> h;
    }
};
 
class Rectangle :public Four_corner
{
    double a, b;
public:
    double CalcArea()
    {
        cout << " Площадь прямоугольника равна : ";
        return a * b;
    }
    double CalcPerimeter()
    {
        cout << " Периметр прямоугольника равен : ";
        return 2 * (a + b);
    }
    Rectangle()
    {
        cout << " Введите длину и ширину :";
        cin >> a >> b;
    }
};
class Triangle : public Plane_figure_2d
{
    double a, b, c, h;
public:
    double CalcArea()
    {
        cout << " Площадь треугольника равна : ";
        return (a * h) / 2;
    }
    double CalcPerimeter()
    {
        cout << " Периметр треугольника равен : ";
        return  a + b + c;
    }
    Triangle()
    {
        cout << " Введите стороны треугольника и высоту :";
        cin >> a >> b >> c >> h;
    }
};
class Volumetric_body_3d :public Geometric_object
{
public:
    virtual double CalcVolume() = 0;
    virtual double CalcArea_lateral_surface() = 0;
    virtual double CalcArea_total_surface() = 0;
    virtual ~Volumetric_body_3d()
    {
 
    }
 
};
class Body_of_revolution :public Volumetric_body_3d
{
public:
};
class Sphere :public Body_of_revolution
{
    double pi = 3.1415926;
    double r;
public:
    double  CalcArea_lateral_surface()
    {
        return -1;
    }
    double CalcArea_total_surface()
    {
        cout << " Площадь сферы равна : ";
        return 4 * pi * r * r;
    }
    double CalcVolume()
    {
        cout << " Объем сферы равен : ";
        return (4 * pi * r * r * r) / 3;
    }
    Sphere()
    {
        cout << " Введите радиус : ";
        cin >> r;
    }
};
class Cylinder :public Body_of_revolution
{
    double pi = 3.1415926;
    double r, h;
public:
    double CalcArea_lateral_surface()
    {
        cout << " Площадь боковой поверхности цилиндра равна : ";
        return 2 * pi * r * h;
    }
    double CalcArea_total_surface()
    {
        cout << " Площадь полной поверхности цилиндра равна : ";
        return 2 * pi * r * (r + h);
    }
    double CalcVolume()
    {
        cout << " Объем цилиндра равен : ";
        return pi * r * r * h;
    }
    Cylinder()
    {
        cout << " Введите радиус и высоту : ";
        cin >> r >> h;
    }
};
class Cone :public Body_of_revolution
{
    double pi = 3.1415926;
    double r, h, l;
public:
    double CalcArea_lateral_surface()
    {
        cout << " Площадь боковой поверхности конуса равна : ";
        return  pi * r * l;
    }
    double CalcArea_total_surface()
    {
        cout << " Площадь полной поверхности конуса  равна : ";
        return  pi * r * (r + l);
    }
    double CalcVolume()
    {
        cout << " Объем  конуса равен : ";
        return (pi * r * r * h) / 3;
    }
    Cone()
    {
        cout << " Введите радиус , высоту и образующую конуса: ";
        cin >> r >> h >> l;
    }
};
class Polyhedrons :public Volumetric_body_3d
{
public:
};
class Cube :public Polyhedrons
{
    double a;
public:
    double CalcArea_total_surface()
    {
        cout << " Площадь куба равна : ";
        return  6 * a * a;
    }
    double CalcArea_lateral_surface()
    {
        return -1;
    }
    double CalcVolume()
    {
        cout << " Объем  куба равен : ";
        return a * a * a;
    }
    Cube()
    {
        cout << " Введите сторону куба : ";
        cin >> a;
    }
};
int main()
{
    int  N_Figures;
    setlocale(LC_ALL, "Russian");
    cout << "   Сколько фигур вы хотите задать?" << endl;
    cin >> N_Figures;
    Plane_figure_2d** ArrPtrToFigure = new Plane_figure_2d * [N_Figures];
    Volumetric_body_3d** ArrPtrToFigure2 = new Volumetric_body_3d * [N_Figures];
    for (int i = 0; i < N_Figures; i++)
    {
        cout << " Введите : 1-круг ; 2-Овал ; 3-параллелограмм ; 4-квадрат ; 5-ромб ; 6-трапеция ; 7-прямоугольник ; 8-треугольник; 9-сфера ; 10-цилиндр ;11-конус ;12-куб . " << endl;
        int  number;
        cin >> number;
        switch (number)
        {
        case 1:
        {
            ArrPtrToFigure[i] = new Circle();
            break;
        }
        case 2:
        {
            ArrPtrToFigure[i] = new Oval();
            break;
        }
        case 3:
        {
            ArrPtrToFigure[i] = new Parallelogram();
            break;
        }
        case 4:
        {
            ArrPtrToFigure[i] = new Square();
            break;
        }
        case 5:
        {
            ArrPtrToFigure[i] = new Rhombus();
            break;
        }
        case 6:
        {
            ArrPtrToFigure[i] = new Trapeze();
            break;
        }
        case 7:
        {
            ArrPtrToFigure[i] = new Rectangle();
            break;
        }
        case 8:
        {
            ArrPtrToFigure[i] = new Triangle();
            break;
        }
        case 9:
        {
            ArrPtrToFigure2[i] = new Sphere();
            break;
        }
        case 10:
        {
            ArrPtrToFigure2[i] = new Cylinder();
            break;
        }
        case 11:
        {
            ArrPtrToFigure2[i] = new Cone();
            break;
        }
        case 12:
        {
            ArrPtrToFigure2[i] = new Cube();
            break;
        }
        }
        for (int i = 0; i < N_Figures; i++)
        {
            if (number >= 1 && number < 9)
            {
                cout << ArrPtrToFigure[i]->CalcArea() << endl; //Использование полиморфизма
                cout << ArrPtrToFigure[i]->CalcPerimeter() << endl; //Использование полиморфизма
            }
            else
            {
                cout << ArrPtrToFigure2[i]->CalcArea_lateral_surface() << endl; //Использование полиморфизма
                cout << ArrPtrToFigure2[i]->CalcArea_total_surface() << endl; //Использование полиморфизма
                cout << ArrPtrToFigure2[i]->CalcVolume() << endl; //Использование полиморфизма
            }
        }
        for (int i = 0; i < N_Figures; i++)
        {
            if (number >= 1 && number < 9)
            {
                delete ArrPtrToFigure[i];
            }
            else
            {
                delete ArrPtrToFigure2[i];
            }
        }
    }
    delete[]ArrPtrToFigure;
    delete[]ArrPtrToFigure2;
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2020, 00:49
Ответы с готовыми решениями:

[ООП] Геометрические функции
Очередное задание по ООП (наследование): Используя метод декомпозиции реализовать геометрические функции + значение площадей этих фигур. ...

ООП. Геометрические фигуры
Классическая задачка на абстрактные классы: создать абстрактный класс Figure, напихать туда чисто виртуальных методов аля Draw(), Rotate(),...

Классическая задача ООП: геометрические фигуры
Решить эту задачу не составляет труда, сталкивался с ней уже. Самому интересно взглянуть чужой код, а лучше посмотреть решение...

4
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
06.03.2020, 10:26
Цитата Сообщение от Polnochniy Посмотреть сообщение
но если я задаю больше одного раза , то программ выдает ошибку
Конечно, подумайте сами что будет если в главном цикле (где Вы вводите тип фигуры), на его первой итерации, Вы введете number соответствующий плоской фигуре, на второй объемной. Еще один вопрос, который Вам следует задать - это то, как вы удаляете обработанные фигуры: каким боком там стоит number и зачем всякий раз проходить по всему массиву указателей на фигуры и удалять все подряд хватая как уже удаленные указатели, так и еще не инициализированные?

Подсказка: добавьте в базовый сласс энумиратор типа фигуры и переменную, хранящую тип для конкретной фигуры инициализацию которой поместите в соответствующие конструкторы, судя по приведенному использованию полиморфизма достаточно будет всего двух позиций "Plain_2d" и "Volume_3d" и ориентируйтесь по ним. Также подумайте о целесообразности использования массива указателей, хозяин - барин, конечно, но использование массива возлагает на Вас определенные обязательства.
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 36
06.03.2020, 14:40  [ТС]
Annemesski, я недавно начал изучать ООП и не понял ,что вы хотели сказать
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.03.2020, 19:56
Polnochniy,
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
/////////////////////////////////////////////////
struct Figure
{   // общий интерфейс
    virtual void Square() = 0;
    virtual ~Figure() {}
};
 
struct FlatFigure : Figure
{   // интерфейс фигур на плоскости
    virtual void Perimetr() = 0;
};
 
struct VolumeFigure : Figure
{   // интерфейс фигур в пространстве
    virtual void Volume() = 0;
};
/////////////////////////////////////////////////
/////////////// конкретные фигуры ///////////////
struct Circle : FlatFigure
{
    void Square() override { std::cerr << __FUNCTION__ << '\n'; }
    void Perimetr() override { std::cerr << __FUNCTION__ << '\n'; }
};
 
struct Cube : VolumeFigure
{
    void Square() override { std::cerr << __FUNCTION__ << '\n'; }
    void Volume() override { std::cerr << __FUNCTION__ << '\n'; }
};
///////////////////////////////////////////////
#include <vector>
 
int main()
{
    std::vector<std::unique_ptr<Figure>> fig;
    fig.push_back(std::make_unique<Cube>());
    fig.push_back(std::make_unique<Circle>());
    fig.push_back(std::make_unique<Circle>());
    fig.push_back(std::make_unique<Cube>());
 
    for (auto&& ptr : fig)
    {
        ptr->Square();
 
        auto flat = dynamic_cast<FlatFigure*>(ptr.get());
        if (flat) flat->Perimetr();
        else
        {
            auto volume = dynamic_cast<VolumeFigure*>(ptr.get());
            if (volume) volume->Volume();
            else throw std::runtime_error("invalid popalsa");
        }
        std::cerr << '\n';
    }
}
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 36
09.03.2020, 20:27  [ТС]
zayats80888 , слишком сложно )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2020, 20:27
Помогаю со студенческими работами здесь

Геометрические Тела 1 вариант )
Всем доброго времени суток )не подскажите ,что исправить в этом чертеже 1 вариант Геометрические тела. Буду благодарен ;) автокадом...

Найти массу тела, заданного ограничивающими плоскостями. Плотность тела = μ
сводится к подсчету тройного интеграла ∫∫∫μ(x,y,z)dxdydz по области V проблема в расчете интеграла.. не знаю как пределы подставить...

Как изменится масса тела, если полная энергия тела возросла
Доброго времени суток. Помоги пожалуйста с решением задачи: Как изменится масса тела,если полная энергия тела возросла на 1,2 кДЖ? ...

Кинетическая энергия движущегося тела W(k)=m*v^2/2, где m - масса тела, v - его скорость
Кинетическая энергия движущегося тела W(k)=m*v^2/2, где m - масса тела, v - его скорость. Составить алго-ритм для получения зависимости Wk...

Найти уравнение скорости движения тела и положение тела как функцию от времени
задан закон изменения ускорения движения тела как функция от времени. Найти уравнение скорости движения тела и положение тела как функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru