Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 03.05.2016
Сообщений: 141
1

Реализовать иерархию классов для работы с геометрическими телами

30.05.2017, 06:55. Показов 2527. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, выполнить такую задачу, мучаюсь не первый день с ней. Вот текст задачи:
Реализовать иерархию классов для работы с геометрическими телами. Должны быть реализованы как
минимум три конкретных (неабстракных) класса «Шар», «Цилиндр», «Конус» и базовый класс. По возмож-
ности реализовать также класс «Эллипсоид». Конкретные классы должны содержать данные, необходимые
для задания формы тел (но не их положения в пространстве). Должны быть реализованы необходимые
конструкторы и деструкторы, методы для вычисления объема и площади поверхности тел, а также метод,
позволяющий увеличить размеры тела в заданное число раз. Кроме того, должен быть перегружен оператор
вывода в поток, так что при выводе тела можно было бы получить, например, следующую информацию:
Ball ( r = 5)
Cylinder ( r = 3 , ...)
Cone ( r = 2 , ...)
Используя построенную иерархию, напишите следующую тестовую программу. Создайте массив тел и
заполните его случайными телами любых размеров. Выведите информацию о телах на экран. Выведите
значения их площадей поверхности и объемов. Увеличьте все тела в заданное число раз и снова выведите
информацию о телах, их площадях поверхности и объемах.

Сам честно пытался написать, код получился огроменный. Но и туча ошибок синтаксических и похоже с раздельной компиляции.
В случае если потребуется код, скажите через что мне его прислать в комментарий (что используется для этого? Я видел на этом форуме коды с пронумерованными строками).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2017, 06:55
Ответы с готовыми решениями:

Реализовать иерархию классов для моделирования работы магазина, продающего колоды карт (по 36 и 52 карты)
Задание: 1. Реализовать класс: Магазин колод карт. Добавить возможность добавлять новые...

Создать иерархию классов для работы с комплексными числами
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в...

Как можно организовать иерархию классов для работы с графами
Подскажите варианты того, как можно организовать иерархию классов для работы с графами (или создать...

Реализовать иерархию классов
Реализовать иерархию классов Х->Y. В классе Х присутствуют данные х1, х2. В классе Y-данное y....

6
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
30.05.2017, 07:04 2
Не ленитесь пользоваться поиском.
Эта тема очень модная в этом разделе.
Виртуальные классы

Класс для работы с геометрическими фигурами
1
2 / 2 / 0
Регистрация: 03.05.2016
Сообщений: 141
30.05.2017, 07:08  [ТС] 3
Скажите, пожалуйста, а с помощью чего на этом форуме вот так вот в комментарий вставляют код Реализовать иерархию классов Точка - Линия - Круг - 1ый комментарий: в нем код из 177 строк.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
30.05.2017, 07:50 4
выделить код и на панели сверху нажать кнопочку со значком с++
1
2 / 2 / 0
Регистрация: 03.05.2016
Сообщений: 141
30.05.2017, 19:47  [ТС] 5
Помогите пожалуйста. У меня такая ситуация. Программа не работает из-за раздельной компиляции. Вот что у меня в проге:
class Figure - предок с чисто виртуальной функцией, class Ellipsoid, Ball, Cylinder, Cone - наследники (public). Созданы файлы с директивами макрозащиты соответственно Ellipsoid.h, Ball.h, Cylinder.h, Cone.h - заголовочные файлы. Ellipsoid.cpp, Ball.cpp, Cylinder.cpp, Cone.cpp - файлы с реализацией, а main5.cpp - главный файл (где есть int main()). Как мне правильно подключить файлы к main5.cpp, чтобы программа собралась? Компилятор DevC++ ругается и выдает 4 сообщения:
1)Cannot allocate an object of abstract type 'Ellipsoid'. Остальные - аналогично.

Я решил сделать то же самое без раздельной компиляяции, то есть все в один файл запихнуть, все получилось.


