Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 76
1

Многофайловая система классов для описания плоских геометрических фигур

12.02.2020, 06:58. Показов 690. Ответов 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
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
#include <iostream>
#include <cmath>
#include <vector>
 
using namespace std;
 
///////////////ОБЩИЙ КЛАСС ФИГУР/////////////////
class Shape //общий класс фигур
{                                                   //общие параметры для всех фигур
  public:                                           //виртуальные функции: Виртуальная функция отличается об обычной функции тем,
  float Perimeter, Square, CenterX, CenterY, Angle;  //что для обычной функции связывание вызова функции с ее определением
  int type; //тип фигуры                            // осуществляется на этапе компиляции. Для виртуальных функций это происходит
  virtual void Move(float X, float Y) =0;           // во время выполнения программы.
  virtual void Resize(float X, float Y) =0;
  virtual void Rotate(float Kangle) =0;          //Виртуальная функция — это функция, которая определяется в базовом классе,
  virtual void FindSquare() =0;                  //а любой порожденный класс может ее переопределить.
  virtual void FindPerimeter() =0;               //Виртуальная функция вызывается только через указатель или ссылку на базовый класс.
};
 
/////////////////ПРЯМОУГОЛЬНИК///////////////////
class Rectangle: public Shape //прямоугольник
{
  public:
  float LTX, LTY, LDX, LDY, RDX, RDY, RTX, RTY; //координаты углов
  Rectangle(){};
  Rectangle(float KLTX, float KLTY, float KRDX, float KRDY) //конструктор
  {
    type=2; //задаём тип фигуры
    LTX=KLTX; //копируем координаты
    LTY=KLTY;
    RDX=KRDX;
    RDY=KRDY;
    LDX=LTX;
    LDY=RDY;
    RTX=RDX;
    RTY=LTY;
    CenterX=(RDX-LDX)/2.0+LDX; //находим координаты центра
    CenterY=(LTY-LDY)/2.0+LDY;
  }
 
  /////////////////////////////////////////////////
  void Move(float X, float Y) //переместить на X, Y
  {
    //просто сдвинем все координаты
    LTX+=X;
    LTY+=Y;
    LDX+=X;
    LDY+=Y;
    RDX+=X;
    RDY+=Y;
    RTX+=X;
    RTY+=Y;
    CenterX+=X;
    CenterY+=Y;
  }
 
  /////////////////////////////////////////////////
  void Resize(float X, float Y) //изменить размер
  {
    float XP=cos(Angle)*Y*1.0; //находим вектор-сдвиг точки для ширины
    float YP=sin(Angle)*Y*1.0;
    LTX-=(XP/2.0); //и свдигаем
    LDX-=(XP/2.0);
    RTX+=(XP/2.0);
    RDX+=(XP/2.0);
    LTY+=(YP/2.0);
    RTY-=(YP/2.0);
    LDY+=(YP/2.0);
    RDY-=(YP/2.0);
    float XQ=sin(Angle)*X*1.0; //находим вектор-сдвиг точки для длины
    float YQ=cos(Angle)*X*1.0;
    LTX+=(XQ/2.0); //и свдигаем
    LDX-=(XQ/2.0);
    RTX+=(XQ/2.0);
    RDX-=(XQ/2.0);
    LTY+=(YQ/2.0);
    RTY+=(YQ/2.0);
    LDY-=(YQ/2.0);
    RDY-=(YQ/2.0);
  }
 
  /////////////////////////////////////////////////
  void Rotate(float Kangle) //поворот
  {
    float angle=-Kangle*3.14/180; //перевод из градусов в радианы
    //запоминаем первоначальные значения, т.к. они будут меняться в ходе вычислений,
    // а для каждого следующего вычисления нужны первоначальные данные
    float KLTX=LTX;
    float KLTY=LTY;
    float KLDX=LDX;
    float KLDY=LDY;
    float KRTX=RTX;
    float KRTY=RTY;
    float KRDX=RDX;
    float KRDY=RDY;
    LTX = CenterX+ (KLTX-CenterX) * cos(angle) - (KLTY-CenterY) * sin(angle);
    LTY = CenterY+ (KLTX-CenterX) * sin(angle) + (KLTY-CenterY) * cos(angle);
    RTX = CenterX+ (KRTX-CenterX) * cos(angle) - (KRTY-CenterY) * sin(angle);
    RTY = CenterY+ (KRTX-CenterX) * sin(angle) + (KRTY-CenterY) * cos(angle);
    LDX = CenterX+ (KLDX-CenterX) * cos(angle) - (KLDY-CenterY) * sin(angle);
    LDY = CenterY+ (KLDX-CenterX) * sin(angle) + (KLDY-CenterY) * cos(angle);
    RDX = CenterX+ (KRDX-CenterX) * cos(angle) - (KRDY-CenterY) * sin(angle);
    RDY = CenterY+ (KRDX-CenterX) * sin(angle) + (KRDY-CenterY) * cos(angle);
    Angle-=angle;
  }
 
