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

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

06.03.2020, 00:49. Показов 1632. Ответов 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
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru