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.
173 lines
3.9 KiB
173 lines
3.9 KiB
#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; |
|
}
|
|
|