Почему оператор возращает адрес а не значение по нему? В случае, если заменить * на &, то ничего не изменится

Добавлено через 24 секунды
Оператор вывода имеет следующий прототип и реализацию:
std::ostream& operator<<(std::ostream & os, const Ellipsoid & obj)
{
return os << "minor axis a, b, c" << obj.a << "," << obj.b << "," << obj.c << " " << "Volume: " << obj.Volume() << " " << "Area: " << obj.Area() <<"\n";
}

в мейне выглядит у меня все так:
int main ()
{
double k = 2.0;
Figure *f[4] = {new Ellipsoid (1, 2, 3), new Ball(1), new Cylinder(1, 1), new Cone(1, 1)};
cout << *f[0] << "\n";
system("pause");
}

Почему оператор возращает адрес а не значение по нему? В случае, если заменить * на &, то ничего не изменитс
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
30.05.2017, 19:50 6
Цитата Сообщение от Alexandrietz Посмотреть сообщение
Почему оператор возращает адрес а не значение по нему?
C++
1
2
3
4
5
friend ostream & operator<<(ostream & os, const Ellipsoid & obj)
{
os << "minor axis a, b, c" << obj.a << "," << obj.b << "," << obj.c << " " << "Volume: " << obj.Volume() << " " << "Area: " << obj.Area() <<"\n";
return os;
}
1
2 / 2 / 0
Регистрация: 03.05.2016
Сообщений: 141
30.05.2017, 22:18  [ТС] 7
а как мне тогда исправить сию ситуацию? Разве есть разница между тем, что я и Вы написали ?

Добавлено через 36 минут
Результат таков:
cout << &f[0] << "," << f[0] <<"\n";

0x23fd50, 0xa51370
А тут ошибка
cout << *f[0] << "\n"; - ошибка.
Вот ее текст:

188 39 C:\Users\Alexander\Desktop\ôèçôàê\ÝÂÌ\Ñåìåñòð 2\task21212\Untitled4.cpp [Error] no match for 'operator<<' in '(& std::operator<< <std::char_traits<char> >((* & std::cout.std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(((const void*)(& f[0])))), ((const char*)",")))->std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(((const void*)f[0])) << * f[0]'

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
 #include <iostream>
#include <cmath>
#include <cstdlib>
#define pi 3.1416
#define p 1.6075
using namespace std;
 
class Figure
{
public:
    virtual double Area() const {}
    virtual double Volume() const {}
    virtual void Increment(double N, const Figure & obj) {}
    virtual ~Figure() {}
};
 
class Ellipsoid: public Figure
{
    double a, b, c;
public:
    Ellipsoid(double a, double b, double c);
    ~Ellipsoid() {}
    double Area() const;
    double Volume() const;
    void Increment(double N, const Ellipsoid & obj);
    friend ostream& operator<<(ostream & os, const Ellipsoid & obj);
};
 
class Ball: public Figure
{
    double R;
public:
    Ball(double R);
    ~Ball() {}
    double Area() const;
    double Volume() const;
    void Increment(double N, const Ball & obj);
    friend ostream& operator<<(ostream & os, const Ball & obj);
};
 
class Cylinder: public Figure
{
    double R, H;
public:
    Cylinder(double R, double H);
    ~Cylinder() {}
    double Area() const;
    double Volume() const;
    void Increment(double N, const Cylinder & obj);
    friend ostream& operator<<(std::ostream & os, const Cylinder & obj);
};
 
class Cone: public Figure
{
    double R, H;
public:
    Cone(double R, double H);
    ~Cone() {}
    double Area() const;
    double Volume() const;
    void Increment(double N, const Cone & obj);
    friend ostream& operator<<(std::ostream & os, const Cone & obj);
};
 
Ellipsoid::Ellipsoid(double a, double b, double c): a(a), b(b), c(c)
{
    if (a <= 0.0 || b <= 0.0 || c <= 0.0 || a == b == c) {exit(1);}
}
 