  /////////////////////////////////////////////////
  void FindSquare() //находим площадь
  {
    Square=sqrt(pow((RTX-LTX),2)+pow((RTY-LTY),2))*sqrt(pow((LDX-LTX),2)+pow((LDY-LTY),2));
  }
 
  /////////////////////////////////////////////////
  void FindPerimeter() //и периметр
  {
    Perimeter=(sqrt(pow((RTX-LTX),2)+pow((RTY-LTY),2))+sqrt(pow((LDX-LTX),2)+pow((LDY-LTY),2)))*2;
  }
};
 
////////////////////КВАДРАТ//////////////////////
class Quadrate: public Rectangle //квадрат
{
  public:
  float side; //сторона
  Quadrate(float KLTX, float KLTY, float Side) //конструктор
  {
    Rectangle();//вызываем конструктор супер-класса
    type=3; //указываем тип
    side=Side; //копируем параметры
    LTX=KLTX;
    LTY=KLTY;
    RDX=KLTX+Side; //и вычисляем недостающие
    RDY=KLTY-Side;
    LDX=LTX;
    LDY=RDY;
    RTX=RDX;
    RTY=LTY;
    CenterX=(RDX-LDX)/2.0+LDX; //вычисляем центр
    CenterY=(LTY-LDY)/2.0+LDY;
  }
 
  /////////////////////////////////////////////////
  void Resize(float X)
  {
    float XP=cos(Angle)*X*1.0;
    float YP=sin(Angle)*X*1.0;
    LTX-=(XP/2.0);
    LDX-=(XP/2.0);
    RTX+=(XP/2.0);
    RDX+=(XP/2.0);
    LTY+=(YP/2.0);
    RTY-=(YP/2.0);
    LDY+=(YP/2.0);
    RDY-=(YP/2.0);
    float XQ=sin(Angle)*X*1.0;
    float YQ=cos(Angle)*X*1.0;
    LTX+=(XQ/2.0);
    LDX-=(XQ/2.0);
    RTX+=(XQ/2.0);
    RDX-=(XQ/2.0);
    LTY+=(YQ/2.0);
    RTY+=(YQ/2.0);
    LDY-=(YQ/2.0);
    RDY-=(YQ/2.0);
    side+=X;
  }
 
  /////////////////////////////////////////////////
  void Rotate(float Kangle)
  {
    float angle=-Kangle*3.14/180;
    float KLTX=LTX;
    float KLTY=LTY;
    float KLDX=LDX;
    float KLDY=LDY;
    float KRTX=RTX;
    float KRTY=RTY;
    float KRDX=RDX;
    float KRDY=RDY;
    LTX = CenterX+ (KLTX-CenterX) * cos(angle) - (KLTY-CenterY) * sin(angle);
    LTY = CenterY+ (KLTX-CenterX) * sin(angle) + (KLTY-CenterY) * cos(angle);
    RTX = CenterX+ (KRTX-CenterX) * cos(angle) - (KRTY-CenterY) * sin(angle);
    RTY = CenterY+ (KRTX-CenterX) * sin(angle) + (KRTY-CenterY) * cos(angle);
    LDX = CenterX+ (KLDX-CenterX) * cos(angle) - (KLDY-CenterY) * sin(angle);
    LDY = CenterY+ (KLDX-CenterX) * sin(angle) + (KLDY-CenterY) * cos(angle);
    RDX = CenterX+ (KRDX-CenterX) * cos(angle) - (KRDY-CenterY) * sin(angle);
    RDY = CenterY+ (KRDX-CenterX) * sin(angle) + (KRDY-CenterY) * cos(angle);
    Angle-=angle;
  }
 
  /////////////////////////////////////////////////
  void FindSquare()
  {
    Square=side*side;
  }
 
  /////////////////////////////////////////////////
  void FindPerimeter()
  {
    Perimeter=side*4;
  }
};
 
////////////////////КРУГ/////////////////////////
class Circle: public Shape //круг
{
  public:
  float Radius; //радиус
  /////////////////////////////////////////////////
  Circle(float KRadius, float KCenterX, float KCenterY) //конструктор
  {
    type=1; //задаём тип
    Radius=KRadius; //копируем параметры
    CenterX=KCenterX;
    CenterY=KCenterY;
  }
 
  /////////////////////////////////////////////////
  void Move(float X, float Y) //сдвинуть круг = сдвинуть центр
  {
    CenterX+=X;
 
    CenterY+=Y;
  }
 
  /////////////////////////////////////////////////
  void Rotate(float Kangle) {}; //вращение круга не влияет на параметры
 
  /////////////////////////////////////////////////
  void Resize(float X, float Y) //увеличить радиус; второй параметр записан в
  //виртуальной функции - значит он должен быть и здесь, т.к. это не перегрузка функции
  {
  Radius+=X;
  }
 
  /////////////////////////////////////////////////
  void FindSquare()
  {
  Square=M_PI*Radius*Radius;
  }
 
  /////////////////////////////////////////////////
  void FindPerimeter()
  {
  Perimeter=M_PI*Radius*2;
  }
 
};
 
 
int main(){
 
  system("chcp 1251");
  vector < Shape* > Shapes; //массив фигур  //Вектор <тип с которым будет работать> название
  while(1) //выполнять меню до выхода из программы
  {
  cout<<"Введите номер команды и нажмите Enter." << endl << "1. Выбрать фигуру" << endl << "2. Создать фигуру" << endl << "3. Выход" << endl;
  int task;
  cin>>task;
  if (task==3)
  {
    break;
  }
 
  else if (task==1)
  {
    if (Shapes.size()>0)
  {
    while (1)
    {
      for (int i=0; i<Shapes.size(); i++)
      {
        cout<<(i+1)<<". ";
        if (Shapes[i]->type==1)
        {
          Circle *Temp=dynamic_cast<Circle*>(Shapes[i]); //приведение к типу круга
          cout<<"Круг - Радиус="<<Temp->Radius<<" Центр "<<Temp->CenterX<<"; "<<Temp->CenterY<<"; "<<endl;
        }
        else if (Shapes[i]->type==2)
        {
          Rectangle *Temp=dynamic_cast<Rectangle*>(Shapes[i]); //приведение к типу прямоугольника
          cout<<"Прямоугольник - Левый Верхний Угол "<<Temp->LTX<<"; "<<Temp->LTY<<"; Правый нижний угол "<<Temp->RDX<<"; "<<Temp->RDY<<";"<<endl;
        }
        else if (Shapes[i]->type==3)
        {
          Quadrate *Temp=dynamic_cast<Quadrate*>(Shapes[i]); //приведение к типу квадрата
          cout<<"Квадрат - Левый Верхний Угол "<<Temp->LTX<<"; "<<Temp->LTY<<"; Сторона "<<Temp->side<<";"<<endl;
        }
      }
      cout<<(Shapes.size()+1)<<". В главное меню"<<endl;
      cout<<"Введите номер фигуры"<<endl;
      int fnum;
      cin>>fnum; fnum--;
      if (fnum>Shapes.size()-1) break;
      if (Shapes[fnum]->type==1)
      {
        Circle *Temp=dynamic_cast<Circle*>(Shapes[fnum]);
        Temp->FindSquare();
        Temp->FindPerimeter();
        cout<<"Круг:Информация"<<endl<<"Радиус="<<Temp->Radius<<";"<<endl<<"Центр: "<<Temp->CenterX<<"; "<<Temp->CenterY<<"; "<<endl<<"Площадь="<<Temp->Square<<";"<<endl<<"Периметр="<<Temp->Perimeter<<";"<<endl;
      }
      else if (Shapes[fnum]->type==2)
      {
        Rectangle *Temp=dynamic_cast<Rectangle*>(Shapes[fnum]);
        Temp->FindSquare();
        Temp->FindPerimeter();
        cout<<"Прямоугольник:Информация"<<endl<<"Левый Верхний Угол:"<<Temp->LTX<<"; "<<Temp->LTY<<";"<<endl<<"Правый верхний угол "<<Temp->RTX<<"; "<<Temp->RTY<<";"<<endl<<"Левый нижний Угол:"<<Temp->LDX<<"; "<<Temp->LDY<<";"<<endl<<"Правый нижний угол "<<Temp->RDX<<"; "<<Temp->RDY<<";"<<endl<<"Площадь="<<Temp->Square<<";"<<endl<<"Периметр="<<Temp->Perimeter<<";"<<endl;
      }
      else if (Shapes[fnum]->type==3)
      {
        Quadrate *Temp=dynamic_cast<Quadrate*>(Shapes[fnum]);
        Temp->FindSquare();
        Temp->FindPerimeter();
        //float sd=sqrt(pow(Temp->LTX-Temp->RTX,2)+pow(Temp->LTY-Temp->RTY,2));
        cout<<"Квадрат:Информация"<<endl<<"Сторона="<<Temp->side<<";"<<endl<<"Левый Верхний Угол:"<<Temp->LTX<<"; "<<Temp->LTY<<";"<<endl<<"Правый верхний угол "<<Temp->RTX<<"; "<<Temp->RTY<<";"<<endl<<"Левый нижний Угол:"<<Temp->LDX<<"; "<<Temp->LDY<<";"<<endl<<"Правый нижний угол "<<Temp->RDX<<"; "<<Temp->RDY<<";"<<endl<<"Площадь="<<Temp->Square<<";"<<endl<<"Периметр="<<Temp->Perimeter<<";"<<endl;
      }
      cout<<"Введите номер команды и нажмите Enter"<<endl;
      cout<<"1. Изменить размер"<<endl<<"2. Сдвинуть"<<endl<<"3. Повернуть на угол"<<endl<<"4. Выйти в меню"<<endl;
      int item2;
      cin>>item2;
      if (item2==1)
      {
        if (Shapes[fnum]->type==1)
        {
          cout<<"Введите число, на которое нужно увеличить радиус"<<endl;
          float r;
          cin>>r;
          Circle *Temp=dynamic_cast<Circle*>(Shapes[fnum]);
          Temp->Resize(r,0);
        }
        if (Shapes[fnum]->type==2)
        {
          cout<<"Введите через пробел увеличение длины и ширины прямоугольника"<<endl;
          float x,y;
          cin>>x>>y;
          Rectangle *Temp=dynamic_cast<Rectangle*>(Shapes[fnum]);
          Temp->Resize(x,y);
        }
        if (Shapes[fnum]->type==3)
        {
          cout<<"Введите увеличение стороны квадрата"<<endl;
          float x;
          cin>>x;
          Quadrate *Temp=dynamic_cast<Quadrate*>(Shapes[fnum]);
          Temp->Resize(x);
        }
      }
      else if (item2==2)
      {
        cout<<"Введите через пробел сдвиг по оси X, по оси Y"<<endl;
        float x,y;
        cin>>x>>y;
        if (Shapes[fnum]->type==1)
        {
          Circle *Temp=dynamic_cast<Circle*>(Shapes[fnum]);
          Temp->Move(x,y);
        }
        else if (Shapes[fnum]->type==2)
        {
          Rectangle *Temp=dynamic_cast<Rectangle*>(Shapes[fnum]);
          Temp->Move(x,y);
        }
        else if (Shapes[fnum]->type==3)
        {
          Quadrate *Temp=dynamic_cast<Quadrate*>(Shapes[fnum]);
          Temp->Move(x,y);
        }
      }
      else if (item2==3)
      {
        if (Shapes[fnum]->type==1)
        {
          cout<<"Круг вращается, вращается..."<<endl;
        }
        else if (Shapes[fnum]->type==2)
        {
          cout<<"Введите угол поворота по часовой стрелке (в градусах)"<<endl;
          float ang;
          cin>>ang;
          Rectangle *Temp=dynamic_cast<Rectangle*>(Shapes[fnum]);
          Temp->Rotate(ang);
        }
        else if (Shapes[fnum]->type==3)
        {
          cout<<"Введите угол поворота по часовой стрелке (в градусах)"<<endl;
          float ang;
          cin>>ang;
          Quadrate *Temp=dynamic_cast<Quadrate*>(Shapes[fnum]);
          Temp->Rotate(ang);
        }
      }
      else {break;}
    }
  }
  else
  {
    cout<<"На плоскости пока нет ни одной фигуры."<<endl;
  }
}
 
 
else if (task==2)
{
  cout<<"Введите 1, чтобы создать круг; 2, чтобы создать прямоугольник; 3, чтобы создать квадрат"<<endl;
  int item1;
  cin>>item1;
  if (item1==1)
  {
    cout<<"Введите через пробел радиус и две координаты центра"<<endl;
    float r,cx,cy;
    cin>>r>>cx>>cy;
    Shapes.push_back(new Circle(r,cx,cy));
  }
  if (item1==2)
  {
    cout<<"Введите через пробел две координаты левого верхнего угла, затем две координаты правого нижнего угла"<<endl;
    float lx,ly,rx,ry;
    cin>>lx>>ly>>rx>>ry;
    Shapes.push_back(new Rectangle(lx,ly,rx,ry));
  }
  if (item1==3)
  {
    cout<<"Введите через пробел две координаты левого верхнего угла, затем сторону квадрата"<<endl;
    float lx,ly,sd;
    cin>>lx>>ly>>sd;
    Shapes.push_back(new Quadrate(lx,ly,sd));
    Shapes[Shapes.size()-1]->type=3;
  }
}
 
 
}
system("PAUSE");
Shapes.clear();
cout << "Hello"<<endl;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2020, 06:58
Ответы с готовыми решениями:

Построить систему классов для описания плоских геометрических фигур
C++ Построить систему классов для описания плоских геометрических фигур: круга, квадрата,...

Построить систему классов для описания плоских геометрических фигур
Здравствуйте. Прошу помощи) Вот сама задача Построить систему классов для описания плоских...

Построить систему классов для описания плоских геометрических фигур
Построить систему классов для описания плоских геометрических фигур: круга, квадрата,...

Разработать библиотеку математических функций для вычисления площадей плоских геометрических фигур
Разработать библиотеку математических функций для вычисления площадей плоских геометрических фигур...

1
6745 / 4540 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
Записей в блоге: 1
12.02.2020, 09:47 2
Цитата Сообщение от Cyber_Dezz Посмотреть сообщение
Помогите пожалуйста составить по данной программе многофайловую систему,а то у меня не получается реализовать
корректную работу отдельных модулей с заголовочным файлом и исходным кодом.
Для начала создай файл Shapes.h и перенеси в него классы Shape и Rectangle.
Потом создай файл Rectangle.cpp и перенечи в него реализацию всех методов класса Rectangle.
Rectangle.cpp
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
#include "Shapes.h"
 
  Rectangle::Rectangle(float KLTX, float KLTY, float KRDX, float KRDY) //конструктор
  {
    type=2; //задаём тип фигуры
    LTX=KLTX; //копируем координаты
    LTY=KLTY;
    RDX=KRDX;
    RDY=KRDY;
    LDX=LTX;
    LDY=RDY;
    RTX=RDX;
    RTY=LTY;
    CenterX=(RDX-LDX)/2.0+LDX; //находим координаты центра
    CenterY=(LTY-LDY)/2.0+LDY;
  }
 
  /////////////////////////////////////////////////
  void Rectangle::Move(float X, float Y) //переместить на X, Y
  {
    //просто сдвинем все координаты
    LTX+=X;
    LTY+=Y;
    LDX+=X;
    LDY+=Y;
    RDX+=X;
    RDY+=Y;
    RTX+=X;
    RTY+=Y;
    CenterX+=X;
    CenterY+=Y;
  }
 
.......................
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2020, 09:47

Построить классы для описания плоских фигур:круг,квадрат,прямоугольник
Построить классы для описания плоских фигур:круг,квадрат,прямоугольник.Включить методы для...

Разработать программу «Вычислитель площадей», позволяющую вычислять площадь плоских геометрических фигур
Разработать программу «Вычислитель площадей», позволяющую вычислять площадь плоских геометрических...

Построить систему классов для описания плоских геометрических фигур
ПОЖАЛУЙСТА ПОМОГИТЕ ИСПРАВИТЬ ПРОГРАММУ НА ПАСКАЛЕ!!!!! Var a of Real;...

Построить систему классов для описания плоских геометрических фигур
Ребята смотрите дана така задача: Построить систему классов для описания плоских геометрических...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru