You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
3.9 KiB
174 lines
3.9 KiB
3 years ago
|
#include <iostream>
|
||
|
#include <math.h>
|
||
|
|
||
|
#ifndef M_PI
|
||
|
#define M_PI (3.14159265358979323846)
|
||
|
#endif
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
enum BOOL { FALSE, TRUE };
|
||
|
|
||
|
class GeneralShape {
|
||
|
public:
|
||
|
GeneralShape(){};
|
||
|
~GeneralShape(){};
|
||
|
virtual long GetArea() = 0;
|
||
|
virtual long GetPerim()= 0;
|
||
|
virtual void Draw() = 0;
|
||
|
};
|
||
|
|
||
|
void GeneralShape::Draw() {
|
||
|
cout << "drawing mechanism!" << endl;
|
||
|
}
|
||
|
|
||
|
class Circle : public GeneralShape {
|
||
|
public:
|
||
|
Circle(int radius):itsRadius(radius), itsCircumference(2*M_PI*radius){}
|
||
|
~Circle(){}
|
||
|
virtual long GetArea();
|
||
|
virtual long GetPerim();
|
||
|
virtual void Draw();
|
||
|
|
||
|
private:
|
||
|
int itsRadius;
|
||
|
int itsCircumference;
|
||
|
};
|
||
|
|
||
|
long Circle::GetArea() {
|
||
|
return M_PI * itsRadius * itsRadius;
|
||
|
}
|
||
|
|
||
|
long Circle::GetPerim() {
|
||
|
return itsCircumference;
|
||
|
}
|
||
|
|
||
|
void Circle::Draw() {
|
||
|
cout << "Drawing circle with r=" << itsRadius << ", area=" << GetArea() << ", perim=" << GetPerim() << endl;
|
||
|
}
|
||
|
|
||
|
class Rectangle : public GeneralShape {
|
||
|
public:
|
||
|
Rectangle(int len, int width):
|
||
|
itsLength(len), itsWidth(width){}
|
||
|
~Rectangle(){}
|
||
|
virtual int GetLength() { return itsLength; }
|
||
|
virtual int GetWidth() { return itsWidth; }
|
||
|
virtual long GetArea();
|
||
|
virtual long GetPerim();
|
||
|
virtual void Draw();
|
||
|
|
||
|
private:
|
||
|
int itsWidth;
|
||
|
int itsLength;
|
||
|
};
|
||
|
|
||
|
long Rectangle::GetArea() {
|
||
|
return itsLength * itsWidth;
|
||
|
}
|
||
|
|
||
|
long Rectangle::GetPerim() {
|
||
|
return (itsLength + itsWidth) * 2;
|
||
|
}
|
||
|
|
||
|
void Rectangle::Draw() {
|
||
|
cout << "Drawing rectangle with W=" << itsWidth << ", H=" << itsLength << ", area=" << GetArea() << ", perim=" << GetPerim() << endl;
|
||
|
}
|
||
|
|
||
|
class Square : public Rectangle {
|
||
|
public:
|
||
|
Square(int len);
|
||
|
Square(int len, int width);
|
||
|
~Square(){}
|
||
|
long GetPerim() {return 4 * GetLength();}
|
||
|
virtual void Draw();
|
||
|
};
|
||
|
|
||
|
Square::Square(int len): Rectangle(len,len) {}
|
||
|
|
||
|
Square::Square(int len, int width): Rectangle(len,width) {
|
||
|
if (GetLength() != GetWidth()) {
|
||
|
cout << "Error, not a square... a Rectangle??\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Square::Draw() {
|
||
|
cout << "Drawing square with L=" << GetLength() << ", area=" << GetArea() << ", perim=" << GetPerim() << endl;
|
||
|
}
|
||
|
|
||
|
void shapeMenu(GeneralShape& shape) {
|
||
|
bool stop {false};
|
||
|
int choice {};
|
||
|
while (1) {
|
||
|
cout << "(1)Draw (2)Get Perimeter (3)Get Area (0)Back: ";
|
||
|
cin >> choice;
|
||
|
switch (choice) {
|
||
|
case 1:
|
||
|
shape.Draw();
|
||
|
break;
|
||
|
case 2:
|
||
|
cout << shape.GetPerim() << endl;
|
||
|
break;
|
||
|
case 3:
|
||
|
cout << shape.GetArea() << endl;
|
||
|
break;
|
||
|
default:
|
||
|
stop = true;
|
||
|
}
|
||
|
if (stop) break;
|
||
|
cout << endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void circleMenu() {
|
||
|
int radius;
|
||
|
cout << "Radius? ";
|
||
|
cin >> radius;
|
||
|
Circle c {radius};
|
||
|
shapeMenu(c);
|
||
|
}
|
||
|
|
||
|
void rectMenu() {
|
||
|
int width, height;
|
||
|
cout << "Width? ";
|
||
|
cin >> width;
|
||
|
cout << "Height? ";
|
||
|
cin >> height;
|
||
|
Rectangle r {height, width};
|
||
|
shapeMenu(r);
|
||
|
}
|
||
|
|
||
|
void squareMenu() {
|
||
|
int length;
|
||
|
cout << "Side Length? ";
|
||
|
cin >> length;
|
||
|
Square s {length};
|
||
|
shapeMenu(s);
|
||
|
}
|
||
|
|
||
|
int main() {
|
||
|
int choice;
|
||
|
BOOL quit = FALSE;
|
||
|
GeneralShape *sp;
|
||
|
while (1) {
|
||
|
cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: ";
|
||
|
cin >> choice;
|
||
|
switch (choice) {
|
||
|
case 1:
|
||
|
circleMenu();
|
||
|
break;
|
||
|
case 2:
|
||
|
rectMenu();
|
||
|
break;
|
||
|
case 3:
|
||
|
squareMenu();
|
||
|
break;
|
||
|
default: quit = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
if (quit) break;
|
||
|
cout << endl;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|