double Ellipsoid::Area() const
{
    double S = 4.0*pi*pow((1.0/3.0)*(pow(a * b, p) + pow(a * c, p) + pow(b * c, p)), 1.0/p);
    return S;
}
 
double Ellipsoid::Volume() const 
{
    double V = 4.0*pi*a*b*c/3.0;
    return V;
}
 
void Ellipsoid::Increment(double N, const Ellipsoid & obj)
{
    this -> a = N*obj.a;
    this -> b = N*obj.b;
    this -> c = N*obj.c;
}
 
 
ostream& operator<<(ostream & os, const Ellipsoid & obj)
 {
    os << "minor axis a, b, c" << obj.a << "," << obj.b << "," << obj.c << " " << "Volume: " << obj.Volume() << " " << "Area: " << obj.Area() <<"\n";
    return os;
 }
  
 Ball::Ball(double R): R(R)
{
    if (R <= 0.0) exit(1);
}
 
double Ball::Area() const
{
    double S = 4.0*pi*R*R;
    return S;
}
 
double Ball::Volume() const 
{
    double V = 4.0*pi*R*R*R/3.0;
    return V;
}
 
void Ball::Increment(double N, const Ball & obj)
{
    this -> R = N*obj.R;
}
 
 
ostream& operator<<(ostream & os, const Ball & obj)
 {
    return os << "Radius of ball" << obj.R << " " << "Volume: " << obj.Volume() << " " << "Area: " << obj.Area() <<"\n";
 }
  
 Cylinder::Cylinder(double R, double H): R(R), H(H)
{
    if (H <= 0.0 || R <= 0.0) exit(1);
}
 
double Cylinder::Area() const
{
    double S = 2.0*pi*(R*R + R*H);
    return S;
}
 
double Cylinder::Volume() const 
{
    double V = pi*R*R*H;
    return V;
}
 
void Cylinder::Increment(double N, const Cylinder & obj)
{
    this -> R = N*obj.R;
    this -> H = N*obj.H;
}
 
 
ostream& operator<<(ostream & os, const Cylinder & obj)
 {
    return os << "Radius and Height of cylinder" << obj.R << "," << obj.H << "Volume: " << obj.Volume() << " " << "Area: " << obj.Area() <<"\n";
 }
  
 Cone::Cone(double R, double H): R(R), H(H)
{
    if ( R <= 0.0 || H <= 0.0) exit(1);
}
 
double Cone::Area() const
{
    double S = pi*R*(R + sqrt(R*R + H*H));
    return S;
}
 
double Cone::Volume() const 
{
    double V = pi*R*R*H/3.0;
    return V;
}
 
void Cone::Increment(double N, const Cone & obj)
{
    this -> R = N*obj.R;
    this -> H = N*obj.H;
}
 
 
ostream& operator<<(ostream & os, const Cone & obj)
 {
    os << "Radius and Height of cone" << obj.R << "," << obj.H << "Volume: " << obj.Volume() << " " << "Area: " << obj.Area() <<"\n";
    return os;
 }
  
 int main () 
 {
    double N = 2.0;
    Figure *f[4];
    f[0] = new Cone(1.0, 1.0);
    cout << &f[0] << "," << f[0] << *f[0] << "\n";
    system("pause");
 }
0
30.05.2017, 22:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2017, 22:18
Помогаю со студенческими работами здесь

Реализовать иерархию классов
Реализовать иерархию классов: Pair - пара целых чисел, Rational - рациональная дробь (реализовать...

Реализовать иерархию классов
Реализовать иерархию классов Фигура - Треугольник – Прямоугольник (данные-координаты). Определить и...

Реализовать иерархию классов
Реализовать иерархию классов Фигура - ТОЧКА(в коде для треугольника) – Прямоугольник...

Реализовать иерархию классов
Здравствуйте. Компилятор выдаёт ошибку, как её устранить? Как сделать чтобы в каждом классе я...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru